使用來自 fail2ban 正則表達式的 <F-USER> 值
我正在嘗試向我和使用者發送電子郵件,有人試圖登錄他們的 ssh 並失敗 - IP 被禁止。但我不明白如何在我嘗試發送的電子郵件中使用該變數。
Sendmail 設置正確,因為電子郵件發送沒有問題。
這是我的 jail.local 配置
[sshd] port = ssh logpath = %(sshd_log)s backend = %(sshd_backend)s action = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"] %(mta)s-whois-lines-ssh[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s"]
這是我的 action.d/sendmail-whois-lines-ssh.conf
[INCLUDES] before = sendmail-common.conf helpers-common.conf [Definition] norestored = 1 actionban = ( printf %%b "Subject: [Fail2Ban] <name>: banned <ip> from <fq-hostname> Date: `LC_ALL=C date +"%%a, %%d %%h %%Y %%T %%z"` From: <sendername> <<sender>> To: <dest>, <F-USER>@mydomain.cz\n Hi,\n The IP <ip> has just been banned by Fail2Ban after <failures> attempts against <name>.\n\n Here is more information about <ip> :\n `/usr/bin/whois <ip> || echo missing whois program`\n\n Lines containing failures of <ip>\n"; %(_grep_logs)s; printf %%b "\n Regards,\n Fail2Ban" ) | /usr/sbin/sendmail -f <sender>.mydomain.cz <dest> <F-USER>@mydomain.cz [Init] name = default logpath = /dev/null
發送給我的電子郵件很好,因為從配置中正確獲取,但 <F-USER> 沒有價值,因此它被發送到@mydomain.cz
我怎樣才能獲得價值,以便能夠將電子郵件發送給使用者?
編輯 在 SSH 上受到打擊的正則表達式是這個:
^pam_unix\(sshd:auth\):\s+authentication failure;\s*logname=\S*\s*uid=\d*\s*euid=\d*\s*tty=\S*\s*ruser=<F-USER>\S*</F-USER>\s*rhost=<HOST>\s.*%(__suff)s$
我正在嘗試向我和使用者發送電子郵件,有人嘗試登錄他們的 ssh 並失敗
我對這種方法幾乎沒有疑問,例如可能由此引入的某些“漏洞” - RE
<F-USER>\S*</F-USER>
將匹配任何內容,直到第一個空格,因此例如,如果匹配的“使用者名”將是someone@example.com,test
您的郵件也將被發送到someone@example.com
,這可能是不是您域的使用者。我還可以想像另一種情況,因為您試圖在郵件操作中使用外部輸入(來自日誌) - 所以最好確保這不受某些注入可能性的影響(例如,還要注意GHSA-m985-3f3v-cwmm)。在 SSH 上受到打擊的正則表達式是這個……
failregex 還必須包含
<F-USER>...</F-USER>
以擷取將儲存為使用者名的值,並且它必須匹配某些內容。這是它在目前版本中的外觀範例(請注意,它不是由於
<F-NOFAIL>
標籤而導致的失敗 RE,它只是為沒有 IP 的消息查找 IP 的助手,有關詳細資訊,請參閱問題/3189#issuecomment-999571654)。因此,如果部分匹配空值,則
<F-ALT_USER>
有一個替代使用者名並將其儲存到F-USER
票證中擷取的組中。<F-USER>...</F-USER>
也許(就像上面的問題/3189)你也有錯誤的後端,所以切換到
systemd
可以幫助你使用另一個 sshd-regex 匹配它。與您的正則表達式相關,它可以像這裡一樣更改(從目前的 sshd-filter 向後移植):
- ^pam_unix\(sshd:auth\):\s+authentication failure;\s*logname=\S*\s*uid=\d*\s*euid=\d*\s*tty=\S*\s*ruser=<F-USER>\S*</F-USER>\s*rhost=<HOST>\s.*%(__suff)s$ + ^pam_unix\(sshd:auth\):\s+authentication failure;(?:\s+(?:(?:logname|e?uid|tty)=\S*)){0,4}\s+ruser=<F-ALT_USER>\S*</F-ALT_USER>\s+rhost=<HOST>(?:\s+user=<F-USER>\S*</F-USER>)?%(__suff)s$
但這更像是
pam-generic
過濾器/監獄的 RE,正如在issues/3189中已經說過的,因此將其用於 sshd 監獄並不完全正確(通常您會在日誌或 auth.log 中看到不同的消息)。無論如何,要深入調查,需要消息範例(或者更好的日誌摘錄,其中包含導致禁令的所有 sshd-session 消息)。