まくろぐ
更新: / 作成:

これは何?

SSH をできるだけ安全に使うための sshd(OpenSSH サーバー)の設定方法です。

sshd の設定は、/etc/ssh/sshd_config ファイルで行います。 sudo などで設定ファイルを編集後、sshd サービスにリロード要求することで反映できます。

典型的な sshd の設定変更手順
$ sudo vim /etc/ssh/sshd_config  # エディタで設定を変更
$ sudo systemctl reload ssh      # sshd を再起動

sshd の再起動や設定のリロードを行っても、作業中の SSH 接続が切れることはありません。 設定変更後は、別のターミナルから接続できることを確認してから、作業用の SSH 接続をクローズするようにしましょう。

root ユーザーでの接続を拒否する (PermitRootLogin)

PermitRootLoginno に設定することで、このサーバーには root ユーザーで SSH 接続することができなくなります(ssh root@example.com できなくなる)。

/etc/ssh/sshd_config
PermitRootLogin no

管理者権限での作業が必要な場合は、一般ユーザーでの接続後に sudo 実行することになります。 root ユーザーで直接 SSH 接続できるようになっていると、悪意のあるユーザーによるパスワード総当たり攻撃を許してしまうことになります。 後述の PasswordAuthentication 設定でパスワードによる認証を拒否している場合でも、root ユーザーでの直接接続は避けるべきです。 なぜなら、いきなり root ユーザーで接続してしまうと、実際に誰が root 接続して作業したのかをログから判別できなくなってしまうからです。 一般ユーザーでログインして sudo することを強制しておけば、誰が管理者権限でコマンド実行したのかをログから確認することができます (sudo grep COMMAND /var/log/auth.log)。

PermitRootLogin には下記のような値を設定できます。

PermitRootLogin の値パスワードで root 接続SSH キーで root 接続
yes
no--
prohibit-password (default)-
forced-commands-only-
キーに command 指定が必要

PermitRootLogin のデフォルト値は prohibit-password になっており、SSH キーを利用したログインのみが許可されています。 レンタルサーバー (VPS) などでは、ユーザーに初期設定してもらう都合上、PermitRootLoginyes になっていたりするので要注意です。

接続可能なユーザーを制限する (AllowUsers)

デフォルトではすべてのユーザー名で SSH 接続できるようになっていますが、SSH 接続するユーザーがあらかじめわかっている場合は、AllowUsers でユーザー名を列挙しておきます。

/etc/ssh/sshd_config
AllowUsers  maku ansible backup

複数のユーザー ID を指定する場合は、上記のようにスペース区切りで列挙します。 この例では、makuansiblebackup というユーザー名のみで SSH 接続を許可しています。

最大トライ数を減らす (MaxAuthTries)

MaxAuthTries は、SSH クライアントからの接続が何回失敗したら、リトライを打ち切るかを指定します。

/etc/ssh/sshd_config
MaxAuthTries 1

例えば、上記のように 1 を指定しておくと、パスワード入力に 1 度でも失敗すると接続拒否されるようになります(リトライのプロンプトが表示されません)。

$ ssh maku@examle.com
maku@example.com's password: (間違ったパスワードを入力する)
Received disconnect from xxxx:xxxx:xxxx:xxx:xxx:xxx:xx:xx port 22:2: Too many authentication failures

MaxAuthTries のデフォルト値は 6 ですが、SSH クライアント側の設定 (/etc/ssh/ssh_config) の NumberOfPasswordPrompts がデフォルトで 3 になっているため、通常はパスワード入力を 3 回失敗すると ssh コマンドは終了します。

ポート番号を 22 以外に変更する (Port)

当然ですが sshd が攻撃対象にされる場合は、22 番ポートが真っ先に狙われます。 次のように、sshd のポート番号を変更することで、攻撃対象から外されやすくなります。

/etc/ssh/sshd_config
Port 1943

sshd のポート番号を変更した場合は、ファイアウォール(パケットフィルタ)の設定も忘れずに変更しておく必要があります。

設定変更後は、ssh コマンド(および内部的に ssh を利用するコマンド)を実行する際に、明示的なポート番号の指定が必要になります。

$ ssh -p 1943 maku@example.com

あるいは、特定のホストに SSH 接続するときのポート番号を設定ファイルで指定しておくこともできます。

~/.ssh/config
Host example.com
    HostName examle.com
    Port 1943

いずれにしても、ポート番号を変更するといろいろなコマンドの使い勝手が悪くなるので、この設定は余裕があればやっておけばよいと思います。 10022 や 20022 など、末尾のポート番号を 22 にしておくと分かりやすいのですが、これではポート番号を変更する効果がほとんどないので、変更するなら特定しにくいポート番号にすべきです。

ログイン成功までの猶予期間を短くする (LoginGraceTime)

LoginGraceTime は、ssh コマンドを実行してからログインするまでの猶予時間です。

/etc/ssh/sshd_config
LoginGraceTime 15s

典型的にはパスワード入力に成功するまでの猶予期間です。 デフォルトは 2m(120 秒)ですが、もう少し短くしてもよさそうです。 上記の例では 15s と設定しているので、15 秒以内にログインに成功しないと、正しいパスワードで接続しようとしても接続拒否されます。

$ ssh maku@examle.com
maku@example.com's password: (15 秒以内に認証しないと拒否される)
Connection closed by xxxx:xxxx:xxxx:xxx:xxx:xxx:xx:xx port 22

ちなみに LoginGraceTime を 0 に設定するとタイムアウトしなくなりますが、そのような設定はすべきではありません。

パスワード認証を無効にする (PasswordAuthentication, ChallengeResponseAuthentication)

SSH キーによる接続設定 が終わったら、パスワードによる接続を無効にするとより安全になります。

/etc/ssh/sshd_config
PasswordAuthentication no           # パスワードによる接続を拒否
ChallengeResponseAuthentication no  # これもパスワード認証の一貫なので拒否
PubkeyAuthentication yes  # これはデフォルトで yes なのでそのままでも OK

SSH 公開鍵の登録をする前にこの設定をしてしまうと、その後 SSH 接続できなくなってしまうので、設定変更後は別のターミナルで SSH 接続できることを確認してから、設定用のターミナルを閉じてください。 万が一、SSH 接続できなくなってしまった場合は、サーバーに直接モニタとキーボードを繋いで設定するか、VPS であれば管理用の Web コンソールなどから設定し直す必要があります。

関連記事

まくろぐ
サイトマップまくへのメッセージ