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 from=me@myserver.com recipients=my.name@gmail.com 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
Presto! Так просто, этот материал SELinux.
PS Другим способом кажется (не проверено):
$ setsebool -P nis_enabled 1