我如何格式化這個正則表達式以便它可以在fail2ban中工作?
我剛剛在我的 CentOS 伺服器上安裝了 fail2ban,以響應 SSH 蠻力嘗試。fail2ban 的 sshd.conf 文件中的預設正則表達式與 audit.log 中的任何條目都不匹配,這是 SSH 似乎記錄所有連接嘗試的地方,所以我試圖添加一個匹配的表達式。
我要匹配的字元串如下:
type=USER_LOGIN msg=audit(1333630430.185:503332): user pid=30230 uid=0 auid=500 subj=user_u:system_r:unconfined_t:s0-s0:c0.c1023 msg='acct="root": exe="/usr /sbin/sshd" (hostname=?, addr=<HOST IP>, terminal=sshd res=failed)'
我試圖使用的正則表達式是:
^.*addr=<HOST>, terminal=sshd res=failed.*$
我使用 regextester.com 和 regexr 來嘗試建構正則表達式。測試人員給了我這個正則表達式的匹配項:
^.*addr=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}, terminal=sshd res=failed.*$
但是如果我不在正則表達式中使用<HOST>
標籤,fail2ban-regex 就會抱怨。但是,使用^.*addr=<HOST>, terminal=sshd res=failed.*$
給了我 0 個匹配項。在這一點上,我完全陷入困境,我將非常感謝任何幫助。我在嘗試使用的正則表達式中做錯了什麼?
顯然這是 RTFM 的一個案例。經過一段時間的探勘,我在fail2ban網站上找到了一個頁面,該頁面聲明它每行進行兩個正則表達式匹配,一個用於時間戳,一個用於時間戳後面的行的其餘部分。audit.log 中的時間戳採用 Epoch 格式,顯然第一次正則表達式匹配失敗。使用 fail2ban-regex 將 /var/log/secure 與我的 fail2ban sshd.conf 文件進行比較會產生所需的行為。
正確的解決方案是將我的 jail.conf 的相應部分指向 /var/log/secure。
對於仍然想自己製作正則表達式的人,這部分有很多很好的資訊,包括這個最終幫助我解決這個問題的小花絮:
為了讓日誌行匹配你的failregex,它實際上必須匹配兩部分:行的開頭必須匹配時間戳模式或正則表達式,並且行的其餘部分必須匹配你的failregex。如果失敗正則表達式使用前導 ^ 進行錨定,則錨點指的是行剩餘部分的開始,在時間戳和中間空格之後。
我希望我的 RTFM 時刻能幫助一些人。