VPS への Ubuntu Server インストール時にユーザを作成しなかったため、SSH 接続時のログインユーザとして試しに root を使ってみたらログインできてしまった。
外部から root ユーザでログインされてしまうと大変危険なので、sshd の設定を変更し、root でリモートログインできないようにする。
また、パスワードが平文で流れるのを防ぐため、パスワード認証を不可にし、公開鍵認証のみ許可するようにする。
作業内容
1. root ユーザでのリモートログインを禁止する
一般ユーザの作成(SSH ログイン時に使用)
例として foo ユーザを作成する。
# adduser foo
Adding user `foo' ...
Adding new group `foo' (1000) ...
Adding new user `foo' (1000) with group `foo' ...
Creating home directory `/home/foo' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for foo
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y
foo ユーザが sudo を使えるようにする。
# gpasswd -a foo sudo
Adding user foo to group sudo
一旦ログアウトし、foo ユーザで SSH ログイン可能であることを確認。
$ ssh foo@example.com
foo@example.com's password:
Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-21-generic x86_64)
...
sshd の設定変更
設定ファイルのバックアップをとる。
# cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.org
/etc/ssh/sshd_config を開き、PermitRootLogin を no にする。
PermitRootLogin no
sshd -t
で構文チェック後、設定を反映する。
# /etc/init.d/ssh restart
[ ok ] Restarting ssh (via systemctl): ssh.service.
root ユーザで SSH 接続しようとしてもエラーとなることを確認。
$ ssh root@example.com
root@example.com's password:
Permission denied, please try again.
2 SSH 公開鍵認証設定
鍵の生成
クライアント側で SSH の秘密鍵と公開鍵を生成する。
$ ssh-keygen -t rsa
.ssh フォルダの作成
サーバのログインユーザのホームディレクトリに .ssh フォルダを作成する。
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
SSH 公開鍵の登録
クライアントからサーバへ SSH 公開鍵を転送する。
$ scp ~/.ssh/id_rsa.pub foo@example.com:~/.ssh/authorized_keys
転送した公開鍵のパーミッションを変更しておく。
$ chmod 600 ~/.ssh/authorized_keys
パスワード認証の禁止設定
/etc/ssh/sshd_config を開き、PasswordAuthentication を no にする。
PasswordAuthentication no
設定を反映する。
# /etc/init.d/ssh restart
設定確認
新しいシェルで SSH 接続し、公開鍵認証が有効であることを確認。
$ ssh foo@example.com
Enter passphrase for key '/Users/foobar/.ssh/id_rsa':
Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-21-generic x86_64)
...
パスワード認証が使えず、公開鍵認証を強制されることを確認。
$ ssh bar@example.com
bar@example.com: Permission denied (publickey).
これで秘密鍵を持たないクライアントからの SSH 接続は不可となった。
万が一 PC が壊れた等で秘密鍵を紛失し、SSH ログインできなくなってしまっても、VPS を使用しているなら通常コンソールからパスワードでログインできるので、SSH パスワード認証を無効にしても問題ないと思う。
その他
SSH のポート番号を変更すれば、もう少し攻撃に強くなるかもしれない。
ポート監視をして想定以上に攻撃があれば対応するかも。
(3/16追記)
いくつかのサイトに「22番ポートはブルートフォース攻撃を受けやすいのでポート番号を変えるべき」という記載があったので、ポート番号を変えました。
参考サイト
ubuntu ユーザを追加して sudo 権限をつける
rootでのSSHログインを禁止 - SSHサーバーの設定
公開鍵暗号を用いてのSSH接続(きほん)