VPSのSSHを強化する設定と手順
VPSのSSHを鍵認証のみに切り替え、root loginとパスワードを無効化する手順です。Ubuntu 24.04のdrop-in設定、Fail2ban、VPNで防御を重ねます。
SSH を最初に強化する理由
SSH はサーバーを管理するための手段です。そのため、攻撃者が最初に試す入口になります。VPS がオンラインになるとすぐに、スキャナーが port 22 でユーザー名とパスワードを推測し始めます。数分以内に、その動作をログで確認できます。SSH の強化では、推測される要素をなくします。パスワードログインを完全に無効化し、root login を無効化して、cryptographic key のみを許可します。こうすると、パスワード自体が存在しないため、繰り返される推測攻撃は成功しません。
ここでは、SSH がすでに動作していることを前提とします。ログインできるなら、SSH を強化できます。手順は順番に実行してください。新しい session でログインできることを確認するまで、現在の session を開いたままにします。これにより、設定を誤ってもログインできなくなることを防げます。
手順 1: まず鍵認証が機能することを確認する
鍵認証では、パスワードの代わりに鍵ペアを使用します。秘密鍵はコンピューターに保管し、公開鍵をサーバーに配置します。サーバーは、秘密鍵をコンピューターの外へ出さずに、秘密鍵を保持していることを確認できます。パスワード認証を無効にする前に、鍵認証が機能することを確認してください。確認しないと、サーバーから締め出されます。
自分のコンピューターに鍵がない場合は、鍵を作成します。
ssh-keygen -t ed25519公開鍵をサーバーにコピーします。
ssh-copy-id user@your-server次に、新しい SSH セッションを開きます。パスワードを求められずにログインできれば、鍵認証は機能しているため、パスワード認証を無効にしても安全です。Permission denied (publickey) で拒否された場合、その 1 つのエラーには 5 つの異なる原因が隠れています。ssh -v の出力を確認すれば、ほかの変更を行う前に、どの原因に該当するかが分かります。鍵認証を初めて使う場合や、複数のコンピューターを使用する場合は、SSH 鍵管理の基本で、鍵をデバイスごとに 1 つ用意する方法、sshd が要求する権限、ノートパソコンを紛失したときに鍵を失効させる方法など、全体の仕組みを説明しています。
ステップ 2: drop-in ファイルで sshd を強化する
/etc/ssh/sshd_configを直接編集しないでください。Ubuntu 24.04 は/etc/ssh/sshd_config.d/から drop-in ファイルを読み込みます。このディレクトリに小さなファイルを置く方法なら、設定が整理され、パッケージの更新後も維持され、問題が起きた場合も簡単に削除できます。ファイル名も重要です。sshd は各設定項目について、最初に読み込んだ値を使用します。Ubuntu の cloud image には、このディレクトリに50-cloud-init.confが含まれており、PasswordAuthentication yesが設定されています。ファイル名を00-にしてください。そうすればそのファイルより先に読み込まれ、設定が有効になります。99-というファイル名では、設定が黙って無効になります。次のように作成します。
sudo nano /etc/ssh/sshd_config.d/00-hardening.conf次の内容を入れます。
# Key-only login: no passwords to guess.
PasswordAuthentication no
KbdInteractiveAuthentication no
# No direct root login. Log in as your user, then use sudo.
PermitRootLogin no各行が1つの侵入口を閉じます。PasswordAuthentication noが特に重要です。パスワード認証を無効にすると、総当たり攻撃で試せるパスワードがなくなります。KbdInteractiveAuthentication noは、もう1つのパスワード方式による経路を無効にします。PermitRootLogin noを設定すると、攻撃者は対象アカウント(すべてのサーバーに存在する root だけではありません)のユーザー名を知り、さらに暗号鍵も保持している必要があります。
ステップ 3: 設定をテストしてから再読み込みする
設定を適用する前に、誤りがないか確認します。タイプミスによってサービスが停止することを防げます。
sudo sshd -t何も表示されなければ、設定は有効です。SSH を再読み込みします。
sudo systemctl reload ssh次に、sshd が実際に使用する設定を確認します。別のファイルによって drop-in の設定が上書きされていないか確認できます。
sudo sshd -T | grep -Ei 'passwordauthentication|permitrootlogin'どちらも no と表示されるはずです。ここで現在のセッションを閉じずに、別の端末から新しいセッションを開きます。鍵でログインできれば完了です。問題があっても、最初のセッションは修正のために開いたままです。この重複した接続が安全策になるため、必ず実施してください。
Step 4: 任意の非標準ポート
SSH を 22 番ポートから 2222 などに変更しても、実質的なセキュリティは向上しません。攻撃者が標的を決めてスキャンする場合、すべてのポートを調べるためです。変更の効果は、ログのノイズを減らせることです。自動スキャナーの多くは 22 番ポートだけを試すためです。変更する場合は、drop-in ファイルに Port 2222 を追加します。先にファイアウォールで新しいポートを許可し、その後 sudo systemctl daemon-reload && sudo systemctl restart ssh.socket を実行して、ssh -p 2222 で接続します。Ubuntu 24.04 では、待ち受けポートを ssh.socket が管理します。そのため、単純な reload ssh では sshd は 22 番ポートのままです。新しいポートを反映するには、socket を再起動します。これは保護対策ではなく、ログを整理するための設定と考えてください。
手順 5: 追加の防御層を重ねる
強化した SSH key が基盤となり、その上にさらに 2 つの防御層を追加します。
Fail2ban はログを監視し、認証に繰り返し失敗するアドレスを ban します。これによりスキャナーによるノイズを減らし、早い段階で排除できます。key のみの認証との相性もよく、Fail2ban で Ubuntu の SSH 攻撃を止めるを参照してください。
さらに強力なのは、SSH をパブリックインターネットから完全に切り離す方法です。WireGuard VPN の背後に SSH を置くことで、port 22 をトンネルに対してのみ許可できます。VPN 外部の相手は SSH に到達できないため、総当たりによる推測は難しくなるだけでなく、実行自体が不可能になります。これらはすべて、基盤となる default-deny の firewall を前提とします。その設定については、VPS で UFW を設定するを参照してください。
SSH は、より大きなチェックリストの 1 項目です。新しい VPS で最初の 10 分に行う作業では手順を順番に説明し、Ubuntu の自動セキュリティ更新でその後もサーバーにパッチを適用できます。SSH を保護しても、その背後にあるサービスは保護されません。同じ VPS で password vault を運用している場合は、Vaultwarden の hardeningにより、key 認証では対処できない admin token と backup file の 2 点を保護できます。
FAQ
Ubuntu 24.04 で SSH のパスワードログインを無効にするにはどうすればよいですか?
/etc/ssh/sshd_config.d/00-hardening.conf に drop-in ファイルを作成します。00 プレフィックスにより、50-cloud-init.conf より前に並びます。sshd は最初に読み込んだ値を使用するため、PasswordAuthentication yes が優先されるのを防げます。ファイルには PasswordAuthentication no と KbdInteractiveAuthentication no を記述します。sudo sshd -t を実行して構文を確認し、その後 sudo systemctl reload ssh を実行します。新しいセッションで鍵ログインが機能することを確認してから、この設定だけに依存してください。sshd_config ではなく drop-in を編集すれば、パッケージ更新の影響を受けにくく、簡単に元に戻せます。
SSH での root ログインを無効にすべきですか?
はい。PermitRootLogin no を設定し、root として直接ログインできないようにします。通常のユーザーでログインし、管理作業には sudo を使用します。root はすべての Linux システムに存在するため、ログイン可能なままにすると、攻撃者に狙うべき既知のユーザー名を与えることになります。無効にすると、攻撃者はあなたのアカウント名を知り、鍵も保持していなければなりません。
SSH ポートを変更するとサーバーの安全性は向上しますか?
大きくは向上しません。22 番ポートから変更すると、22 番だけを調べる単純なスキャナーの対象から外れ、ログのノイズを減らせます。しかし、実際の攻撃者はすべてのポートをスキャンするため、変更後のポートも見つけます。侵入を実際に防ぐのは、鍵のみの認証です。ポートを変更する場合は、先にファイアウォールで新しいポートを開き、その後 sudo systemctl daemon-reload && sudo systemctl restart ssh.socket を実行します。Ubuntu 24.04 では socket が待ち受けを所有するため、通常の reload だけでは sshd は22 番ポートでの待ち受けを続けます。
SSH 鍵を使用している場合、Fail2ban は必要ですか?
必須ではありませんが、引き続き有用です。鍵のみの認証では、パスワード推測は成功しません。そのため、攻撃者の侵入を防いでいるのは Fail2ban ではありません。Fail2ban は同一アドレスからの連続した失敗をレート制限し、ログに記録されるスキャナーのノイズを減らします。また、繰り返し攻撃する送信元を早期に排除できます。ただし、低速で分散した攻撃は、禁止のしきい値を下回ったままになる可能性があります。鍵認証と併用し、できれば SSH は VPN の背後に置いてください。
SSH から締め出された場合、どう復旧すればよいですか?
プロバイダーの Web コンソールを使用します。Web コンソールは、SSH を経由しないシリアル接続または VNC 接続でサーバーにアクセスします。そこからログインし、sshd の drop-in ファイルを修正して、サービスを reload できます。最初のセッションを閉じる前に、2 つ目のターミナルで新しい SSH 設定をテストするのは、このためです。また、パスワードを無効にする前に、鍵認証が機能している状態にしておく必要があります。