幾天以來,我收到了一些 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位址。
我注意到的一件事是fail2ban讀取速度比日誌速度慢,所以我開始認為這可能是問題所在,因為當這些IP被禁止並且fail2ban即時讀取時,另一個IP位址被禁止沒有問題。 max_retry為5,所有IP位址被偵測超過5次,因此必須被禁止。
任何人都知道我可能做錯了什麼(因為肯定是我沒有看到的事情)。
此致。
編輯:寫完此訊息後,我看到這是禁止的,但運行速度非常慢。在大約 15 分鐘內就禁止了大約 11 個 IP 位址中的大約 4 個,而每秒鐘它們都會被偵測到很多次。
EDIT2:用簡單的方法清除日誌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“讀取速度可能比日誌速度慢”,只是我沒有看到你的RE不好。但它可以做得更快,只是您需要為此更改日誌記錄格式。此外,指定 single 和 precision
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。