![使用价值来自 fail2ban 正则表达式](https://linux22.com/image/773773/%E4%BD%BF%E7%94%A8%E4%BB%B7%E5%80%BC%E6%9D%A5%E8%87%AA%20fail2ban%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.png)
我正在尝试向我和用户发送电子邮件,告知有人尝试登录他们的 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$
答案1
我正在尝试向我和用户发送电子邮件,告知有人尝试登录他们的 ssh 但失败了
我对这种方法有一些疑问,例如可能由此引入的某些“漏洞”——RE<F-USER>\S*</F-USER>
会匹配第一个空格之前的所有内容,因此例如如果匹配的“用户名”将是[email protected],test
您的邮件也将发送到[email protected]
,这可能不是您域的用户。我还可以想象另一种情况,因为您试图在邮件操作中使用外部输入(来自日志)——因此最好确保这不受某些注入可能性的影响(还要注意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>
也许(如上面的 issues/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$
但这更像是过滤器/监狱的 RE pam-generic
,正如在问题/3189,因此将其用于 sshd jail 并不完全正确(通常您会在 journal 或 auth.log 中看到不同的消息)。
无论如何,要深入调查,需要消息示例(或者更好的是包含导致禁止的 sshd-session 的所有消息的日志摘录)。