Fail2Banがブロックしてくれない cloudflare編

nginx

実は先日サーバーに導入していた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解除も同じコマンドで問題ない

コメント

タイトルとURLをコピーしました