締め出されずに SSH のパスワード認証を無効にする

鍵のみは、公開された SSH サーバーに対してできる最強の単一変更です。安全な手順の順序、実際に効く設定行、そしてそれが解決しないこと。

約 7 分で読めます

なぜこれが最も価値の高い変更なのか

インターネットに面した Linux サーバーの侵害は、ほぼすべてが有効なパスワードから始まります——推測されたもの、他人の漏洩から使い回されたもの、フィッシングで奪われたもの。パスワード認証を無効にすれば、この分類全体が成立しなくなります。難しくなるのではなく、不可能になります。推測すべきパスワードが存在しないからです。

堅牢化リストの他のどの項目も、労力に対する見返りでこれに並びません。設定 2 行とリロード 1 回です。

先延ばしにされるのは、間違えるのが怖いからで、その懸念は本物です。順序を誤れば、SSH でしか到達できないマシンから自分を切断します。このガイドの残りは、まさにその順序です。

安全な手順

以下の各段階は次に進む前に検証され、いま入っているセッションは最後まで開いたままにします。最後の最後まで閉じないでください。

まず、鍵がなければ生成します。Ed25519 が現在の既定です。短く、速く、4096 ビットの RSA 鍵と少なくとも同等の強度があります。

bash
# 1. サーバー上ではなく、自分のマシンで
ssh-keygen -t ed25519 -C "you@example.com"

# 2. 公開鍵をサーバーへコピー(最後に一度だけパスワードを聞かれます)
ssh-copy-id user@server

# 3. 1 本目を閉じずに、「2 本目」の端末から検証する
ssh -o PreferredAuthentications=publickey -o PasswordAuthentication=no user@server

実際に効く設定

手順 3 が成功してから初めて、サーバーの設定を編集します。現代のディストリビューションでは編集すべきファイルが sshd_config 自体とは限りません。多くが /etc/ssh/sshd_config.d/ ディレクトリを備えており、そこのファイルが読み込まれて、上に書いた内容を上書きしうるからです。

効くのは 4 つの設定です:

bash
# /etc/ssh/sshd_config.d/10-hardening.conf  (または sshd_config を直接)
PasswordAuthentication no
KbdInteractiveAuthentication no    # 旧名:ChallengeResponseAuthentication
PermitRootLogin prohibit-password  # root が直接ログインしないなら 'no'
PubkeyAuthentication yes

# リロード前に必ず設定を検査する。sshd がまったく起動しなくなるような
# 打ち間違いを、ここで捕まえられます:
sudo sshd -t

# その後 restart ではなく reload:既存セッションは生き残ります
sudo systemctl reload ssh    # RHEL 系では 'sshd'

効いたことを検証する

設定ファイルを信用せず、sshd に実際どう解決されたかを尋ねてください。sshd -T はすべての include と上書きを経た実効設定を表示します:

bash
sudo sshd -T | grep -iE 'passwordauthentication|kbdinteractiveauthentication|permitrootlogin'
# 期待される出力:
#   passwordauthentication no
#   kbdinteractiveauthentication no
#   permitrootlogin prohibit-password

# そして外部から証明する:これは拒否されなければなりません
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password user@server

これが解決しないこと

鍵のみは推測のリスクを取り除きます。トラフィックも、あらゆる侵入経路も取り除きません。

ボットは接続を続けます。あなたの設定を知らないので、パスワードを提示し続け、拒否され続けます——1 回ごとに TCP 接続、sshd のフォーク、ログ 1 行を消費したままです。認証ログは相変わらずノイズで埋まり、必要だった 1 件は相変わらず失われていきます。送信元を遮断する何かは、やはり必要です。

そして秘密鍵はファイルです。盗まれたノート PC の上に、誤ってコミットされたリポジトリの中に、CI ランナーの環境に。鍵はパスフレーズで保護し、共有マシンには置かず、誰かが去ったら更新してください——漏れた鍵は、漏れたパスワードとまったく同じ悪さをします。

またこれは、パッチの当たっていない sshd、別ポートで公開されたサービス、同じホスト上の脆弱なアプリケーションには何もしません。利用できる最良の単一変更であり、同時に複数ある対策の 1 つです。

対になるもう半分

パスワードを切ったあとに残るのは量です。SSH Protector は同じ認証ストリームを読み、届き続ける送信元を遮断し——サブネット単位で、恒久的に、起動時に復元して——何かを遮断する前にあなた自身のアドレスをホワイトリストに登録します。

22 を前提とせず sshd の設定から実際の SSH ポートを検出するので、すでに移設済みのサーバーも設定なしで保護されます。

リスクには鍵のみを。負荷には送信元の遮断を——そして、たった 1 件の重要な出来事に気づけるだけの読めるログを。

FAQ

SSH のパスワード認証を安全に無効にするには?
鍵を生成し、ssh-copy-id でコピーし、1 本目のセッションを開けたまま 2 本目の端末で鍵のみのログインが機能することを確認します。そのあとで初めて PasswordAuthentication no と KbdInteractiveAuthentication no を設定し、sshd -t で構文を確認し、restart ではなく reload します。1 本目を開けたままにしておくことが、失敗を回復可能にします。
PasswordAuthentication no にしたのに、なぜまだパスワードを聞かれるのですか?
ほぼ常に 2 つの理由のどちらかです。KbdInteractiveAuthentication がまだ yes で PAM が別の仕組みでパスワード入力を提示しているか、/etc/ssh/sshd_config.d/ のファイルがあなたの変更より後に読み込まれて上書きしているかです。sudo sshd -T | grep -i passwordauth を実行し、sshd が実際に解決した値を確認してください。
Ed25519 と RSA のどちらを使うべきですか?
環境に対応できないものがない限り Ed25519 です。鍵ははるかに短く、検証は速く、安全性は 4096 ビット RSA と少なくとも同等です。RSA は古い機器やレガシークライアント向けの有効な代替として残ります。使う場合は最低でも 4096 ビットで生成してください。
鍵のみの SSH はブルートフォースの試行を止めますか?
決して成功しないようにします。それが目的です。ただし件数は減りません。ボットにはあなたの設定を知る術がなく、無期限に接続してパスワードを提示し続けます。接続、フォーク、ログ行という形で試行ごとの代価は払い続けるので、送信元の遮断は依然として価値があります。

鍵のみでも残るトラフィックに対処する

サブネット遮断、ホワイトリスト優先、実際の SSH ポートを自動検出。1 台永年無料、カード不要。