数日前から、いくつかの IP アドレスから nginx への攻撃を受けています。fail2ban を使用して自動的に禁止することにしましたが、あまりうまく機能していないことに気付きました。ログを見ると、IP アドレスは検出されているものの、期待どおりに禁止されていないことがわかります。
私の刑務所ファイルは次のとおりです:
[nginx-40x-req]
enabled = true
bantime.rndtime = 2800
bantime.increment = true
port = http,https
filter = nginx-40x-req
logpath = /var/log/nginx/access.log
maxretry = 5
私のフィルターは次のようになります:
[Definition]
failregex = ^{"status": (400|401|403), "request_time": [0-9\.]+,\s+"remote_addr": "<HOST>",
私の nginx では、リクエストを検出するためのマップを追加し、検出された場合は 403 を返します。ログは次のようになります。
{"status": 403, "request_time": 0.000, "remote_addr": "xx.xx.xx.xx", "@timestamp": "2021-09-03T18:32:34+02:00", "type": "nginx", "hostname": "vps-e642f340", "host": "d.itsyjd.com", "uri": "/v2/speed_test", "request": "GET https://d.itsyjd.com/v2/speed_test HTTP/1.1", "request_method": "GET", "request_proto": "http", "request_proto_proxy": "-", "request_uri": "/v2/speed_test", "request_args": "-", "server_proto": "HTTP/1.1", "body_bytes_sent": 552, "http_referer": "-", "http_user_agent": "Mozilla/5.0 (Linux; Android 8.0; MHA-AL00 Build/HUAWEIMHA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/044304 Mobile Safari/537.36 (compatible; Baiduspider/2.0;+http://www.baidu.com/search/spider.html)", "msec": 1630686754.923, "upstream_connect_time": -, "upstream_header_time": -, "upstream_response": -, "pipe": "p", "gzip_ratio": "-", "brotli_ratio": "-", "remote_user": "-", "bad_request": "1"}
fail2ban では、IP アドレスが検出されたことを示すメッセージが多数表示されます。
2021-09-03 18:34:31,494 fail2ban.filter [32586]: INFO [nginx-40x-req] Found xx.xx.xx.xx - 2021-09-03 18:29:33
しかし、それらの IP アドレスはまだ禁止されていません。
私が気づいたことの 1 つは、fail2ban の読み取り速度がログ速度よりも遅いことです。そのため、おそらくこれが問題であると考え始めました。なぜなら、それらの IP が禁止され、fail2ban がリアルタイムで読み取りを行うと、別の IP アドレスは問題なく禁止されるからです。Max_retry は 5 で、すべての IP アドレスが 5 回以上検出されたため、それらは禁止されているに違いありません。
私が何を間違っているのか誰か知っていますか(それは確かに私が見ていない何かだからです)。
よろしくお願いします。
編集: このメッセージを書いた後、禁止されていることがわかりましたが、動作が非常に遅いです。約 15 分で約 11 個のうち 4 個の IP アドレスが禁止されましたが、毎秒何度も検出されています。
編集2: 単純な方法でログをクリアすると、echo "" > <logfile>
禁止がトリガーされます。
私のfail2banのバージョンは0.10.2です
問題のある攻撃者が禁止され、リクエストがいくつか届いただけで、fail2ban はリアルタイムで読み取り、禁止しています。
2021-09-03 18:46:13,759 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:46:13
2021-09-03 18:46:13,909 fail2ban.actions [32586]: NOTICE [nginx-40x-req] Ban XX.XX.XX.XX
2021-09-03 18:46:18,855 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:46:18
2021-09-03 18:47:07,004 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:47:06
2021-09-03 18:48:34,390 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:34
2021-09-03 18:48:54,230 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:54
2021-09-03 18:48:54,231 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:54
2021-09-03 18:48:54,231 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:54
2021-09-03 18:48:54,335 fail2ban.actions [32586]: NOTICE [nginx-40x-req] Ban XX.XX.XX.XX
2021-09-03 18:50:08,488 fail2ban.filter [32586]: INFO [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:50:08
だから、問題はおそらく読み取り速度にあるのではないかと私はまだ考えています。
編集3:
最後に、fail2ban のバージョンを 0.11.2 にアップグレードし、日付パターンを追加し、アドレス検出器を変更しました。これで、nginx ファイルの読み取りがかなり高速になったようです。
[Definition]
failregex = ^{"status": (400|401|403), "request_time": [0-9\.]+,\s+"remote_addr": "<ADDR>",
datepattern = "@timestamp": "%%Y-%%m-%%dT%%H:%%M:%%S%%z"
答え1
- アクセスログを監視することはお勧めできません。fail2ban/wiki :: ベストプラクティス特に「寄生的なログトラフィックを削減する」という部分。
- 不適切な正規表現によって、fail2bans の「読み取り速度がログ速度より遅くなる可能性がある」というメッセージが表示されることもあります。正規表現が適切でないとは思えません。ただし、ログ記録形式を変更すれば、高速化できます。また、single と precise を指定すると、
datepattern
処理速度が向上する場合があります。 - 全体として、既知の競合状態を引き起こす可能性があり、fail2banはv.0.10.5まで影響を受けました。https://github.com/fail2ban/fail2ban/issues/2660詳細については(修正はv.0.10.6 / v.0.11.2でリリースされました)
また、同様の問題に対する回答にも注目してください。たとえば、https://github.com/fail2ban/fail2ban/issues/3021#issuecomment-834287295。