我使用 msmtp 作为空客户端连接到我的 AWS SES 帐户进行 SMTP 传输,向我的电子邮件地址发送 cron、monit 等警报,希望很快还会发送 Fail2Ban。但是,Fail2Ban 不起作用,或者更准确地说,selinux 阻止了事情发生。
action_mwl 在 Permissive 模式下工作正常。我收到了封禁电子邮件。在 Enforcing 模式下,Fail2Ban 记录错误,并且没有发送任何邮件。根据 msmtp 日志,尝试发送邮件,但没有成功。
以下是 Fail2Ban 日志条目(的一部分):
2015-09-29 12:25:12,543 fail2ban.actions [31113]: ERROR Failed to execute ban jail 'wordpress' action 'sendmail-whois-lines' info 'CallingMap({'ipjailmatches': <function <lambda> at 0x2c5ac08>, 'matches': u'
msmtp 报告:
Sep 29 12:25:12 host=email-smtp.eu-west-1.amazonaws.com tls=on auth=on user=12345 [email protected] [email protected] errormsg='cannot connect to email-smtp.eu-west-1.amazonaws.com, port 587: Permission denied' exitcode=EX_TEMPFAIL
这不是 msmtp 配置问题,也不是电子邮件正文内容问题,因为我可以从命令行管道向 msmtp 发送该确切的 Fail2Ban 消息(直接发送,或通过 sendmail 符号链接发送),而且发送效果很好。因此,凭证等都没问题。也可以通过 cron 工作。这意味着它也不是防火墙问题。
$ sudo ls -lZ /usr/bin/msmtp
-rwxr-xr-x. root root system_u:object_r:bin_t:s0 /usr/bin/msmtp
$ sudo ls -lZ /usr/bin/sendmail
lrwxrwxrwx. root root unconfined_u:object_r:bin_t:s0 /usr/bin/sendmail -> /usr/bin/msmtp
在jail.conf中:
mta = sendmail
sealert 没有给我任何我能识别的提示或行动。
我已经确认fail2ban以root身份运行:
$ ps aux | grep fail2ban
我添加了一些额外的日志记录,现在将其保存在 /var/log/messages 中
Sep 29 16:11:15 ip-172-31-6-51 setroubleshoot: SELinux is preventing /usr/bin/msmtp from name_connect access on the tcp_socket port 587. For complete SELinux messages. run sealert -l 78f05dbd-a953-4196-9f14-afaabb5a4d88
Sep 29 16:11:15 ip-172-31-6-51 python: SELinux is preventing /usr/bin/msmtp from name_connect access on the tcp_socket port 587.
下一步该看哪里?我如何知道 SELinux Fail2Ban 可以与 msmtp 很好地配合?
答案1
添加更多详细日志记录后,我从系统(和@Michael Hampton)获得了足够的提示来解决这个问题。
yum install setroubleshoot setools
这会在 /var/log/messages 中产生更多信息,并提供以下工具:
sealert -a /var/log/audit/audit.log
还:
ausearch -m avc
这些将为你提供如下说明:
Sep 29 16:11:15 ip-172-31-6-51 setroubleshoot: SELinux is preventing /usr/bin/msmtp from name_connect access on the tcp_socket port 587. For complete SELinux messages. run sealert -l 78f05dbd-a953-4196-9f14-afaabb5a4d88
运行建议的命令:
sealert -l 78f05dbd-a953-4196-9f14-afaabb5a4d88
给我:
If you believe that msmtp should be allowed name_connect access on the port 587 tcp_socket by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep msmtp /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
所以我做了:
$ grep msmtp /var/log/audit/audit.log | audit2allow -M fail2ban_msmtp
我看了一下它创建了什么:
$ vim fail2ban_msmtp.te
然后安装该策略,使其在重启后持久生效:
$ semodule -i fail2ban_msmtp.pp
然后我禁止了一个随机 IP,以通过电子邮件触发禁令,以确认它现在终于通过 msmtp 向我发送了所需的电子邮件:
$ fail2ban-client set sshd banip 162.229.158.134
瞧!SELinux 的东西太简单了。
PS 另一种方法似乎是(未经测试):
$ setsebool -P nis_enabled 1