真夜中の攻撃が警鐘を鳴らした
午前2時に鳴り響く大量のサーバーアラートは、まさに悪夢のような目覚めでした。半年前、新規セットアップしたサーバーへの不正ログイン試行通知が500件以上も受信トレイに殺到し、現実に叩き起こされたのです。それは、典型的な執拗いSSHブルートフォース攻撃でした。
自動化されたスクリプトが、何千ものパスワードの組み合わせを試して猛攻撃を仕掛けていました。侵入はされませんでしたが、この出来事は私に重大な教訓を与えました。デフォルトのセキュリティは、セキュリティ対策が何もないのと同じである、と。その夜以来、サーバーが稼働した瞬間からセキュリティを最優先することを固く誓いました。
この半年間、私は階層的な防御戦略を練り上げ、絶えず攻撃を受けていた騒がしいサーバーを静かな要塞へと変えました。これは、複雑なエンタープライズ向けのツールではありません。IT専門家やホビイストなら誰でも実装できる実践的な設定です。ここでは、その設定の経緯、有効な対策、そして皆さんが同じことを行うための方法についてお話しします。
戦場を理解する:ブルートフォース攻撃とは何か?
防御を固める前に、まずは敵を知る必要があります。ブルートフォース攻撃は、本質的にデジタルな破城槌のようなものです。攻撃者は自動化されたスクリプトを使い、膨大な数の組み合わせを試して認証情報を推測します。主に2つの種類があります。
- 辞書攻撃: スクリプトが `password`、`123456`、`qwerty` のような、よく使われるパスワードや過去に漏洩したパスワードのリストを順番に試します。
- 総当たり攻撃: スクリプトが考えられるすべての文字の組み合わせ(aaa、aab、aac…)をしらみつぶしに試します。時間はかかりますが、はるかに網羅的です。
最も一般的な標的は、SSH、RDP、FTP、そして特にWordPressのようなWebアプリケーションのログインページなど、インターネットに公開されているサービスです。攻撃が成功すると、不正アクセス、データ盗難、そしてサーバーのCPUとメモリの大幅な消耗につながります。私たちの目標は、これらの攻撃を非常に非効率的にし、攻撃者が諦めて次の標的に移るようにすることです。
私の鉄板戦略:事前の階層的防御
私の戦略はシンプルです。まず玄関のドアを信じられないほど頑丈にし、次に自動化された警備員を配置して、うろついている者を追い出す、というものです。これは非常に効果的な組み合わせで、驚くほど信頼性が高いことが証明されています。
第1層:SSHキーで玄関のドアを強化する
あなたができる最も重要な変更点は、SSHのパスワード認証を無効にし、代わりに暗号鍵を使用することです。パスワード、特に脆弱なものは推測される可能性があります。しかし、適切に生成された暗号鍵は推測不可能です。SSHキーペアは、秘密鍵(ローカルマシンで安全に保管)と公開鍵(サーバーに配置)で構成されます。サーバーは、正しい秘密鍵を持っていることを証明できる人にのみアクセスを許可します。
1. キーペアを生成する
まだ持っていない場合は、ローカルコンピュータで作成します。ターミナルを開き、次のように実行します。
ssh-keygen -t rsa -b 4096
このコマンドは、強力な4096ビットのRSAキーを作成します。ファイルの保存場所と、オプションのパスフレーズの設定を求められます。セキュリティをさらに強化するために、パスフレーズの使用を強くお勧めします。
2. 公開鍵をサーバーにコピーする
次に、公開鍵をサーバーにインストールします。最も簡単な方法は `ssh-copy-id` ユーティリティを使うことです。
ssh-copy-id user@your_server_ip
これがパスワードを尋ねられる最後の機会になります。このコマンドは、サーバー上の `~/.ssh/authorized_keys` ファイルに公開鍵を自動的に追記します。
3. パスワード認証を無効にする
これが最後の、そして最も重要なステップです。サーバーにログインし、nanoやvimなどのテキストエディタでSSHデーモンの設定ファイルを開きます。
sudo nano /etc/ssh/sshd_config
`PasswordAuthentication` の行を見つけて、その値を `no` に変更します。このファイルを開いている間に、`PermitRootLogin` を `no` に設定して、rootでの直接ログインを無効にすることもベストプラクティスです。
# この行を変更
PasswordAuthentication no
# こちらも同様に
PermitRootLogin no
ファイルを保存し、SSHサービスを再起動して変更を適用します。
sudo systemctl restart sshd
この変更により、パスワードベースのログイン試行は不可能になります。ブルートフォースボットの大多数は即座にブロックされるでしょう。
第2層:自動警備員、Fail2ban
玄関のドアを強化したら、私の次の層は自動警備員であるFail2banです。この素晴らしいツールは、繰り返し失敗するログイン試行のような悪意のある活動のログファイルをスキャンします。違反者を検出すると、ファイアウォールを自動的に更新し、そのIPアドレスを一定期間ブロックします。
1. インストール
DebianやUbuntuでは、インストールは1行のコマンドで完了します。
sudo apt update && sudo apt install fail2ban -y
2. 設定
Fail2banのメイン設定ファイルは `/etc/fail2ban/jail.conf` です。アップデートで上書きされる可能性があるため、このファイルを直接編集しないでください。代わりに、安全に独自の変更を加えることができるローカルコピーを作成します。
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
次に、`jail.local` を開いてルールをカスタマイズします。
sudo nano /etc/fail2ban/jail.local
まず、`[sshd]` セクションに焦点を当てます。この設定は素晴らしいベースラインになります。
[sshd]
enabled = true
port = ssh
maxretry = 3
findtime = 300
bantime = 3600
logpath = /var/log/auth.log
- enabled: このルール(「jail」と呼ばれる)を有効にします。
- maxretry: BANされるまでの失敗試行回数。3回は適切で厳しい数値です。
- findtime: 失敗をカウントする期間(秒)。300秒(5分)以内に3回失敗するのは、明らかにボットの兆候です。
- bantime: BANが続く時間(秒)。私は3600秒(1時間)から始めます。常習犯を見つけたら、これを`86400`(24時間)に増やします。
変更を保存した後、Fail2banを再起動して新しい設定を読み込みます。
sudo systemctl restart fail2ban
3. ステータスの確認
Fail2banの動作を確認できます。SSHのjailをチェックし、BANされたIPのリストを見るには、次を実行します。
sudo fail2ban-client status sshd
もし誤って自分自身をロックアウトしてしまった場合(よくあることです!)、サーバーのコンソールから自分のIPアドレスのBANを解除できます。
sudo fail2ban-client set sshd unbanip YOUR_IP_ADDRESS
第3層:Webアプリケーションを忘れない
ブルートフォース攻撃はSSHだけを狙うわけではありません。WordPress、Joomla、その他のWebアプリのログインフォームは巨大な標的です。防御の原則は同じで、ログイン試行回数を制限することです。WordPressの場合、Wordfence Securityプラグインが優れたログイン試行回数制限機能を提供しています。どのプラットフォームを使用していても、同様のツールを見つけてください。さらに重要なのは、強力なパスワードと二要素認証(2FA)を強制することです。重要なユーザーアカウントにとって、2FAは交渉の余地がありません。
半年後:訪れた平和と静寂
SSHキー認証とFail2banの自動ブロックの組み合わせは、絶大な効果を発揮しました。サーバーのログがその物語を語っています。毎日何百件もあった失敗ログインのノイズは消え去り、ほぼ無音の状態に置き換わりました。かつて毎日メガバイト単位で増加していた `auth.log` ファイルは、今では数キロバイトしか記録されません。セキュリティとは、インストールする単一の製品ではなく、賢い防御を重ねていくプロセスなのです。
もちろん、定期的にログを確認し、システムを最新の状態に保つ必要はあります。しかし、これらの実践的な手順を実装することで、大きな安心感をもたらす強固な防御を構築できます。少なくとも私にとってはそうでした。

