我有一个使用 ansible 和 vagrant 的设置来测试安装和配置 fail2ban 的自定义角色。
我已经编写了一个简单的测试剧本,它使用角色fail2ban
并按预期应用必要的配置。但我的意图是还编写几行代码来执行集成测试,例如模拟几次“登录失败”尝试。
据我所见如何从命令行向 systemd 日志发送消息?,应该能够做这样的事情:
echo "Failed password for root from 1.2.3.4 port 35720 ssh2" | systemd-cat -t sshd -p err
这确实出现在journalctl -f
日志中,但不知何故根本没有出现fail2ban
:
fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 7
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 0
|- Total banned: 1
`- Banned IP list:
上面的统计数据来自我自己的登录失败。
我也尝试了不同的日志级别(例如,,,,crit
等),但没有任何效果。我在这里做错了什么吗?err
info
warning
答案1
经过无数个小时的阅读和大量文档后,我终于弄清楚了这一点man
:
一旦您浏览文档中的大量页面,您就会发现您可以执行如下操作:
journalctl --facility=auth --since -5m --output=export
这将显示原始消息及其所有元数据。以 开头的属性_
被视为“受信任”且无法操纵(它们由 syslog 或 journald 指定)。
以下是示例消息:
_SYSTEMD_SLICE=system.slice
_CAP_EFFECTIVE=3fffffffff
SYSLOG_FACILITY=4
_TRANSPORT=syslog
SYSLOG_IDENTIFIER=sshd
_COMM=sshd
_EXE=/usr/sbin/sshd
_SYSTEMD_CGROUP=/system.slice/ssh.service
_SYSTEMD_UNIT=ssh.service
_SYSTEMD_INVOCATION_ID=f29bc3ffcdce4a2dbeb18fe53ac7fea9
_CMDLINE=sshd: root [priv]
SYSLOG_PID=7021
SYSLOG_TIMESTAMP=Aug 6 11:18:42
_PID=7021
MESSAGE=Connection closed by authenticating user root 192.168.121.1 port 54666 [preauth]
_SOURCE_REALTIME_TIMESTAMP=1659784722477758
在fail2ban
日志匹配过滤器中是_SYSTEMD_UNIT=sshd.service + _COMM=sshd
。因此,我无法模拟登录失败。因此,我不得不将过滤器更改为journalmatch = SYSLOG_IDENTIFIER=sshd + SYSLOG_FACILITY=4
(位于filers/sshd.conf
)。
完成此操作后,我就可以使用以下命令轻松模拟登录失败消息:
logger --journald <<END
SYSLOG_FACILITY=4
SYSLOG_IDENTIFIER=sshd
MESSAGE=Failed password for root from 172.31.255.254 port 54666 ssh2
PRIORITY=6
END
瞧——集成测试完成了。
Every 2.0s: fail2ban-client status sshd localhost: Sat Aug 6 12:00:22 2022
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 1110
| `- Journal matches: SYSLOG_IDENTIFIER=sshd + SYSLOG_FACILITY=4
`- Actions
|- Currently banned: 1
|- Total banned: 8
`- Banned IP list: 172.31.255.254