Linux

fail2ban 奇怪的禁令行為禁止不正確的 IP

  • April 15, 2021

我試圖通過fail2ban 禁止所有可疑的403 錯誤。

所以我創造了這個監獄

# block 403 errors
[apache-403]
enabled = true
filter = apache-403
port = http,https
logpath = /var/log/apache2/other_vhosts_access.log
bantime = 3600
maxretry = 5
ignoreip = 127.0.0.1/8 37.4.226.100

使用此過濾器規則

failregex = <HOST> .* "(GET|POST|HEAD) .* HTTP/1\.[01]" 403 .*

現在我檢查fail2ban-client status apache-403了監獄並得到了這個

Status for the jail: apache-403
|- Filter
|  |- Currently failed: 0
|  |- Total failed: 51
|  `- File list:    /var/log/apache2/other_vhosts_access.log
`- Actions
  |- Currently banned: 1
  |- Total banned: 1
  `- Banned IP list:   de:443

但是 de:443 不是 IP……那麼問題出在哪裡?

特定的日誌行如下所示:

jotoma.de:443 45.133.192.140 - - [15/Apr/2021:01:42:42 +0200] "POST /wp-login.php HTTP/1.1" 403 10297 "-" "Mozilla/5.0 (Linux; Android 6.0.1; SM-G610M Build/MMB29K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/65.0.3325.109 Mobile Safari/537.36 Instagram 41.0.0.13.92 Android (23/6.0.1; 480dpi; 1080x1920; samsung; SM-G610M; on7xelte; samsungexynos7870; pt_BR; 103516666)"

我現在必須做什麼來糾正它?在讓這個過濾規則起作用之前我遇到了一個大問題,但現在它起作用了,但似乎是錯誤的。

這裡的問題是您的“易受攻擊的”正則表達式(沒有錨定,有許多包羅萬像等)以及標籤<HOST>僅匹配 IP 地址的無效假設(它也可以匹配主機名)。您確實可以強制 fail2ban 僅匹配 IP 地址,方法是禁用選項usedns或使用另一個標籤<ADDR>而不是<HOST>.

但與其相反,最好使用錨定和更精確的正則表達式:

failregex = ^(?:\S+:\d+ )?<ADDR> \S+ \S+ \[\] "[A-Z]+ /[^"]* \S+" 403\b

(如果您的 fail2ban 版本小於 v.0.10 <ADDR>,請替換標籤)。<HOST>

另請注意,根本不建議在消息中間使用時間戳,最好重新配置 apache 日誌格式以將其放在行首,這樣會產生類似的結果:

[15/Apr/2021:01:42:42 +0200] srv:443 192.0.2.1 - - "POST /wp-login.php HTTP/1.1" 403 ...

在這種情況下,你的監獄可能看起來像這樣:

[apache-403]
enabled = true
filter =
datepattern = ^\[%%d/%%b/%%Y:%%H:%%M:%%S(?:[.,]%%f)?(?: %%z)?\]
failregex = ^\s*(?:\S+:\d+ )?<ADDR> \S+ \S+ "[A-Z]+ /[^"]* \S+" 403\b
...

(使用單datepattern也錨定在行首)。

另外,由於您似乎直接監視訪問日誌,請閱讀Fail2ban :: wiki :: Best practice,因為它根本不是推薦的策略。

引用自:https://serverfault.com/questions/1060455