Cómo leer y corregir los mensajes de rechazo de SELinux

Security Enhanced Linux (SELinux) es un marco de seguridad que permite y deniega el acceso a aplicaciones, archivos, etc. dentro de un sistema Linux. Para obtener una descripción general completa de SELinux, consulte ¿Qué es SELinux?

Para este artículo, veremos qué sucede cuando se deniega el acceso a un archivo o aplicación deseada. ¿Qué mensajes verá, dónde se almacenan estos mensajes y qué significa realmente esta información? ¿Cuáles son algunas de las situaciones anormales, causadas por falsos positivos y negaciones fantasmas, en las que podría encontrarse? Exploraremos todo eso aquí.

Índice

¿Qué es una negativa?

A es el evento que se genera cada vez que un servicio, aplicación, archivo, etc. el sistema SELinux le niega el acceso. Cuando esto ocurre, la denegación se almacena en caché en el caché de vectores de acceso (AVC). A veces verá un mensaje de rechazo llamado.

¿Dónde se registran las denegaciones?

Ahora, estas denegaciones de AVC, como todo lo demás en Linux, son registradas por el sistema. La ubicación donde se registran estos mensajes varía según los demonios del sistema en ejecución.

  • auditado en - /var/log/audit/audit.log
  • auditado desactivado; rsyslogd en -/var/log/mensajes
  • setroubleshootd, rsyslogd y auditd on: ambas ubicaciones, aunque los mensajes en /var/log/messages son más fáciles de entender

¿Cómo será una negativa?

A veces verá una advertencia de denegación en su escritorio. cuando seleccionas Fijar, esta alerta le dará detalles de lo que salió mal y, a veces, incluso una solución para solucionar el problema.

Otra cosa que puede hacer es ejecutar los siguientes comandos para extraer los mensajes de denegación:

[[email protected] ~]# grep "SELinux is preventing" /var/log/messages

Aquí el resultado está en un lenguaje más accesible, y si lees detenidamente, se presenta una solución:

Sep 22 13:35:24 server setroubleshoot[3999]: SELinux is preventing rhsmcertd-worke from read access on the file virt.module. For complete SELinux messages run: sealert -l 97a1c0df-81ed-4c08-ba27-41c5067b713b
Sep 22 13:35:24 server platform-python[3999]: SELinux is preventing rhsmcertd-worke from read access on the file virt.module.#012#012*****  Plugin catchall_boolean (89.3 confidence) suggests   ******************#012#012If you want to allow daemons to dump core#012Then you must tell SELinux about this by enabling the 'daemons_dump_core' boolean.#012#012Do#012setsebool -P daemons_dump_core 1#012#012*****  Plugin catchall (11.6 confidence) suggests   **************************#012#012If you believe that rhsmcertd-worke should be allowed read access on the virt.module file by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c 'rhsmcertd-worke' --raw | audit2allow -M my-rhsmcertdworke#012# semodule -X 300 -i my-rhsmcertdworke.pp#012

Esta salida es bastante útil, porque la primera entrada anterior nos da lo siguiente:

For complete SELinux messages run: sealert -l 97a1c0df-81ed-4c08-ba27-41c5067b713b

Si ejecuta el comando sugerido, obtiene un resumen muy detallado pero sencillo de lo que sucedió y lo que puede hacer para resolver el problema. Visto a continuación:

    [[email protected] ~]# sealert -l 97a1c0df-81ed-4c08-ba27-41c5067b713b
    SELinux is preventing rhsmcertd-worke from read access on the file virt.module.
    
    *****  Plugin catchall_boolean (89.3 confidence) suggests   ******************
    
    If you want to allow daemons to dump core
    Then you must tell SELinux about this by enabling the 'daemons_dump_core' boolean.
    
    Do
    setsebool -P daemons_dump_core 1
    
    *****  Plugin catchall (11.6 confidence) suggests   **************************
    
    If you believe that rhsmcertd-worke should be allowed read access on the virt.module file 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:
    # ausearch -c 'rhsmcertd-worke' --raw | audit2allow -M my-rhsmcertdworke
    # semodule -X 300 -i my-rhsmcertdworke.pp
    
    
    Additional Information:
    Source Context                system_u:system_r:rhsmcertd_t:s0
    Target Context                system_u:object_r:root_t:s0
    Target Objects                virt.module [ file ]
    Source                        rhsmcertd-worke
    Source Path                   rhsmcertd-worke
    Port                          <Unknown>
    Host                          server.example.com
    Source RPM Packages           
    Target RPM Packages           
    Policy RPM                    selinux-policy-3.14.3-41.el8_2.5.noarch
    Selinux Enabled               True
    Policy Type                   targeted
    Enforcing Mode                Enforcing
    Host Name                     server.example.com
    Platform                      Linux server.example.com
                                  4.18.0-193.13.2.el8_2.x86_64 #1 SMP Mon Jul 13
                                  23:17:28 UTC 2020 x86_64 x86_64
    Alert Count                   265
    First Seen                    2020-06-24 13:55:40 EDT
    Last Seen                     2020-09-22 13:35:09 EDT
    Local ID                      97a1c0df-81ed-4c08-ba27-41c5067b713b
    
    Raw Audit Messages
    type=AVC msg=audit(1600796109.687:168): avc:  denied  { read } for  pid=3912 comm="rhsmcertd-worke" name="virt.module" dev="dm-0" ino=50331783 scontext=system_u:system_r:rhsmcertd_t:s0 tcontext=system_u:object_r:root_t:s0 tclass=file permissive=0
    
    
    Hash: rhsmcertd-worke,rhsmcertd_t,root_t,file,read

También puede usar el siguiente comando para mensajes de auditoría sin procesar, aunque son significativamente menos útiles (y se incluyen en el sealert salir).

[[email protected] ~]# grep "denied"/var/log/audit/audit.log

El lenguaje aquí es menos fácil de usar y no hay ninguna sugerencia de acción a tomar.

type=AVC msg=audit(1600796109.687:168): avc:  denied  { read } for  pid=3912 comm="rhsmcertd-worke" name="virt.module" dev="dm-0" ino=50331783 scontext=system_u:system_r:rhsmcertd_t:s0 tcontext=system_u:object_r:root_t:s0 tclass=file permissive=0

rechazos de fantasmas

En ocasiones especiales (como en su capacidad de generar frustración), el AVC de SELinux puede rechazar un servicio sin alertar al usuario de que se ha producido la denegación. Cuando esto sucede, se necesita una pequeña búsqueda forense. Recientemente, mi colega y extraordinario escritor Ken Hess instaló un sistema de gestión de documentos en una máquina virtual CentOS. Durante esta instalación, el DMS no se pudo instalar sin una explicación. Después de un largo y frustrante proceso de solución de problemas, Ken descubrió que había mensajes de denegación repetidos en /var/log/audit/audit.log.

type=AVC msg=audit(1602171971.334:438): avc: denied { write } for pid=12398 comm="httpd" name="31b32f0dfa1f50d778065b767582bb9b.js" dev="dm-0" ino=553885 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:httpd_sys_content_t:s0 tclass=file permissive=0

Después de una inspección adicional de /var/log/messages, encontró lo siguiente:

Oct 8 12:33:17 dms python: SELinux is preventing /usr/sbin/httpd from name_connect access on the tcp_socket port 25.#012#012***** Plugin catchall_boolean (32.5 confidence) suggests ******************#012#012If you want to allow httpd to can network connect#012Then you must tell SELinux about this by enabling the 'httpd_can_network_connect' boolean.#012#012Do#012setsebool -P httpd_can_network_connect 1#012#012***** Plugin catchall_boolean (32.5 confidence) suggests ******************#012#012If you want to allow httpd to can sendmail#012Then you must tell SELinux about this by enabling the 'httpd_can_sendmail' boolean.#012#012Do#012setsebool -P httpd_can_sendmail 1#012#012***** Plugin catchall_boolean (32.5 confidence) suggests ******************#012#012If you want to allow nis to enabled#012Then you must tell SELinux about this by enabling the 'nis_enabled' boolean.#012#012Do#012setsebool -P nis_enabled 1#012#012***** Plugin catchall (4.5 confidence) suggests ***************************#012#012If you believe that httpd should be allowed name_connect access on the port 25 tcp_socket by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c 'httpd' --raw | audit2allow -M my-httpd#012# semodule -i my-httpd.pp#012 Oct 8 12:33:20 dms setroubleshoot: SELinux is preventing /usr/sbin/httpd from name_connect access on the tcp_socket port 25. For complete SELinux messages run: sealert -l ce75fc38-5696-4b21-b099-7780db5960f3

Por fin algo útil. Luego ejecutó el siguiente comando:

# sealert -l ce75fc38-5696-4b21-b099-7780db5960f3

Quién proporcionó esta información:

[[email protected] ~] # SELinux is preventing /usr/sbin/httpd from name_connect access on the tcp_socket port 25. ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow httpd to can network connect Then you must tell SELinux about this by enabling the 'httpd_can_network_connect' boolean. Do setsebool -P httpd_can_network_connect 1 ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow httpd to can sendmail Then you must tell SELinux about this by enabling the 'httpd_can_sendmail' boolean. Do setsebool -P httpd_can_sendmail 1 ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow nis to enabled Then you must tell SELinux about this by enabling the 'nis_enabled' boolean. Do setsebool -P nis_enabled 1 ***** Plugin catchall (4.5 confidence) suggests *************************** If you believe that httpd should be allowed name_connect access on the port 25 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: # ausearch -c 'httpd' --raw | audit2allow -M my-httpd # semodule -i my-httpd.pp Additional Information:
    
Additional Information: [[email protected] dms]# more sealert.txt SELinux is preventing /usr/sbin/httpd from name_connect access on the tcp_socket port 25. ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow httpd to can network connect Then you must tell SELinux about this by enabling the 'httpd_can_network_connect' boolean. Do setsebool -P httpd_can_network_connect 1 ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow httpd to can sendmail Then you must tell SELinux about this by enabling the 'httpd_can_sendmail' boolean. Do setsebool -P httpd_can_sendmail 1 ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow nis to enabled Then you must tell SELinux about this by enabling the 'nis_enabled' boolean. Do setsebool -P nis_enabled 1 ***** Plugin catchall (4.5 confidence) suggests *************************** If you believe that httpd should be allowed name_connect access on the port 25 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: # ausearch -c 'httpd' --raw | audit2allow -M my-httpd # semodule -i my-httpd.pp Additional Information: Source Context system_u:system_r:httpd_t:s0 Target Context system_u:object_r:smtp_port_t:s0 Target Objects port 25 [ tcp_socket ] Source httpd Source Path /usr/sbin/httpd Port 25 Host dms Source RPM Packages Target RPM Packages Policy RPM selinux-policy-3.13.1-252.el7.noarch Selinux Enabled True Policy Type targeted Enforcing Mode Permissive Host Name dms Platform Linux dms 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 Alert Count 2 First Seen 2020-10-08 12:33:15 CDT Last Seen 2020-10-08 12:33:15 CDT Local ID ce75fc38-5696-4b21-b099-7780db5960f3 Raw Audit Messages type=AVC msg=audit(1602178395.253:461): avc: denied { name_connect } for pid=12565 comm="httpd" dest=25 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:smtp_port_t :s0 tclass=tcp_socket permissive=1 Hash: httpd,httpd_t,smtp_port_t,tcp_socket,name_connect

Cuando le pedí a Ken que opinara sobre su experiencia, dijo lo siguiente:

Es difícil saber cuándo un error, o la ausencia de un error, es causado por SELinux. Cuando haya verificado las excepciones del firewall, los permisos del sistema de archivos y los requisitos previos de la aplicación, su siguiente paso es verificar los problemas de contexto de SELinux. El remedio más común es deshabilitar SELinux poniéndolo en modo permisivo, lo cual no es una buena idea ya que deja su sistema vulnerable. El mejor método es comprobar los archivos /var/log/messages y /var/log/audit/audit.log en busca de denegaciones de SELinux y, a partir de ahí, remediar las denegaciones individualmente hasta que su aplicación funcione. SELinux debe permanecer en modo de aplicación para hacer esto.

La lista de solución de problemas tiene el siguiente aspecto al configurar una nueva aplicación:

1. Verifique las excepciones del firewall para los puertos en su aplicación.

2. Verifique los permisos del sistema de archivos para asegurarse de que su cuenta de servicio tenga los permisos correctos para leer, escribir y ejecutar si es necesario.

3. Verifique los requisitos previos y las dependencias de su aplicación.

4. Verifique los archivos /var/log/messages y /var/log/audit/audit.log en busca de denegaciones de SELinux.

El modo permisivo de SELinux se puede usar brevemente para verificar si SELinux es el culpable al evitar que su aplicación funcione. Una vez que determine que este es el problema, vuelva a ponerlo en modo Forzar y comience a modificar los contextos relevantes. Consulte esta información para contextos de SELinux.

Conclusión

SELinux es un marco de seguridad efectivo que puede ser increíblemente útil cuando se implementa correctamente. Como con cualquier buen sistema de seguridad, tendrás denegaciones con el tiempo. Saber qué hacer con la información a su disposición es primordial para resolver cualquier problema que pueda presentarse o para permitir procesos legítimos a través del sistema. Ahora sabe dónde se guardan los registros y cómo interpretarlos mejor. En el futuro, podrá responder a todas las alertas de SELinux reportadas en su sistema.

Artículos de interés

Subir