SELinux impide que Fail2Ban envíe notificaciones por correo electrónico a través de msmtp

SELinux impide que Fail2Ban envíe notificaciones por correo electrónico a través de msmtp

Tengo msmtp como cliente nulo que se conecta a mi cuenta de AWS SES para SMTP y envía alertas como cron, monit y, con suerte, pronto Fail2Ban a mis direcciones de correo electrónico. Sin embargo, Fail2Ban no está jugando a la pelota, o para ser más precisos, selinux está impidiendo que sucedan cosas.

action_mwl funciona bien en modo permisivo. Recibo correos electrónicos de prohibición. En el modo Enforcing, Fail2Ban registra un error y no se envía ningún correo. Se intenta enviarlo, según el registro msmtp, pero no funciona.

Aquí hay una entrada de registro de Fail2Ban (parte de una):

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'

informes 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

No es un problema de configuración de msmtp ni un problema de contenido del cuerpo del correo electrónico, ya que puedo enviar ese mensaje Fail2Ban exacto desde la línea de comando a msmtp (directamente o mediante el enlace simbólico de sendmail) sin problemas y se envía maravillosamente. Las credenciales, etc., por lo tanto, están bien. También funciona vía cron. Lo que significa que tampoco es un problema de firewall.

$ 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

En cárcel.conf:

mta = sendmail

sealert no me da ninguna pista que pueda reconocer o actuar.

He confirmado que fail2ban se ejecuta como root:

$ ps aux | grep fail2ban

Agregué algunos registros adicionales y ahora obtengo esto en /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.

¿Dónde mirar a continuación? ¿Cómo puedo saber que SELinux Fail2Ban puede funcionar bien con msmtp?

Respuesta1

Después de agregar un registro más detallado, obtuve suficientes sugerencias del sistema (y de @Michael Hampton) para resolver esto.

yum install setroubleshoot setools

Esto produce mucha más información en /var/log/messages y ofrece herramientas como:

sealert -a /var/log/audit/audit.log

También:

ausearch -m avc

Estos le darán instrucciones como:

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

Ejecutando el comando sugerido:

sealert -l 78f05dbd-a953-4196-9f14-afaabb5a4d88

Me da:

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

Así que lo hice:

$ grep msmtp /var/log/audit/audit.log | audit2allow -M fail2ban_msmtp

Eché un vistazo para ver lo que creó:

$ vim fail2ban_msmtp.te

Y luego instaló la política, haciéndola persistente al reiniciar:

$ semodule -i fail2ban_msmtp.pp

Luego prohibí una IP aleatoria para activar una prohibición con un correo electrónico para confirmarla y ahora finalmente me envía el correo electrónico deseado a través de msmtp:

$ fail2ban-client set sshd banip 162.229.158.134

¡Presto! Muy fácil, esto de SELinux.

PD Otra forma parece ser (no probada):

$ setsebool -P nis_enabled 1

información relacionada