SSHへのブルートフォース攻撃は、パブリックIPを持つすべてのサーバーで日常的に発生しています。grep 'Failed password' /var/log/auth.log | wc -lを実行して数千という数字が表示されたなら、おめでとうございます――あなたのサーバーは常時スキャンされています。
sysadminとして1年目に一度やられたことがあります。UbuntuサーバーはデフォルトポートSSH 22、パスワード認証有効、それ以上の設定なし。デバッグに半日かかりました――rootログインがいつの間にか侵害されており、攻撃者が午前3時から静かにcryptominerを動かしていたのです。ログを確認すると、48時間で4万件以上の失敗した試行が記録されていました。あの教訓は、どんなセキュリティ講座よりも高くつきました。
この記事は理論ではありません。各選択肢について直接説明します:本当に効果があるもの、手間がかかる割に効果が薄いもの、そして優先順位の付け方についてです。
SSHセキュリティアプローチの比較
様々な方法を試してきました。よく使われる4つのアプローチがあります――理論では効果的とされていても、実際には投資に値しないものもあります:
1. SSHポートの変更(Security by Obscurity)
メリット: ログのスパムが即座に減ります。デフォルトのポート22をスキャンするツールを使うスクリプトキディは、自動的にスルーしていきます。
デメリット: 実際にはより安全にはなりません。ShodanやMasscanのようなスキャナーは数分で65,535ポートすべてをスキャンします。これはノイズ低減策であり、本物のセキュリティではありません。
結論: できるならやっておく価値はありますが、ここで止まらないこと。
2. パスワード認証を無効化し、SSH鍵を使用する
メリット: パスワードへのブルートフォースを完全に排除します。これは最も低コストで最大の効果をもたらす変更です。
デメリット: 鍵の管理を慎重に行う必要があります。バックアップなしで秘密鍵を紛失すると、アクセスできなくなります。
結論: 必須です。議論の余地なし、最優先事項です。
3. Fail2ban / レート制限
メリット: 10分以内に3〜5回の認証失敗でIPを自動的にBANします。シンプルなスキャンスクリプトに対して有効です。
デメリット: 数千の異なるIPから分散するボットネットには、Fail2banも無力です。依存関係が増え、メンテナンスが必要なものが増えます。
実際のところ: あった方が良いですが、第2層として――パスワード認証を無効にした後に設定すべきです。
4. ファイアウォールでIPをホワイトリスト登録
メリット: 固定IPからしかアクセスしない場合は非常に効果的です。最初からファイアウォールでブロックすれば、突破されることはありません。
デメリット: 動的IP――モバイル、カフェ、ホテル――は問題になります。徹底するにはVPNやジャンプホストが必要です。
結論: 本番サーバーには理想的。複数の場所から作業することが多い場合は適用が難しいです。
優先順位:何から始めるべきか
効果が高い順に、よく実施する手順を示します:
- rootログインの無効化 + パスワード認証の無効化 + SSH鍵の有効化
- SSH接続を許可するユーザーの制限
- ポートの変更(オプション、主にログノイズ削減のため)
- Fail2banのインストール
- IPによるファイアウォール制限(ワークフローが許す場合)
実際の設定手順
ステップ1:SSH鍵ペアを作成してサーバーにアップロード
このコマンドはローカルマシンで実行します――サーバーではありません:
# ed25519でキーペアを作成(RSA 2048より強力)
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/id_ed25519
# 公開鍵をサーバーにコピー
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your-server-ip
# パスワード認証を無効にする前にテスト!
ssh -i ~/.ssh/id_ed25519 user@your-server-ip
重要: パスワード認証を無効にする前に、必ず鍵での接続をテストしてください。このステップを省略すると、自分自身をサーバーから締め出すことになります。
ステップ2:SSH設定ファイルのハードニング
sudo nano /etc/ssh/sshd_config
変更または追加が必要な設定項目:
# rootログインを無効化
PermitRootLogin no
# パスワード認証を無効化
PasswordAuthentication no
# OpenSSH 9.0以降、ChallengeResponseAuthenticationはKbdInteractiveAuthenticationに名称変更
ChallengeResponseAuthentication no
UsePAM no
# SSH鍵のみを許可
PubkeyAuthentication yes
# SSHユーザーを制限('youruser'を実際のユーザー名に変更)
AllowUsers youruser
# ポートを変更(オプション)
# Port 2222
# タイムアウトと試行回数を減らす
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 5
# 使用頻度が低く、リスクの高い機能を無効化
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
# 注意:'Protocol 2'ディレクティブはOpenSSH 7.6以降で削除済み — 追加不要
構文を確認してからリロードします――この順序で:
# 適用前に設定を確認
sudo sshd -t
# エラーがなければリロード
sudo systemctl reload sshd
ステップ3:Fail2banのインストールと設定
sudo apt install fail2ban -y # Ubuntu/Debian
# または
sudo dnf install fail2ban -y # RHEL/AlmaLinux
ローカル設定ファイルを別途作成します――元のファイルを直接編集しないこと。パッケージ更新時に上書きされます:
sudo nano /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
# ポートを変更した場合: port = 2222
logpath = %(sshd_log)s
maxretry = 3
bantime = 3600
findtime = 600
ignoreip = 127.0.0.1/8 ::1 YOUR_HOME_IP
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# ステータスを確認
sudo fail2ban-client status sshd
ステップ4:UFWによる基本的なファイアウォール設定
# SSHを許可(ポートを変更した場合は22を新しいポートに変更)
sudo ufw allow 22/tcp
# または特定のIPからのみ許可
sudo ufw allow from 1.2.3.4 to any port 22
sudo ufw enable
sudo ufw status verbose
セットアップ後の確認
完了してもすぐに休まずに――すべてが正しく動作していることを確認するためにこのチェックリストを実行してください:
# 正常にログインしたユーザーを確認
last -n 20
# 最近の失敗した試行を確認
grep 'Failed password\|Invalid user' /var/log/auth.log | tail -20
# Fail2banが動作しているか確認
sudo fail2ban-client status
# SSHがリッスンしているポートを確認
ss -tlnp | grep ssh
SSH設定をすばやく監査するためによく使うコマンド:
sudo sshd -T | grep -E 'permitrootlogin|passwordauthentication|pubkeyauthentication|allowusers'
正しくハードニングされた場合の出力例:
permitrootlogin no
passwordauthentication no
pubkeyauthentication yes
allowusers youruser
SSHハードニングでよくある間違い
- 鍵をアップロードする前にパスワード認証を無効化する: 結果はロックアウトです。常に鍵認証を先にテストしてください。
- Fail2banの
ignoreipに自分のIPを追加し忘れる: パスワードを数回間違えただけで自分自身をBANしてしまいます。 /etc/ssh/sshd_configを編集してもリロードしない: 設定が適用されていません――完了したつもりでも何も変わっていません。- RSA 1024を使用する: 以前から脆弱です。ed25519か最低でもRSA 4096を使用してください。
まとめ
SSHがインターネットに公開されているサーバーであれば、議論の余地なく必須の3つがあります:rootログインの無効化、パスワード認証の無効化、SSH鍵の有効化。この3つだけでセキュリティ効果の90%を担います。残りは追加の強化に過ぎません。
Fail2banとファイアウォールのホワイトリストは有用ですが、それらを主要な防御手段として頼ってはいけません。攻撃者にはレート制限を回避するための十分な忍耐力とボットネットがあります。しかし、ed25519の秘密鍵はブルートフォースできません――256ビットの鍵空間をすべて試すには数十億年の計算が必要です。

