【コピペでOK】SSHへのブルートフォース攻撃を自動で撃退!Fail2ban導入でサーバーを守る簡単設定ガイドDebian fail2banによるIPアドレスブロック

未分類

本ページは広告が含まれています。気になる広告をクリック頂けますと、サーバ運営費になります(^^

SSHのログが攻撃の痕跡だらけ…あなたのサーバーは大丈夫?

SHでサーバーにログインしてログを確認したら、見知らぬIPアドレスから大量のログイン試行が…!。何とかならんかと探していたらfail2banに行き当たりました。

Fail2banとは?サーバーの頼れる用心棒!

Fail2banは、何度もログインに失敗してくるような怪しいIPアドレスを自動的に検知し、一時的にサーバーへのアクセスを禁止(BAN)してくれる、まるでサーバーの用心棒のようなツールです

【本編】Fail2banの導入から設定までを完全解説

インストール作業は超簡単

基本的にapt-get install fail2banを実行するだけ

# apt-get install fail2ban
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了        
状態情報を読み取っています... 完了        
以下の追加パッケージがインストールされます:
  python3-pyinotify whois
提案パッケージ:
  mailx monit sqlite3 python-pyinotify-doc
以下のパッケージが新たにインストールされます:
  fail2ban python3-pyinotify whois
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 1 個。
549 kB のアーカイブを取得する必要があります。
この操作後に追加で 2,684 kB のディスク容量が消費されます。
続行しますか? [Y/n] 
取得:1 http://deb.debian.org/debian bookworm/main amd64 fail2ban all 1.0.2-2 [451 kB]
取得:2 http://deb.debian.org/debian bookworm/main amd64 python3-pyinotify all 0.9.6-2 [27.4 kB]
取得:3 http://deb.debian.org/debian bookworm/main amd64 whois amd64 5.5.17 [70.8 kB]
549 kB を 1秒 で取得しました (446 kB/s)
以前に未選択のパッケージ fail2ban を選択しています。
(データベースを読み込んでいます ... 現在 52948 個のファイルとディレクトリがインストールされています。)
.../fail2ban_1.0.2-2_all.deb を展開する準備をしています ...
fail2ban (1.0.2-2) を展開しています...
以前に未選択のパッケージ python3-pyinotify を選択しています。
.../python3-pyinotify_0.9.6-2_all.deb を展開する準備をしています ...
python3-pyinotify (0.9.6-2) を展開しています...
以前に未選択のパッケージ whois を選択しています。
.../whois_5.5.17_amd64.deb を展開する準備をしています ...
whois (5.5.17) を展開しています...
whois (5.5.17) を設定しています ...
fail2ban (1.0.2-2) を設定しています ...
Created symlink /etc/systemd/system/multi-user.target.wants/fail2ban.service → /lib/systemd/system/fail2ban.service.
python3-pyinotify (0.9.6-2) を設定しています ...
man-db (2.11.2-2) のトリガを処理しています ...

設定ファイルをコピーする

jail.conf を直接編集せず、jail.local という名前でコピーして編集する理由(「元の設定ファイルを汚さず、アップデート時にも自分の設定が消えないようにするためのお作法です」)

# cp jail.conf jail.local

コンフィグを編集(下記はデフォルトのまま)

vi jail.local
# "bantime" is the number of seconds that a host is banned.
bantime  = 10m

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime  = 10m

# "maxretry" is the number of failures before a host get banned.
maxretry = 5

[sshd]

# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode   = normal
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

とりあえず、設定は変更せずデフォルトで運用してみます。

コンフィグの意味

maxretry = 5
「最大試行回数」のことです。
ここで設定された回数(この場合は5回)だけ認証に失敗すると、アクセス禁止の対象になります。

findtime = 10m
「監視時間」のことです。
maxretryで設定した回数の失敗を、どのくらいの期間内にカウントするかを定義します。この場合は10分間です。
例えば、1回目の失敗から10分以上経ってから5回目の失敗をしても、それはカウントされません。

bantime = 10m
「アクセス禁止時間 (BANする時間)」のことです。
条件(10分以内に5回失敗)を満たしてしまったIPアドレスを、どのくらいの時間ブロックするかを定義します。この場合は10分間です。この時間が経過すると、ブロックは自動的に解除されます。

Fail2banを起動・有効化する

systemctl enable(OS起動時に自動で立ち上がるようにするおまじない)と systemctl start(今すぐ起動するスイッチ)で起動します。

# systemctl enable fail2ban
Synchronizing state of fail2ban.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable fail2ban

スタート

systemctl start fail2ban

もし、この手順が「少し難しい」と感じたら…

コマンド操作や設定ファイルの編集に、もしご不安を感じたとしても、それは決して珍しいことではありません。サーバー管理には専門的な知識が求められる場面もございます。

実は、最近の高性能なレンタルサーバー(VPS)は、こうした専門的な設定の手間を最小限に抑え、誰もが直感的に、そして安全にサーバーを運用できるような工夫が凝らされています。

  • 洗練されたコントロールパネル: 黒い画面(CUI)をあまり使わずに、Webブラウザ上で各種設定が完結します。
  • 充実したセキュリティ機能: ファイアウォール設定などが標準で、かつ簡単に利用できるようになっています。
  • 手厚いサポート体制: 不明な点があれば、専門のスタッフに相談できます。

もし現在のサーバー環境の管理に少しでも負担を感じていらっしゃるなら、より快適な運用が可能なサーバーへの乗り換えを検討されてみてはいかがでしょうか。日々の管理に費やす時間を、本来注力すべきコンテンツ制作やビジネスの成長に充てることは、非常に賢明な投資と言えます。

▼ 初心者の方でも安心して利用できる、人気の国産VPS ▼

  • ConoHa VPS: 業界トップクラスの使いやすい管理画面が特長です。サーバーの性能も高く、サイトの表示速度向上にも貢献します。初めてVPSを利用する方に最もおすすめできるサービスの一つです。
  • Xserver VPS: 国内シェアNo.1のレンタルサーバー「エックスサーバー」が提供するVPSです。長年の運用実績に裏打ちされた高い安定性と、充実したサポート体制が魅力です。

ちゃんと動いてる?動作確認とログの見方

ステータスの確認

systemctl status fail2ban を実行し、active (running) と緑色で表示されていればOK!

# systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
     Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; preset: enabled)
     Active: active (running) since Wed 2025-10-15 16:40:04 JST; 15min ago
       Docs: man:fail2ban(1)
   Main PID: 931890 (fail2ban-server)
      Tasks: 5 (limit: 18947)
     Memory: 38.2M
        CPU: 484ms
     CGroup: /system.slice/fail2ban.service
             └─931890 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

10月 15 16:40:04 TestDB systemd[1]: Started fail2ban.service - Fail2Ban Service.
10月 15 16:40:05 TestDB fail2ban-server[931890]: 2025-10-15 16:40:05,010 fail2ban.configreader   [931890]: WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'
10月 15 16:40:05 TestDB fail2ban-server[931890]: Server ready

ログを確認する

# journalctl -u fail2ban
10月 15 16:40:04 TestDB systemd[1]: Started fail2ban.service - Fail2Ban Service.
10月 15 16:40:05 TestDB fail2ban-server[931890]: 2025-10-15 16:40:05,010 fail2ban.configreader   [931890]: WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'
10月 15 16:40:05 TestDB fail2ban-server[931890]: Server ready

テストでわざとパスワードミスって、5回目の認証で

BANされるとこんなログ

2025-10-15 16:59:12,261 fail2ban.filter         [931890]: INFO    [sshd] Found 192.168.11.10 - 2025-10-15 16:59:02
2025-10-15 16:59:12,262 fail2ban.filter         [931890]: INFO    [sshd] Found 192.168.11.10 - 2025-10-15 16:59:03
2025-10-15 16:59:12,263 fail2ban.filter         [931890]: INFO    [sshd] Found 192.168.11.10 - 2025-10-15 16:59:08
2025-10-15 16:59:12,264 fail2ban.filter         [931890]: INFO    [sshd] Found 192.168.11.10 - 2025-10-15 16:59:11
2025-10-15 16:59:15,895 fail2ban.filter         [931890]: INFO    [sshd] Found 192.168.11.10 - 2025-10-15 16:59:15
2025-10-15 16:59:16,179 fail2ban.actions        [931890]: NOTICE  [sshd] Ban 192.168.11.10

ログにこのように Ban という文字が出力されれば、用心棒がしっかり仕事をしてくれている証拠です!

まとめ:Fail2banでサーバーに安心をプラスしよう!

Fail2banを導入することで、ブルートフォース攻撃への不安が軽減され、サーバー管理がより快適になります。

Fail2banは強力ですが、これだけで万全というわけではありません。SSHのポート番号変更鍵認証方式の導入など、他のセキュリティ対策と組み合わせることで、さらに鉄壁の守りを実現できます。

おまけ:fail2banが作ったiptablesのルールを覗いてみよう!

fail2banがIPアドレスをブロックするとき、実際にサーバーの**ファイアウォール(iptables)**にどのようなルールを追加しているか、気になりませんか?

fail2banは、ブロック対象のサービスごとに専用のチェーン(ルールのグループ)を作ります。たとえば、SSHサービス(sshd)を守るために作られたチェーンは、通常以下のような名前になります。

f2b-sshdチェーンの正体

iptables -nvL

Chain f2b-sshd (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     all  --  *      *       ???.???.???.163       0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  *      *       ???.???.???.167       0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  *      *       ???.???.???.170       0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  *      *       ???.???.???.166       0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  *      *       ???.???.???.169       0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  *      *       ???.???.???.172       0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  *      *       ???.???.???.177       0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  *      *       ???.???.???.174       0.0.0.0/0            reject-with icmp-port-unreachable

見ての通り、fail2banはブロックしたいIP(???.???.???.163など)に対して**REJECT**というアクションを設定しています。

【💡ここがポイント】 REJECTは、パケットを拒否するだけでなく、「あなたからの接続は拒否しましたよ」というお返事(ICMPエラー)を相手に返す動作です。これは攻撃者に対して「このIPにはサーバーがいるけど、接続を閉じてるよ」と存在を教えているようなもので、あまりスマートではありませんし、応答を返す分、リソースも使います。

永続的な「沈黙」を選び取る:DROPへの昇華

fail2banは設定時間でREJECTを解除してしまいますが、私たちは「このIPアドレスはもう永久に相手にしたくない!」と考えます。

そこで、登場するのが**iptablesの最重要チェーンINPUTと、アクションDROP**です。

DROPREJECTと違い、パケットが来ても完全に無視し、一切応答を返しません。攻撃者から見ると、あたかもそのIPアドレスにサーバーが存在しないかのように見える、究極の沈黙です。

ここではシンプルに、f2b-sshdチェーンに登録されているIPアドレスを抜き出し、INPUTチェーンにDROPルールとして追加します。

ざっくり現在fail2banがブロックしているIPアドレスを抜き出します。

8行目を取得

iptables -nvL |egrep '^    0' |awk '{print $8}' |sort
0.0.0.0/0
0.0.0.0/0
0.0.0.0/0
10.0.0.0/8
???.???.???.163
???.???.???.166
???.???.???.167
???.???.???.168
???.???.???.169
???.???.???.170
???.???.???.171
???.???.???.172
???.???.???.173
???.???.???.174
???.???.???.175
???.???.???.176
???.???.???.177

(このコマンドで、ブロック対象のIPアドレスがリストアップされます。)

次に、抽出したIPアドレスに対して、INPUTチェーンに永続的なDROPルールを追加します!いらんやつを、INPUT TABLEでDROPします

iptables -A INPUT -s ???.???.???.163 -j DROP
////省略

これで、fail2banの管理を離れても、このIPアドレスからのパケットは認証プロセスにすら到達せず、サーバーの入り口(INPUTチェーン)で即座に**ドロップ(破棄)**されます。

fail2ban で拒否しているIPアドレスもなくなり、ちょっとすっきりしました。

Chain f2b-sshd (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0  

すべてのブロック対象IPが消え、最後に**RETURN**ルールだけが残ります。これは「次のチェーンに進まず、元のINPUTチェーンに戻るよ」という意味です。

これで、IPアドレスの拒否はINPUTチェーンが担当し、fail2banのリストもスッキリ!よりセキュアに、よりクリーンにサーバーを運用できるようになりましたね!

おまけ2:運用管理のためのコマンド

全体的な動作状況

# fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:   sshd

Fail2banの現在の全体的な動作状況を示しています。

  • Number of jail: 1 現在、Fail2banが監視・実行しているルール(jail)が1つあることを意味します。
  • Jail list: sshd その実行中のルール(jail)の名前が sshd であることを示しています。

現在のステータスを取得

fail2ban-client status sshd

# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     5
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   ?.?.?.88
  • Status for the jail: sshd sshd ルールの状態です。
  • Filter (検知状況)
    • Currently failed: 0 現在(findtime の期間内)カウントされている失敗回数です。「0」は、直近ではBAN条件(maxretry)に達するほどの連続した攻撃がないことを意味します。
    • Total failed: 5 Fail2banが起動してから検知した累計の失敗回数(ログで見つけた回数)です。
    • File list: /var/log/auth.log 現在監視しているログファイルが /var/log/auth.log であることを示しています。
  • Actions (防御状況)
    • Currently banned: 1 現在、1件のIPアドレスがBAN(ブロック)されていることを示しています。
    • Total banned: 1 Fail2banが起動してからBANした累計の回数(IPの延べ数)です。
    • Banned IP list: ?.?.?.88 現在BANされているIPアドレスのリストです。(セキュリティのため一部隠されていますが)末尾が .88 のIPがブロックされています。
タイトルとURLをコピーしました