UFWとFail2BanでSPAMなアクセスとログファイルのサイズを減らしてみたお話。その2 of 2

UFWとFail2BanでSPAMなアクセスとログファイルのサイズを減らしてみたお話。その2 of 2

このお話は全2本立てでお送りします。
この記事ではFail2Banの設定についてお話してます。
UFWについては、UFWとFail2BanでSPAMなアクセスとログファイルのサイズを減らしてみたお話。その1 of 2をご覧ください。

UFWとFail2BanでSPAMなアクセスとログファイルのサイズを減らしてみたお話。その1 of 2
SPAMなアクセスがうざったくて、ポートの制限したはいいけど、今度はファイアウォールのログが肥大化してそれはそれでうざったい。 そんなわがまま要求を、ざっくりてきとうな方法で解決してみるおはなし。

なお、別にUFWと一緒に使わなければならいわけでもないので、Fail2Banだけの設定を見たい人は、この記事だけ読んでもよいと思います。

はじめに

サーバを建ててると、うんざりするほどたくさんのSPAMなアクセスが来ますよね。
規定されてないポートにやってくる子たちは、UFW(Uncomplicated Firewall)で防げばいいじゃんって言えば、それもそうなんですが、UFWってアクセスをブロックするごとにログをつけてくれるんですよね。

ログをつけることそのものは、当たり前だし大事なことなんですが、とはいうものの、延々と同じIPが並んでたりするわけで。しかも毎秒毎秒ログが記録されてたりするから、めちゃくちゃに肥大化するるわけです。
ログが肥大化するのが厭なら止めちゃえばいいじゃんってのも、1つの解な気はしますが、ちょっとこわい。

いずれにせよ、いざ何かが起こったとなった時に、肥大化したログってのはすごく厄介だし、ログがないのも厭っていうわがままセットをどうにか解決しようと思ったわけです。

というわけで、UFWでブロックしたら、その次のタイミングにアクセス自体を止めちゃうってなそんな感じに設計してみました。
iptablesでアクセス止めちゃえば、UFWのログを連投されないし、かなりすっきりします。

なにはともあれインストール

Ubuntuを想定してるけど、そのほかのOSでも似たようなことはできるはずです。
aptなんかを読み替えてやってみてね。

Ubuntu24系でFail2Banが動かないってなことがあったみたいですが、今は動くようになったみたいですね。

$ sudo apt install fail2ban

インストールが終わったら、とりあえずバージョンを見てみる。

$ fail2ban-client version
1.0.2

最新バージョンは 1.0.2でした。

下準備

fail2banをインストールして、まずやるべきは、自分の接続元IPをBANされないようにすることです。
自分がBANされたら、めっちゃ面倒くさいです。だるいです。やる気なくしちゃいます。
なので、真っ先に自分がBANされないようにしましょ。

また、とりあえず触るべき設定ファイルは、jail.confなのですが、このファイル自体には直接触れず、jail.localってな名前のファイルを用意して、必要なことだけを追記していくのが、fail2banの流儀だそうなので、それに従います。

情報収集

まずは、接続先サーバに接続しているIPアドレス(多くの場合には、自分の手元にあるPCのグローバルIP)をnslookupなりなんなりで調べましょう。

💡
ifconfig/ipconfigで出てくるのはローカルIPなので違うよ。 踏み台サーバを使用してる場合にはそのIPが必要。
💡
リモートサーバにipv6で接続してるってな場合にはそちらの情報を使いましょ。

自分をBANしないように設定

先に書いた通り、jail.localに書いていきます。
jail.confをコピーしてきてもいいのですが、コメント部分が多くてうざったいので、新規ファイルを作っちゃいましょう。
新しいコンソール開いて、jail.confを開いて眺めつつ編集するのもよさそうですね。

$ sudo vim /etc/fail2ban/jail.local

とにもかくにも自分がBANされないことを第一目標にします。
ignoreipに、サーバのローカルホスト(ループバック)127.0.0.1/8と、下調べしておいたIPアドレス(例として123.456.78.90と書いてます)をいれましょう。

[DEFAULT]
ignoreip = 127.0.0.1/8 123.456.78.90

とりあえず保存して、これで一安心ですね。

BAN対象の設定

/etc/fail2ban/jail.d/の中に設定ファイルを追加していくことで、BAN対象を追加できます。
以下、UFWとNginxでの例を挙げていますが、これら2つのレクチャを見ることで、fail2banの基本的な使い方が理解できると思います。

💡
jail.localに書いても同じ効果を得られますが、条件が増えてくると見にくくなることがあるあるなので、最初から分けておいた方が無難です。
また、順序としては、jail.confjail.localで上書きし、さらにそれをjail.d/*.confで上書きするといった仕組みになっているようです。

UFW

とりあえず、前回UFWで引っかかった不届き者たちをBAN対象にしてみましょう。

UFWとFail2BanでSPAMなアクセスとログファイルのサイズを減らしてみたお話。その1 of 2
SPAMなアクセスがうざったくて、ポートの制限したはいいけど、今度はファイアウォールのログが肥大化してそれはそれでうざったい。 そんなわがまま要求を、ざっくりてきとうな方法で解決してみるおはなし。
$ sudo vim /etc/fail2ban/jail.d/ufw.conf

開いたら、以下のような感じに書きます。

[ufw]
enabled  = true
filter   = ufw
action   = iptables-allports
logpath  = /var/log/ufw.log
findtime = 3d
maxretry = 3
bantime  = -1

簡単に説明すると。
logpathで指定したログを監視し、findtimeの時間内に、maxretry回失敗したらbantimeの時間(-1は無限)出禁にするってな感じです。
これら時間などはお好みで変更してみてください。

💡
UFWに引っかかるような輩は、ハナからお呼びでないような輩に相違ないので、二度と来るなでいいと思ってます。
action = iptables-allportsを指定することで、iptablesでがっつりお断りするようにしています。

ファイルを保存したら、再起動してみましょう。

$ sudo systemctl restart fail2ban

そして、ちゃんと起動してるかの確認もしときましょ。
もし、ここでufwの文字列が出ない場合には、filterがないのかもしれないです。
この下にfilterについての記載を参考に、追加してみてください。

$ sudo fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:   ufw

また、ufwのフィルタがどんな感じに動いてるかは、以下コマンドで見れます。

$ sudo fail2ban-client status ufw
Status for the jail: ufw
|- Filter
|  |- Currently failed: 43
|  |- Total failed:     69
|  `- File list:        /var/log/ufw.log
`- Actions
   |- Currently banned: 838
   |- Total banned:     838
   `- Banned IP list: ...(ipの羅列)...

滅茶苦茶大量のBANが発生してますね・・。


補足として。
次のnginxでの例で、このフィルターに関しても言及しますが、少しだけ先出し。
このUFWのフィルタリングの実態は、 /etc/fail2ban/filter.d/ufw.confにありあます。
sudo fail2ban-client statusで動かなかった人は、vim /etc/fail2ban/filter.d/ufw.confをして以下を追加してみてください。

[INCLUDES]
before = common.conf
[Definition]
failregex = UFW BLOCK.* SRC=<HOST> DST
ignoreregex = 

failregexでどんなログが来たら<HOST>として引っかけるか、みたいなことが書いてます。
このfailregexに対応するのが、前回もみた、このログに対応してることがわかりますね。

2024-12-24T21:57:10.809000+09:00 serverName kernel: [UFW BLOCK] IN=ens3 OUT= MAC=XX:XX:......:XX SRC=98.76.543.210 DST=123.45.678.90 LEN=40 TOS=0x00 PREC=0x00 TTL=237 ID=54321 PROTO=TCP SPT=49628 DPT=9080 WINDOW=65535 RES=0x00 SYN URGP=0

nginx

ついでに、需要の多そうなnginxも設定しておきましょう。
NGINXでなんだか無限にサーバを叩いてくる輩がいるので、そういった輩を出禁にしましょう。
そして、先ほどは、fail2banをインストールしたらついてきたfilterを使ってみましたが、今度はそのフィルターを作ってみます。

フィルターを追加するには、filter.dというディレクトリに設定ファイルを追加するのですが、今回はnginx-intruder.confという名前で作ってみます。

$ sudo vim /etc/fail2ban/filter.d/nginx-intruder.conf

新しいファイルを作ったら、下記のようなのでよいかと思います。

[Definition]
failregex = ^<HOST>.*"(GET|POST).*" (444|400|405|406|429) .*$
ignoreregex =
💡
444はnginx独自のステータスコード。お返事しないようなものです。 他のステータスコードについては、適当に調べてもらうとして。

403404が含めてないのは、それらステータスコードは普通にサイトを閲覧してたとて、遭遇する(させてしまう)可能性が高いものなので緩めに対応し、逆に今回作っているファイルで挙げているようなものは、普通の人は発生させないようなものなのでキツく対応するといったことを想定しています。

このあと、UFWで説明したのと同じ手順で、/jail.dに設定ファイルを作るのですが、毎回毎回findtimemaxretryなんかを書くのは面倒だし、後で変える時に滅茶苦茶めんどくさくなります。
そうならないために、ここでデフォルト値を設定しておきましょ。

デフォルト値を設定するには、準備段階で自分自身がBANされないために作ったファイルjail.localを開きます。

$ sudo vim /etc/fail2ban/jail.local

このファイルにfindtimemaxretrymaxretryを追記します。

[DEFAULT]
ignoreip = 127.0.0.1/8 123.456.78.90

findtime = 1d
maxretry = 5
bantime = 1d

がっつり[DEFAULT]って書いてますよね。
これで、設定ファイルにfindtimemaxretrymaxretryが書かれていない場合にこの値が採用される状態になりました。


ってことで、/jail.dの設定ファイルを作りましょう。

$ sudo vim /etc/fail2ban/jail.d/nginx.conf

開いたら、以下のような感じに書きます。
先ほど書いたデフォルト値以外がいい場合には、findtimemaxretrymaxretryを記載します。デフォルト値でいいなら、書く必要はないです。

[nginx-intruder]
enabled  = true
port     = http,https
logpath  = /var/log/nginx/access.log

# findtime = 1d # <- デフォルト以外がよければ書く
# maxretry = 5  # <- デフォルト以外がよければ書く
# bantime  = 1d # <- デフォルト以外がよければ書く

ファイルを保存したら、再起動してみましょう。

$ sudo systemctl restart fail2ban

そして、ちゃんと起動してるかの確認もしときましょ。

$ sudo fail2ban-client status
Status
|- Number of jail:      2
`- Jail list:   ufw, nginx-intruder

Number of jailの数とJail listの表記が増えていれば成功です。