SELinux 阻止 Fail2Ban 通过 msmtp 发送电子邮件通知

SELinux 阻止 Fail2Ban 通过 msmtp 发送电子邮件通知

我使用 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

相关内容