使用价值来自 fail2ban 正则表达式

使用价值来自 fail2ban 正则表达式

我正在尝试向我和用户发送电子邮件,告知有人尝试登录他们的 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 的所有消息的日志摘录)。

相关内容