GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo leer y corregir los mensajes de denegación 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 la información? ¿Cuáles son algunas de las situaciones anormales, causadas por falsos positivos y negaciones fantasma, en las que podría encontrarse? Exploraremos todo eso aquí.

¿Qué es una denegación?

Una negación es el evento que se genera cada vez que el sistema SELinux niega el acceso a un servicio, aplicación, archivo, etc. Cuando esto sucede, la denegación se almacena en caché en el caché de vector de acceso (AVC). A veces verá un mensaje de denegación denominado denegación de AVC .

¿Dónde se registran las denegaciones?

Ahora, estas denegaciones de AVC, al igual que todo lo demás en Linux, son registradas por el sistema. El lugar donde se registran esos mensajes varía según los demonios del sistema que se estén ejecutando.

  • auditar en - /var/log/audit/audit.log
  • auditoría desactivada; rsyslogd en - /var/log/messages
  • setroubleshootd, rsyslogd y auditd on:ambas ubicaciones, aunque es más fácil entender los mensajes en /var/log/messages

¿Cómo será una denegación?

A veces verá una advertencia de denegación en su escritorio. Cuando selecciona mostrar , esta alerta le brindará detalles sobre lo que salió mal e incluso, a veces, una solución para resolver el problema.

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

[root@server ~]# grep "SELinux is preventing" /var/log/messages

Aquí el resultado está en un lenguaje más accesible y, si lee 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 realmente útil, ya que 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, se le proporciona un resumen muy detallado pero directo de lo que sucedió y lo que puede hacer para solucionar el problema. Visto a continuación:

    [root@server ~]# 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

[ Los lectores también disfrutaron: Acceder a la documentación de políticas de SELinux ]

También puede usar el siguiente comando para los mensajes de auditoría sin procesar, aunque son significativamente menos útiles (y están incluidos en el sealert salida).

[root@server ~]# grep "denied"/var/log/audit/audit.log

Aquí el lenguaje es menos fácil de usar y no hay pasos sugeridos a seguir.

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

Negaciones fantasma

En ocasiones especiales (especial , como en su capacidad de generar frustración), el AVC de SELinux puede denegar un servicio sin alertar al usuario de que se produjo la denegación. Cuando esto sucede, se necesita un poco de investigación forense. Recientemente, mi colega y escritor extraordinario, Ken Hess, instaló un sistema de administración de documentos en una máquina virtual CentOS. Durante esta instalación, el DMS no se pudo instalar sin 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

Tras 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ó este comando:

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

Que proporcionó esta información:

[user@host ~] # 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: [root@dms 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 falta 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 colocándolo en el modo Permisivo, lo cual no es una buena idea porque hacerlo deja su sistema vulnerable. El mejor método es revisar los archivos /var/log/messages y /var/log/audit/audit.log en busca de denegaciones de SELinux y trabajar desde allí para remediar individualmente las denegaciones hasta que su aplicación funcione. SELinux necesita permanecer en el modo de Cumplimiento para hacer esto.

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

1. Compruebe las excepciones del cortafuegos para los puertos de 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 cuando sea 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 de evitar que su aplicación funcione. Una vez que haya determinado que es el problema, regréselo al modo Ejecución y comience a cambiar los contextos relevantes. Consulte esta información para contextos de SELinux.

[ Mejore sus habilidades para administrar y usar SELinux con esta útil guía. ] 

Resumir

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 estar presente 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 cualquier alerta de SELinux que se marque en su sistema.


Linux
  1. Cómo deshabilitar SELinux de forma temporal o permanente

  2. Variables de entorno de Linux:cómo leer y configurar en un VPS de Linux

  3. Cómo leer y escribir en unidades NTFS de Windows como cualquier usuario

  4. ¿Cómo deshabilitar SELinux en CentOS?

  5. ¿Cómo leer los mensajes de syslog de oom-killer?

Cómo instalar y configurar SeedDMS

Solución de problemas y trampas de SELinux

Cómo leer la salida y los usos del comando superior de Linux

Cómo configurar y leer el correo web

Cómo instalar y configurar Grafana

Journalctl:Cómo leer y editar registros de Systemd