公開サーバーを立ち上げた翌日には、もうSSHへのアクセス試行が届いています。セキュリティログを見れば、見知らぬIPアドレスが1秒間に何度もログインを試みている記録が並んでいます。世界中に散らばった自動化ボットが、ありふれたユーザー名とパスワードの組み合わせを次々と試し続ける——これがブルートフォース攻撃の実態です。
「鍵認証にしているから大丈夫」と思っていても、ログが汚染され続けるのは精神的にも運用的にも好ましくありません。また、パスワード認証を残したままのサービスがあれば、いつかは突破されるリスクがあります。
この記事では、Linuxサーバーへの不正アクセス試行を自動検知してIPをブロックするfail2banについて、インストールから実践的な運用設定まで現場で使えるレベルで解説します。SSHだけでなく、Apache・Nginx・Postfixなど主要サービスへの適用方法もカバーします。
fail2banとは?仕組みをざっくり理解する
fail2banは、ログファイルを監視して一定回数の認証失敗を検出すると、その発信元IPアドレスをファイアウォール(iptables・nftables・firewalldなど)でブロックするツールです。オープンソースで、Pythonで実装されています。
仕組みはシンプルです。
・フィルター(filter): ログのどのパターンを「失敗」と見なすかを定義する正規表現
・ジェイル(jail): 「どのログを監視し、何回失敗したらブロックするか」をまとめた設定単位
・アクション(action): ブロック時に何をするか(iptablesへのルール追加、メール通知など)
ブロックは永続的ではなく、設定したbantime(デフォルト10分)が過ぎれば自動解除されます。攻撃元は何万ものIPを使い回すため、短期ブロックを繰り返すだけでも攻撃の費用対効果を大幅に下げられます。
攻撃者はどうやってサーバーに侵入しようとするのか
攻撃者がLinuxサーバーを狙う際の主な手口を理解しておくことが、適切な防御設定への近道です。
1. ブルートフォース攻撃
パスワードのあらゆる組み合わせを機械的に試す方法です。短いパスワードや辞書に載っている単語は、ボットに数分で突破される可能性があります。詳しい仕組みはブルートフォース攻撃とは?仕組み・被害例・対策をわかりやすく解説を参照してください。
2. パスワードリスト攻撃(クレデンシャルスタッフィング)
過去のデータ漏洩で流出したID・パスワードの組み合わせをリスト化して試す攻撃です。「同じパスワードを複数サービスで使いまわしている」ユーザーが多いため、成功率が高いのが特徴です。
3. 辞書攻撃
よく使われるパスワード(password、123456、admin、rootなど)のリストを用いて試行する方法です。マネジメントコンソールやWordPressの管理画面なども標的になります。
fail2banはこれらの攻撃全てに対して有効です。ログイン失敗のパターンを検出し、攻撃元をブロックすることで被害を防ぎます。
fail2banのインストール
1. RHEL / CentOS / AlmaLinux / Rocky Linux の場合
EPELリポジトリが必要です。
# EPELリポジトリを有効化(インストール済みならスキップ) sudo dnf install epel-release -y # fail2banをインストール sudo dnf install fail2ban fail2ban-systemd -y # サービスを有効化・起動 sudo systemctl enable --now fail2ban
2. Ubuntu / Debian の場合
# パッケージリストを更新 sudo apt update # fail2banをインストール sudo apt install fail2ban -y # サービスを有効化・起動 sudo systemctl enable --now fail2ban
基本設定:jail.local を作成する
fail2banの設定は /etc/fail2ban/jail.conf がデフォルトですが、このファイルはパッケージ更新で上書きされます。必ず jail.local を作成してカスタマイズしましょう。
# jail.conf をコピーするのではなく、空のjail.localに必要な設定だけ書く sudo nano /etc/fail2ban/jail.local
以下のような内容を記述します。
[DEFAULT] # 自分のIPやオフィスのIPは絶対にブロックしない(スペース区切りで複数指定可) ignoreip = 127.0.0.1/8 ::1 203.0.113.10 # 失敗検出の時間窓(秒):この期間内にmaxretry回失敗するとブロック findtime = 600 # 失敗許容回数(この回数を超えたらブロック) maxretry = 5 # ブロック期間(秒):-1 にすると永久ブロック bantime = 3600 # バックエンド:systemdジャーナルを使う場合はsystemd、ファイルログはauto backend = auto
ignoreip の設定は特に重要です。 自分のPCのIPを入れ忘れると、設定ミスで自分自身をブロックしてサーバーにアクセスできなくなる事態を招きます。
SSHを守るjail設定
最も基本的かつ効果が高いのがSSHのjailです。jail.local に追記します。
[sshd] enabled = true port = ssh # SSHポートを変更している場合はポート番号を指定(例: port = 2222) logpath = %(sshd_log)s backend = %(sshd_backend)s maxretry = 3 bantime = 86400 # 3回失敗したら24時間ブロック(DEFAULT値よりも厳しく設定)
設定を反映するにはfail2banを再起動します。
sudo systemctl restart fail2ban
SSHのセキュリティ対策についてはSSH接続のセキュリティ対策|鍵認証・ポート変更・fail2banで不正アクセスを防ぐもあわせて参照してください。fail2banと鍵認証を組み合わせることで、認証レイヤーが二重になります。
WebサーバーとメールサーバーのJail設定
1. Apacheのjail設定
Webアプリへのスキャンや総当たり攻撃をブロックします。
[apache-auth] enabled = true port = http,https logpath = %(apache_error_log)s maxretry = 5 [apache-badbots] enabled = true port = http,https logpath = %(apache_access_log)s maxretry = 2 [apache-noscript] enabled = true port = http,https logpath = %(apache_access_log)s maxretry = 6
2. Nginxのjail設定
[nginx-http-auth] enabled = true port = http,https logpath = %(nginx_error_log)s [nginx-botsearch] enabled = true port = http,https logpath = %(nginx_access_log)s maxretry = 2
3. Postfix(メールサーバー)のjail設定
[postfix] enabled = true port = smtp,465,submission logpath = %(postfix_log)s backend = %(postfix_backend)s maxretry = 5 [postfix-sasl] enabled = true port = smtp,465,submission,imap,pop3 logpath = %(postfix_log)s backend = %(postfix_backend)s maxretry = 3
日常運用で使うfail2banコマンド
fail2banを導入したら、定期的にステータスを確認する習慣をつけましょう。
# fail2banの全体ステータス確認(有効なjailの一覧) sudo fail2ban-client status # sshdジェイルの詳細(現在ブロック中のIP・失敗統計) sudo fail2ban-client status sshd # 特定のIPのブロックを解除(自分のIPを誤ってブロックした場合など) sudo fail2ban-client set sshd unbanip 203.0.113.10 # IPを手動でブロック(疑わしいIPを即座に遮断) sudo fail2ban-client set sshd banip 198.51.100.5 # 設定ファイルのテスト(再起動前に構文チェック) sudo fail2ban-client --test # ログをリアルタイム確認 sudo journalctl -u fail2ban -f
ブロックされたIPは /var/log/fail2ban.log に記録されます。ログを定期的にレビューすることで、攻撃のトレンドを把握できます。
ファイアウォールとの連携についてはnftablesの設定入門やfirewalldの設定入門も参考になります。fail2banはiptables・nftables・firewalldいずれにも対応しています。
中小企業でも今日からできること
「サーバー管理者がいない」「専任のセキュリティ担当がいない」という環境でも、fail2banは情シス1人で十分に導入・運用できます。最低限やっておくべき手順をまとめます。
・まずSSHのjailだけ有効にする: 設定が少なく誤操作リスクも低い。公開サーバーなら最初の1時間でできます
・ignoreipに自社・自宅のIPを登録する: 設定ミスで締め出しを防ぐ最重要ステップ
・bantimeを長めに設定する: デフォルト10分より86400秒(24時間)のほうが攻撃抑止効果が高い
・週1回fail2ban-client statusを確認する: 大量のブロックが発生している場合は標的にされているサインかもしれない
・ログをLinuxのsyslogに集約する: Linuxログ監視入門と組み合わせると証跡管理もしやすくなります
よくある誤解と注意点
【誤解1】fail2banだけあれば不正アクセスは完全に防げる
fail2banはあくまで「ブルートフォースを遅延・阻止する」ツールです。ゼロデイ脆弱性を悪用した攻撃や、単発のSQLインジェクション、ソーシャルエンジニアリングには効果がありません。SSH鍵認証・定期パッチ適用・WAFといった多層的な対策の一つとして位置づけましょう。
【誤解2】bantime=-1(永久ブロック)にしておけば完璧
永久ブロックを乱用すると、正規ユーザーの誤操作でIPがブロックされた際の解除作業が大変になります。また、攻撃者は多数のIPを使い回すため、ブロックリストが際限なく膨らみます。通常は1時間~24時間程度のbantimeが実用的です。繰り返し攻撃してくるIPには手動で永久ブロックをかけるのが現実的です。
【誤解3】ignoreipに設定したIPはログにも記録されない
ignoreipはあくまでブロック対象から除外するだけです。ログへの記録は通常通り行われます。正常な挙動です。
【注意】クラウド環境での注意点
AWS EC2・GCP・Azureなどのクラウドでは、ロードバランサーのIPがsourcのIPとして見えるケースがあります。ロードバランサーのIPを誤ってブロックすると全トラフィックが遮断されます。X-Forwarded-Forヘッダーの扱いをfail2banの設定で考慮する必要があります。
本記事のまとめ
| 設定項目 | 推奨値 | ポイント |
|---|---|---|
| ignoreip | 自社・自宅IP | 設定忘れると自分が締め出される |
| findtime | 600秒(10分) | 短すぎると低速攻撃に無効 |
| maxretry | SSH: 3回, Web: 5回 | サービスごとに調整する |
| bantime | 3600~86400秒 | 長いほど攻撃コストが上がる |
| 有効にするjail | sshd・使用Webサーバー | 使っていないサービスはenabled=false |
fail2banは「難しいセキュリティ設定」ではありません。インストールから基本設定まで30分もあれば完了し、その日からブルートフォース攻撃をほぼ無力化できます。Linuxサーバーを持っているなら、最初に導入すべきセキュリティツールの一つです。
Linuxサーバーのセキュリティ全般についてより深く学びたい方には、姉妹サイトLinuxMaster.JPのコマンドやカーネル設定の解説記事もあわせてご活用ください。
PR
fail2banをはじめ、SELinux・ファイアウォール・ログ管理・パスワードポリシーなどLinuxサーバーのセキュリティ設定を体系的に学べる実践書。現場のインフラエンジニアが手元に置いておきたい一冊です。
