Назад | Перейти на главную страницу

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?

После добавления более подробного ведения журнала я получил достаточно подсказок от системы (и от @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