Help us understand the problem. What is going on with this article?

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

renny1398
7月よりインターネットメディア会社で勤務中。最近職場ではCodeIgniter3やMySQL、jQuery、Bootstrapなどを触っています。プライベートではC++、Python、Ruby(主にon Rails)なども。GoやRustにも興味あり。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away