sshdを固める

鍵を用意しただけでは、入口は閉じていない

前の回で deploy は鍵で入れるようになりました。ただし、この時点でパスワードでのログインも root での直接ログインも、まだ有効なままです。強い鍵を作っても、隣に緩い扉が開いていれば意味がありません。

塞ぐ場所は1つのファイルです。

vi /etc/ssh/sshd_config

名前が紛らわしいので先に整理します。ssh_configこちらから出ていくときの設定、sshd_config向こうから入られるときの設定です。末尾の d はデーモンの d でした。締めるのは sshd_config のほうです。

締める行は2つ

PermitRootLogin no PasswordAuthentication no

1つ目は、root で直接入るのを禁じます。root は何でもできるうえ、名前が全世界で共通なので、真っ先に狙われます。まず deploy で入り、必要なときだけ権限を上げる。この形にしておけば、狙われる名前がひとつ減ります。

2つ目は、パスワードでのログインそのものを止めます。総当たりが通る余地が消えるので、効きがいちばん大きい1行です。これを入れる前に、鍵で入れることを必ず確かめておいてください。順番を逆にすると自分が入れなくなります。

既定のファイルでは、この2行が # で始まるコメントとして書かれていることがあります。その場合は # を外して値を書き換えます。コメントのまま値だけ直しても効きません。

反映の前に文法を見る

設定を書き換えたら、nginx のときと同じことをします。

sshd -t

何も出なければ問題なしです。誤りがあれば行番号付きで教えてくれます。これを飛ばして再起動すると、sshd が立ち上がれず、そのサーバーに二度と入れなくなります。nginx なら最悪サイトが止まるだけですが、こちらは復旧する手段まで失います。手を抜けない一手です。

いま入っている接続は切れない

systemctl restart ssh

再起動しても、すでに繋がっている接続は切れません。切り替わるのはこれから来る接続だけです。これを利用して、次の手順を守ります。

  1. いまの接続はそのまま開けておく
  2. 別の窓を新しく開いて、鍵で入れるか試す
  3. 入れたと確かめてから、最初の接続を閉じる

入れなくなっていた場合、最初の接続が生きていれば設定を戻せます。閉じてしまうと戻せません。締める作業では必ずこの順番を踏んでください。

いま効いている値を確かめる

ファイルに書いた内容と、実際に効いている値は別物です。書き間違いや、あとの行での上書きがあり得ます。sshd 自身に聞くのが確実です。

sshd -T | grep -i permitrootlogin # permitrootlogin no

-T は、すべての設定項目を解決した結果を並べて出す指定です。nginx の nginx -T と同じ発想で、思い込みではなく実際の値を見られます。

手を動かす

root での直接ログインとパスワードでのログインを止め、文法を確かめてから反映します。deploy が鍵で入れる状態が保たれていることも確かめます。

ヒント

  • 1. /etc/ssh/sshd_config の PermitRootLogin を no にする
  • 2. PasswordAuthentication を no にする。# が付いていたら外す
  • 3. sshd -t で文法を確かめる
  • 4. systemctl restart ssh で反映する
  • 5. sshd -T > /root/sshd-effective.txt を保存し、効いている値を読む

8 項目で採点します