Edited at

root での SSH リモートログインを禁止し、一般ユーザでの公開鍵認証のみ許可する

More than 1 year has passed since last update.

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 にする。


/etc/ssh/sshd_config

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 にする。


/etc/ssh/sshd_config

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接続(きほん)