実は先日サーバーに導入していたFail2BanによるBANが機能していないことに気が付いた
お豆腐サーバーではWebサーバーにやってくるBotなどの攻撃が複数回来たらFail2Banでブロックしていたのだが別件でログを確認していたらブロック後もアクセスが届いているのを発見した
ずっと規定以上にアクセスが続いているのは気づいていたのだがiptablesが更新されるまでのラグだと思っていた
しかしそもそも正常に動作していなかったようだ。ほかのセキュリティが機能しているとはいえ割とショックである
原因
原因はCDNにcloudflareを使っていることにあったようだ
お豆腐サーバーのWEBサービスはクライアントとサーバーの間にcloudflareのサーバーが間に入り通信を行っている
そのため本来はnginxのログにはcloudflareのサーバーIPが記録されるが設定を行いクライアントのIPが表記されるようにしている
ここで大事なのはサーバーと実際に通信を行っているのはcloudflareのサーバーであるがFail2BanがBANするのはnginxのログに記載されたIPアドレスであるということである
つまりサーバー側でクライアントのIPをブロックしても実際にサーバーと通信を行っているのはcloudflareのサーバーなのでBANができていないというわけである
しかしcloudflareのサーバーをBANするわけにはいかないのでどうするか
解決
解決するにはFail2Banのactionを変更する必要がある
WEBサーバーのブロックはcloudflare APIを使いcloudflare側ファイアウォールで防ぐようにすればよい
jail.d/***.conf を下記のように変更する
[web-ban]
enabled = true
port = http,https
filter = nginx-ban
logpath = /var/log/nginx/access.log
action = iptables-multiport[name=404, port="http,https", protocol=tcp]
cloudflare
sendmail-whois-lines[name=nginx-ban, dest=root, sender=fail2ban, logpath=%(logpath)s]
maxretry = 1
bantime = 300
/etc/fail2ban/jail.daction.d/cloudflare.local(cloudflare.confをコピーする)
cfuser = cloudflareへ登録したEメールアドレス
cftoken = グローバルAPIキー
これでcloudflareにBANしたいIPアドレスが伝わりそちらでブロックしてくれる。手動BANやBAN解除も同じコマンドで問題ない
コメント