
我正在openSMPTD
運行一個郵件伺服器。目前看來我正在遭受暴力攻擊,儘管我懷疑他們會進入。我正在配置fail2ban
禁止違規者。但是,我無法完全獲得正確的正規表示式,這讓我發瘋!我看見freeBSD 論壇上的這個鏈接關於fail2ban
正規表示式來捕獲它。然而,即使該正則表達式似乎也沒有捕獲他們提供的範例文字。我編輯了他們的正則表達式但無濟於事。我希望有人能給我一些指示,因為我在正規表示式方面非常薄弱。
我的日誌檔如下所示:
Dec 25 20:03:29 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp connected address=193.169.254.42 host=<unknown>
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp tls ciphers=TLSv1.2:ECDHE-RSA-AES128-SHA256:128
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp authentication user=info result=permfail
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp failed-command command="AUTH LOGIN (password)" result="535 Authentication failed"
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp disconnected reason=quit
"
那麼讓我們來分解一下:顯示它們是暴力破解的行是:
f7fa148a43b34578 smtp failed-command command="AUTH LOGIN (password)" result="535 Authentication failed"
我們看到身份驗證失敗的地方。然而,奇怪的是,openSMTPD 並沒有在該行中包含要禁止的 IP 位址:我們必須查看其上方的可變數字:
f7fa148a43b34578 smtp connected address=193.169.254.42 host=<unknown>
我們可以在其中看到犯罪者的 IP 位址。好吧,很公平。我目前選擇所有文字的正規表示式是:
^.*smtp connected address=\w[1-9.]* host=[a-z<>]*\n*[a-zA-Z0-9_.-\s\]\[:=<>"()]*
雖然fail2ban
想要一個更細粒度的。我不確定我是否有一種乾淨的方法來禁止適當的 IP 位址,因為有可能兩個人同時連接,然後選擇錯誤的線路來禁止。
有什麼建議麼?
答案1
使用多行正規表示式的更新且更乾淨的方法是使用版本<F-...>
中引入的標籤0.10.0
,但不幸的是仍然沒有很好的記錄。
[Definition]
prefregex = <F-MLFID>: \w{16} </F-MLFID><F-CONTENT>.+</F-CONTENT>$
failregex = <F-NOFAIL>smtp connected address=(?:<IP6>|<IP4>)</F-NOFAIL>
smtp failed-command command="AUTH LOGIN \(password\)" result="535 Authentication failed"
<F-NOFAIL><F-MLFFORGET>smtp disconnected</F-MLFFORGET></F-NOFAIL>
解釋
預過濾器正規表示式用於預處理每一行並捕獲會話 ID(我假設它是一部分)f7fa148a43b34578
,並識別跨越多行的相同會話。裡面的文字<F-CONTENT>
是我們感興趣的部分,將由failregex 處理。
在失敗正規表示式中,第一的一個將線路與 IP 位址相符(如果要發布禁令,則需要該位址),並且將其包含在標籤中<F-NOFAIL>
以指示該線路不被視為故障。這第二regex 是實際的身份驗證失敗,如果匹配,則fail2ban 將阻止先前捕獲的IP 位址。這最後的其中一個被指令包圍<F-MLFFORGET>
,表示是時候刪除捕獲的連接 ID(因為用戶已斷開連接),並且它也包含在<F-NOFAIL>
標籤之間,因為該行本身也不是失敗。
您可以使用該fail2ban-regex
工具來測試這一點。
我明白為什麼連結論壇帖子中的正規表示式對您不起作用;該字串有多個部分不同。因此,如果您想匹配更通用的情況,顯然您需要更改上面的第二個failregex(我沒有使用opensmtpd,所以我無法幫助您)。