在 fail2ban 中回測歷史日誌
設置 我在 ubuntu 伺服器上執行 apache。我創建了一個 fail2ban 規則,當他們請求太多頁面太快時禁止 ip。
# Fail2ban Rule failregex = ^.*?(:80|:443) <HOST> - .* "(GET|POST|HEAD).*$ ignoreregex =.*(.ico|.jpg|.png|.gif|.js|.css|.woff|.mp4) findtime = 30 maxretry = 10
目標:
我想針對這個新的 fail2ban 規則執行一個舊的 apache 日誌,以便我可以查看它是否會禁止任何合法請求。
嘗試#1 我認為我可以使用fail2ban-regex 來獲取可能被禁止的使用者列表,但它沒有該功能。
嘗試#2 我認為將歷史日誌回顯到fail2ban 目前正在觀看的日誌中會使它們被解析。在修復了一個小掛斷後,忽略了具有舊日期的日誌行(通過向它們添加一年來修復)fail2ban 開始解析它們並禁止其中的 IP。但是,我只需要查看第一個被禁止的 IP 就知道它是錯誤的。有問題的 IP 總共只發出了 10 個請求,而且它們在時間上並不接近。我只能假設 fail2ban 沒有使用日誌行的時間戳來確定有效性,這使得這種測試方法失敗了。
# echo example zcat other_vhosts_access.log.8.gz | sed -n 's/\/2022:/\/2032:/p' >> /var/log/apache2/fail2ban_test.log
結論 由於我之前的兩次嘗試都失敗了,我想不出一種理智的方法來解決這個問題。有人可以推荐一種方法來實現我所追求的嗎?或者深入了解為什麼我的第二個解決方案不起作用。
嘗試#1
直接看到它確實沒有,但是……
雖然最新版本的 fail2ban-regex 支持輸出參數,但你可以這樣做:
fail2ban-client set "$jail" banip $( fail2ban-regex -o 'ip' /var/log/path/some.log some-filter | sort --unique | tr '\n' ' ' )
僅當您發現任何 IP 都失敗時才適用,無論計數/時間。在你的情況下,至少沒有一些額外的預處理是沒有意義的。
嘗試#2 我認為將歷史日誌回顯到fail2ban 目前正在觀看的日誌中會使它們被解析。
它不起作用,因為fail2ban不會真正正確地考慮消息的時間:要麼它太舊(如果未修改記錄),要麼它不正確(如果現在記錄為故障時間,因為你需要考慮
maxretry
和findtime
實際使用)。請注意,fail2ban 會now - findtime
從一開始就尋求(因為其他消息對它不感興趣,因為它已經過時了),請參閱https://github.com/fail2ban/fail2ban/issues/2909#issuecomment-758036512。無論如何,目前幾乎不可能使用開箱即用的庫存 fail2bans 工具(至少除非上面 RFE 的這個“重新掃描”工具得到實施和發布)。
但是由於fail2ban(以及
fail2ban-regex
)是python中的一個模組,因此可以使用python中的過濾器將禁令寫入某些日誌或將它們直接發送到主fail2ban實例,請參閱https://github.com/fail2ban/fail2ban/此類腳本範例的問題/2909#issuecomment-1039267423。另請注意,您的過濾器非常脆弱且緩慢,最好盡可能精確地重寫它,就像這裡一樣:
failregex = ^"<ADDR>" \S+ \S+ [^"]*"[A-Z]+ /(?:\S+/)*[^\.]*(?:\.(?!ico|jpg|png|gif|js|css|woff|mp4)\w+)? [^"]+"
最後但並非最不重要的一點是,您為什麼需要它?如果具有此類過濾器的監獄處於活動狀態並且此類爬蟲返回,則在為監獄配置的期間一旦
maxretry
出現故障,它們將被禁止。findtime
預防性禁止並不是真正需要的,只會用大量 IP 打擾您的網路過濾子系統(它們可能永遠不會再回來)。