Apache 存取日誌

Apache 存取日誌

我使用fail2ban 來偵測對我的任何託管網域的惡意請求,該方法運作良好,但有一個例外。

如果請求傳送到 IP 而不是 FQDN 或子網域,則會被擷取並寫入 other_vhosts_access.log,因為 IP 本身不是虛擬主機。

範例條目:

somedomain.de:80 20.37.96.167 - - [24/Jan/2020:15:47:04 +0100] “POST //4walls/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/ 1.1" 301 587 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, 如 Gecko) Chrome/79.0.3945.88 Safari/537.36"

看來,apache 對 IP 進行了反向查找,並首先記下了主機名稱。

這會導致fail2ban自我禁止伺服器IP而不是請求者IP。

如何阻止 somedomain.de:80 條目?

答案1

apache 對 IP 進行反向查找並先記下主機名稱。

如果您的篩選器製作正確(例如,沒有包羅萬象的錨定正規表示式),那麼無論網域和外部位址具體寫在哪裡,它都不會發生。

我假設在您的範例日誌條目中,這somedomain.de是您的並且20.37.96.167是“入侵者”的地址。那麼正確的失敗正規表示式將如下所示:

# ban everything (with code 300-599):
failregex = ^\S+\s+<ADDR>\s+\S+\s+\S+\s+\[\]\s+"[^\"]+" [345]\d+

錨定部分^\S+\s+<ADDR>匹配somedomain.de:80 20.37.96.167,並且僅由於錨點而從頭開始搜尋字串^
如果您必須禁止所有內容other_vhosts_access.log(無論產生的 http 狀態),這作為正規表示式也足夠了。

如果您的fail2ban版本<= 0.9,請使用<HOST>而不是<ADDR>.

您也可以檢查fail2ban-regex它是否會捕獲一些誤報,例如:

fail2ban-regex --raw -vv /path/to/log '^\S+\s+<ADDR>\s+\S+\s+\S+\s+\[\]\s+"[^\"]+" [345]\d+' \
  | grep <your-IP-or-hostname>

相關內容