SELinux 阻止 Fail2Ban 透過 msmtp 發送電子郵件通知

SELinux 阻止 Fail2Ban 透過 msmtp 發送電子郵件通知

我將 msmtp 作為空白客戶端連接到我的 AWS SES 帳戶以進行 SMTP,將 cron、monit 等警報發送到我的電子郵件地址,希望很快能將 Fail2Ban 發送到我的電子郵件地址。然而,Fail2Ban 並沒有發揮作用,或者更準確地說,selinux 正在阻止事情的發生。

action_mwl 在寬容模式下運作得很好。我收到禁止電子郵件。在強制模式下,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 設定問題,也不是電子郵件正文內容問題,因為我可以從命令列管道將確切的 Fail2Ban 訊息發送到 msmtp(直接或透過 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

相關內容