VPSのSSHを要塞化する方法。鍵認証と設定変更の手順
VPSのセキュリティを高めるために、SSHのpassword loginやroot loginを無効化する手順を解説します。設定ミスによるロックアウトを防ぐため、sshdのdrop-in fileを活用した安全な設定変更方法や、Fail2banの導入についても詳しく説明しています。
なぜSSHの要塞化が最優先事項なのか
SSHはサーバーを制御するための手段です。そのため、攻撃者が最初に試みる標的となります。VPSがオンラインになると、スキャナーがすぐにport 22に対してユーザー名とパスワードの推測を開始します。ログを確認すれば、数分以内にその様子が確認できます。SSHの要塞化とは、推測可能な要素を排除することです。具体的には、password loginの無効化、root loginの無効化、そしてcryptographic keysのみを許可する設定を行います。これらを実施すれば、パスワード自体が存在しないため、推測攻撃は成立しません。
この手順は、すでにSSHが動作していることを前提としています。ログインができる状態であれば、要塞化が可能です。設定ミスによるロックアウトを防ぐため、手順は順番通りに行ってください。また、新しいセッションでログインできることを確認するまで、現在のセッションは開いたままにしておいてください。
Step 1: 鍵認証が動作することを確認する
鍵認証は、パスワードの代わりに鍵ペアを使用します。秘密鍵はローカルコンピュータに保存し、公開鍵はサーバーに配置します。サーバーは、秘密鍵がローカルから送信されることなく、クライアントがその鍵を所有していることを証明します。パスワード認証を無効にする前に、必ず鍵認証が動作することを確認してください。そうしないと、サーバーにアクセスできなくなる可能性があります。
鍵を持っていない場合は、ローカルコンピュータで鍵を作成してください:
ssh-keygen -t ed25519公開鍵をサーバーにコピーします:
ssh-copy-id user@your-serverその後、新しいSSHセッションを開きます。パスワードを求められずにログインできれば、鍵認証は正常に動作しています。その状態であれば、パスワード認証を無効にしても問題ありません。鍵認証が初めての場合や、複数のコンピュータを使用している場合は、SSH鍵管理の基本 で詳細な仕組みを確認してください。デバイスごとの鍵の運用、sshd が要求する権限、およびノートPC紛失時の鍵の無効化方法について説明しています。
Step 2: drop-in file による sshd の要塞化
/etc/ssh/sshd_config を直接編集しないでください。Ubuntu 24.04 は /etc/ssh/sshd_config.d/ から drop-in file を読み込みます。このディレクトリに小さなファイルを作成する方が、管理が容易で、パッケージのアップグレード時にも設定が維持され、問題発生時の削除も簡単です。ファイル名は重要です。sshd は各設定に対して最初に読み込んだ値を保持します。Ubuntu cloud images では、PasswordAuthentication yes を含む 50-cloud-init.conf がこのディレクトリに配置されています。そのファイルよりも先に読み込まれるよう、ファイル名を 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各行はセキュリティ上の脆弱性を排除します。PasswordAuthentication no は非常に重要です。パスワードを無効にすることで、ブルートフォース攻撃を無効化できます。KbdInteractiveAuthentication no は、もう一つのパスワードによる認証経路を遮断します。PermitRootLogin no を設定すると、攻撃者はすべてのマシンに存在する root ユーザーを狙うことができなくなり、ユーザー名と秘密鍵の両方を知っている必要があります。
Step 3: 設定のテストと再読み込み
設定ミスによるサービスの停止を防ぐため、適用前に構文チェックを行ってください。
sudo sshd -t何も表示されなければ、設定は有効です。SSHを再読み込みします。
sudo systemctl reload ssh次に、sshdが実際に使用している設定を確認してください。これにより、他のファイルによって設定が上書きされていないかを確認できます。
sudo sshd -T | grep -Ei 'passwordauthentication|permitrootlogin'両方の出力が no であれば正常です。現在のセッションを閉じずに、別のターミナルから新しいセッションを開いてください。鍵認証でログインできれば完了です。問題が発生した場合でも、最初のセッションが維持されているため、修正が可能です。この手順は安全策として重要ですので、必ず実行してください。
Step 4: オプションの非標準ポート
SSHのポートを22から2222などの番号に変更しても、セキュリティは実質的に向上しません。攻撃者はすべてのポートをスキャンするためです。この設定の目的は、ログのノイズを減らすことです。自動スキャナーの多くは22番ポートのみを試行するためです。
設定を適用する場合は、以下の手順で行ってください。
- drop-in fileに
Port 2222を追加します。 - ファイアウォールで新しいポートを許可します。
sudo systemctl daemon-reload && sudo systemctl restart ssh.socketを実行します。ssh -p 2222で接続します。
Ubuntu 24.04では、ssh.socket がリスニングポートを管理しています。そのため、単に reload ssh を実行しただけでは sshd は22番ポートのままです。新しいポートを適用するには、socketを再起動する必要があります。この設定は、保護のためではなく、整理のために行うものと考えてください。
Step 5: 追加の防御層を重ねる
強化された SSH key は基礎となります。その上にさらに 2 つの防御層を重ねます。
Fail2ban はログを監視し、ログインに失敗し続けるアドレスを BAN します。これにより、スキャナーによるノイズを削減し、早期に排除できます。これは key-only auth と相性が良いです。詳細は Ubuntu で Fail2ban を使用して SSH 攻撃を阻止する方法 を参照してください。
さらに強力な方法は、SSH をパブリックインターネットから完全に遮断することです。もし WireGuard VPN の背後に SSH を配置 し、ポート 22 をトンネル経由のみにファイアウォールで制限すれば、VPN 外のユーザーは SSH に到達することすらできません。これにより、ブルートフォース攻撃は「困難」ではなく「不可能」になります。これらはすべて、VPS 上の UFW 設定 のような、デフォルト拒否(default-deny)のファイアウォールが設定されていることを前提としています。
SSH は、より広範なチェックリストの一部に過ぎません。新しい VPS で最初に行うべき 10 分間の作業 で手順を確認し、Ubuntu での自動セキュリティアップデート で継続的にパッチを適用してください。
FAQ
Ubuntu 24.04でSSHのパスワードログインを無効にするには?
/etc/ssh/sshd_config.d/00-hardening.conf にドロップインファイルを作成します。00 という接頭辞を付けることで、50-cloud-init.conf よりも先にソートされます。50-cloud-init.conf の PasswordAuthentication yes が優先されるのを防ぐためです(sshd は最初に読み込んだ値を採用します)。ファイルには PasswordAuthentication no と KbdInteractiveAuthentication no を記述し、sudo sshd -t で設定を確認してから sudo systemctl reload ssh を実行してください。設定を適用する前に、新しいセッションで鍵認証が動作することを確認してください。sshd_config を直接編集するのではなくドロップインファイルを使用すれば、パッケージのアップグレード後も設定が維持され、元に戻すことも簡単です。
SSH経由のrootログインは無効にすべきですか?
はい。PermitRootLogin no を設定して、rootとして直接ログインできないようにしてください。通常のユーザーでログインし、管理者タスクには sudo を使用してください。すべてのLinuxシステムにはrootが存在するため、ログインを許可したままだと、攻撃者に既知のユーザー名をターゲットとして与えることになります。無効にすれば、攻撃者はあなたのユーザー名を知り、かつ鍵を保持している必要があります。
SSHポートを変更するとセキュリティは向上しますか?
実質的な向上はありません。ポート22から変更すると、ポート22のみをスキャンする簡易的なスキャナーを回避でき、ログのノイズを減らせます。しかし、本物の攻撃者はすべてのポートをスキャンするため、結局は見つけられます。侵入を阻止するために重要なのは、鍵認証のみの認証方式です。ポートを変更する場合は、まずファイアウォールで新しいポートを開放してから sudo systemctl daemon-reload && sudo systemctl restart ssh.socket を実行してください。Ubuntu 24.04では、socketがリスナーを管理しているため、単なるreloadではsshdはポート22のままとなります。
SSH鍵を使用している場合でもFail2banは必要ですか?
任意ですが、有用です。鍵認証のみを使用している場合、パスワードの推測攻撃は成功しません。そのため、Fail2banは攻撃者を防ぐためのものではありません。Fail2banは単一のアドレスからの連続した失敗を制限し、ログのノイズを減らし、繰り返し攻撃を行う者を早期に排除します。ただし、低速な分散型攻撃は、そのBAN閾値を下回ります。鍵認証と併用し、理想的にはSSHをVPNの背後に配置してください。
SSHから締め出された(ロックアウトされた)場合の復旧方法は?
プロバイダーのウェブコンソールを使用してください。これはSSHを経由しないシリアル接続またはVNC接続でサーバーにアクセスします。そこからログインし、sshd ドロップインファイルを修正して、サービスをリロードしてください。新しいSSH設定をテストする際に、最初のセッションを閉じる前に別のターミナルで確認すべきなのは、まさにこのためです。また、パスワードを無効にする前に、鍵認証が既に動作している必要があります。