Resolución de problemas de SELinux
- DESCRIPCIÓN
Un sistema con SELinux en el modo
enforcingpuede provocar denegaciones de acceso que pueden impedir que las aplicaciones se ejecuten correctamente. Puede utilizaraudit2allowosetroubleshootpara analizar los mensajes de denegación de forma sencilla.- INTENCIÓN
Este artículo proporciona instrucciones sobre cómo resolver las denegaciones de acceso causadas por SELinux sin disminuir la seguridad del sistema.
- ESFUERZO
Se tardan aproximadamente 30 minutos en leer el artículo.
- OBJETIVO
Podrá utilizar una de las herramientas descritas a continuación para depurar las denegaciones de SELinux.
- REQUISITOS
Un sistema en ejecución con SELinux habilitado.
1 El archivo /var/log/audit/audit.log #
Por defecto, si SELinux es la razón por la que algo no funcione, se envía un mensaje de registro al archivo /var/log/audit/audit.log.
/var/log/audit/audit.log vacío
Si ve un registro /var/log/audit/audit.log vacío, normalmente significa que el servicio auditd no se está ejecutando. En tal caso, haga lo siguiente:
Inicie el servicio
auditd:>sudosystemctl start auditdHabilite el servicio en los destinos del sistema mediante:
>sudosystemctl enable auditd
En el archivo /var/log/audit/audit.log se almacenan los mensajes de denegación de acceso, eventos de servicio, etc.
En el Ejemplo 1: “Líneas de ejemplo de /etc/audit/audit.log”, puede ver un ejemplo parcial del contenido de /var/log/audit/audit.log.
/etc/audit/audit.log #type=DAEMON_START msg=audit(1348173810.874:6248): auditd start, ver=1.7.7 format=raw kernel=3.0.13-0.27-default auid=0 pid=4235 subj=system_u:system_r:auditd_t res=success
type=AVC msg=audit(1348173901.081:292): avc: denied { write } for pid=3426 comm="smartd" name="smartmontools" dev=sda6 ino=581743 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=dir
type=AVC msg=audit(1348173901.081:293): avc: denied { remove_name } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state~" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=dir
type=AVC msg=audit(1348173901.081:294): avc: denied { unlink } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state~" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:295): avc: denied { rename } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" dev=sda6 ino=582373 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:296): avc: denied { add_name } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state~" scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=dir
type=AVC msg=audit(1348173901.081:297): avc: denied { create } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:298): avc: denied { write open } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:299): avc: denied { getattr } for pid=3426 comm="smartd" path="/var/lib/smartmontools/smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.309:300): avc: denied { append } for pid=1316Un solo mensaje tiene el aspecto siguiente:
type=AVC msg=audit(1348173901.081:299): avc: denied { getattr } for pid=3426 comm="smartd" path="/var/lib/smartmontools/smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=fileCada línea del mensaje se puede dividir en secciones. Por ejemplo, las secciones de la última línea son:
type=AVC:Cada línea de registro de auditoría relacionada con SELinux comienza con la identificación del tipo, por ejemplo,
type=AVC. Tenga en cuenta que un mensaje con el tipotype=SYSCALLque sigue a otro con un tipo diferente y tiene el mismo valor demsgpuede proporcionar más información sobre el evento.msg=audit(1348173901.309:300):Esta es la marca horaria, que se escribe en tiempo de época, el número de segundos que han transcurrido desde el 1 de enero de 1970. Puede utilizar
date -den la parte situada delante del punto de la notación de tiempo de época para averiguar cuándo se produjo el evento:>date -d @1348173901Thu Sep 20 16:45:01 EDT 2012avc: denied { append }:La acción específica que se ha denegado. En este caso, el sistema ha denegado la adición de datos a un archivo. Mientras examina el archivo de registro de auditoría, puede ver otras acciones del sistema, como write open, getattr y más.
for pid=1316:El ID de proceso del comando o proceso que inició la acción.
comm="rsyslogd":El comando específico que estaba asociado con ese PID.
name="smartmontools":El nombre del sujeto de la acción.
dev=sda6 ino=582296:El dispositivo de bloque y el número de inodo del archivo implicado.
scontext=system_u:system_r:syslogd_t:El contexto de origen, que es el contexto del iniciador de la acción.
tclass=file:Una identificación de clase del sujeto.
2 Análisis de /var/log/audit/audit.log con audit2allow #
En lugar de interpretar los eventos de /var/log/audit/audit.log por sí mismo, puede utilizar el comando audit2allow.
El comando ayuda a analizar los mensajes de registro crípticos de /var/log/audit/audit.log. Una sesión de resolución de problemas de audit2allow siempre consta de tres comandos diferentes. En primer lugar, utilizaría audit2allow -w
-a para presentar la información de auditoría de una forma más fácil de leer. Por defecto, audit2allow -w -a funciona en el archivo audit.log. Si desea analizar un mensaje específico del archivo audit.log, cópielo en un archivo temporal y analice el archivo con:
>sudoaudit2allow -w -i FILENAME
>sudoaudit2allow -w -i testfiletype=AVC msg=audit(1348173901.309:300): avc: denied { append } for pid=1316 comm="rsyslogd" name="acpid" dev=sda6 ino=582296 scontext=system_u:system_r:syslogd_t tcontext=system_u:object_r:apmd_log_t tclass=file
- Esto ha sido causado por:
Falta una regla de acceso de aplicación de tipo (TE).
Para generar un módulo cargable que permita este acceso, ejecute:
>sudoaudit2allow
Para averiguar qué regla específica ha denegado el acceso, puede utilizar audit2allow -a para mostrar las reglas de aplicación de todos los eventos que se registraron en el archivo audit.log , o audit2allow -i FILENAME para mostrarlo para los mensajes que ha almacenado en un archivo específico:
>sudoaudit2allow -i testfile#============= syslogd_t ============== allow syslogd_t apmd_log_t:file append;
Para crear un módulo SELinux con el nombre mymodule que pueda cargar para permitir el acceso que se ha denegado anteriormente, ejecute:
>sudoaudit2allow -a -R -M mymodule
Si desea hacer esto para todos los eventos que se han registrado en el archivo audit.log, utilice los argumentos del comando -a -M. Para hacerlo solo para mensajes específicos que se encuentren en un archivo específico, utilice -i -M como en el ejemplo siguiente:
>sudoaudit2allow -i testfile -M example******************** IMPORTANT *********************** To make this policy package active, execute: semodule -i example.pp
Como indica el comando audit2allow, ahora puede ejecutar este módulo mediante el comando semodule -i, seguido del nombre del módulo que audit2allow ha creado para usted (example.pp en el ejemplo anterior).
3 Análisis de mensajes de AVC mediante setroubleshoot #
Para analizar los mensajes de denegación de AVC de forma sencilla, puede utilizar la herramienta setroubleshoot.
3.1 Descripción general de setroubleshoot #
3.1.1 ¿Qué es setroubleshoot? #
setroubleshoot es una herramienta que recopila eventos de auditoría de SELinux desde el kernel y analiza estos eventos. Si se produce un evento de este tipo, setroubleshoot informa al administrador.
3.1.2 Componentes de setroubleshoot #
El proceso de resolución de problemas de SELinux incluye los siguientes componentes, todos ellos instalados en SUSE Linux Micro por defecto.
setroubleshoot-serverproporciona las siguientes herramientas:setroubleshootd: el daemon principal que gestiona las peticiones entrantes y las definiciones de complementos. El daemon se activa a pedido y no es necesario ejecutarlo a través del serviciosystemd. Solo puede gestionarlo un usuario con privilegios y un usuariosetroubleshootdedicado.Una base de datos de alertas en el archivo
/var/lib/setroubleshoot/setroubleshoot_database.xml.sealert: una interfaz de usuario de línea de comandos para analizar/var/log/audit.log.sedispatch: un asignador de auditoría que explora los mensajes de AVC de SELinux y los transforma en un mensaje DBus, que luego pasa al daemon.
setroubleshoot-plugins: los complementos se utilizan para el análisis de mensajes de AVC y proporcionan sugerencias sobre cómo solucionar problemas.
3.1.3 ¿Cómo funciona setroubleshoot? #
setroubleshoot incluye un daemon y complementos de análisis. Cuando un complemento detecta un problema, se informa al daemon, que comprueba si se trata de un problema conocido. Si no es así, el nuevo problema se añade a la base de datos junto con una solución sugerida.
3.1.4 Ventajas de setroubleshoot #
setroubleshoot proporciona las siguientes funciones para ayudarle a resolver problemas en sus sistemas SELinux protegidos:
Envío de alertas al administrador cuando se produce una denegación de AVC.
Análisis automático de las denegaciones de AVC.
Sugerencia de posibles soluciones, como ajustar la configuración del sistema o instalar actualizaciones, etc.
Navegación de alertas anteriores.
3.2 Configuración de setroubleshoot #
Aunque la configuración de setroubleshoot no requiere ajustes, es posible que tenga que cambiar los valores por defecto. En las siguientes secciones se proporcionan los casos de uso habituales.
El archivo de configuración de setroubleshoot es /etc/setroubleshoot. Normalmente, no es necesario modificar la configuración además de definir las notificaciones por correo electrónico. Sin embargo, si necesita cambiar la configuración, puede editar el archivo o utilizar el comando setroubleshootd para configurar un elemento concreto. La sintaxis del comando es la siguiente:
#setroubleshootd -c SECTION.OPTION=VALUE
Por ejemplo, para definir la opción from_address, ejecute el comando de la siguiente manera:
#setroubleshootd -c email.from_address="example@mail.com"
3.2.1 Configuración del nivel de registro de setroubleshoot #
El nivel de registro por defecto (el valor de sealert_log y setroubleshootd_log) se establece en warning. Sin embargo, puede definir uno de los siguientes valores:
- critical
Solo se registran los errores graves que impiden el funcionamiento del sistema.
- error
Se informa de errores graves que pueden afectar al sistema.
- warning
Indicación de que ha ocurrido algo inesperado o de que podría producirse un problema en un futuro próximo. Sin embargo, el sistema funciona como se espera.
- info
Se registra una confirmación de que el sistema se está ejecutando correctamente.
- debug
Se registra información detallada para fines de depuración.
3.2.2 Configuración de setroubleshoot para enviar notificaciones por correo electrónico #
setroubleshoot puede enviarle notificaciones por correo electrónico si hay una denegación de AVC en el sistema.
Para recibir estas notificaciones, haga lo siguiente:
Abra la carpeta
/etc/setroubleshoot/setroubleshoot.conf.En el archivo, ajuste los siguientes elementos de configuración según sus necesidades:
- smtp_host
Si el servidor SMTP no se ejecuta en el host local, introduzca la dirección del servidor.
- smtp_port
El valor por defecto es 25. Normalmente, este valor no requiere ningún ajuste.
- from_address
Añada la dirección del remitente.
- subject
Configure un tema genérico para todos los mensajes.
- recipients_filepath
Especifique la ubicación de la lista de destinatarios de la notificación.
- use_sendmail
Defina el valor
truesi utiliza SendMail.
Cree el archivo de destinatarios de correo en la vía definida por la opción
recipients_filepath(por defecto,/var/lib/setroubleshoot/email_alerts-recipients).Cada dirección de correo electrónico debe estar en una línea distinta. Los comentarios se indican con el símbolo #.
3.2.3 Configuración de la base de datos de setroubleshoot #
Puede cambiar la cantidad de registros de la base de datos de setroubleshootd, su ubicación o el prefijo del nombre de archivo.
-
database_dir Especifique una vía absoluta al directorio donde debe residir el archivo XML de la base de datos.
-
filename Configure un prefijo personalizado para el nombre del archivo de la base de datos. El nombre del archivo tendrá el siguiente aspecto:
FILENAME_PREFIX_database.xml.-
max_alerts Defina el número máximo de registros de la base de datos. Especifique
0para tener un número ilimitado de registros.-
max_alert_age Las alertas anteriores al límite establecido se suprimen de la base de datos. Puede utilizar las unidades: year, month, day, hour, minute y second incluso en plural y puede utilizar más de una unidad, por ejemplo,
3 weeks 2 days, que equivale a 23 días. Si se deja vacío, no hay límite.
3.2.4 Configuración de setroubleshoot para recopilar información de servidores remotos #
Puede configurar setroubleshoot para recopilar datos de auditoría de SELinux desde servidores remotos. Para ello, configure la lista de direcciones.
- [listen_for_client] lista_de_direcciones
En el lado del servidor.
- [client_connect_to] lista_de_direcciones
En el lado del cliente.
Las direcciones de la lista tienen este formato:
[{FAMILY}]ADDRESS[:PORT_NUMBER]
donde {FAMILY} es {inet} o {unix}%{path}s. Si la familia de direcciones es inet, puede especificar opcionalmente un número de puerto; de lo contrario, el número de puerto se establece en el valor por defecto especificado por la opción de configuración default_port. El valor por defecto {unix}%{path}s hostname significa que se escucha en el socket del dominio Unix local.
3.3 Ejecución del análisis de /var/log/audit/audit.log #
Para permitir que la herramienta setroubleshoot analice el archivo de registro de auditoría, ejecute el comando:
>sudosealert -a /var/log/audit/audit.log
En el siguiente resultado de ejemplo, hay dos valores de puerto asignados al servicio SSHD:
100% done
found 1 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------
SELinux is preventing sshd from name_bind access on the tcp_socket port 2222.
***** Plugin bind_ports (92.2 confidence) suggests ************************
If you want to allow sshd to bind to network port 2222
Then you need to modify the port type.
Do
# semanage port -a -t PORT_TYPE -p tcp 2222 1
where PORT_TYPE is one of the following: ssh_port_t, vnc_port_t, xserver_port_t.
***** Plugin catchall_boolean (7.83 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 (1.41 confidence) suggests **************************
If you believe that sshd should be allowed name_bind access on the port 2222 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 'sshd' --raw | audit2allow -M my-sshd
# semodule -X 300 -i my-sshd.pp
Additional Information:
...
First Seen 2024-02-07 14:26:27 UTC
Last Seen 2024-02-08 03:30:12 UTC
Local ID b5cbdd75-3f8d-425d-af75-f6cbf1540ffd
Raw Audit Messages
type=AVC msg=audit(1707363012.797:25): avc: denied { name_bind } for pid=841 comm="sshd" src=2222 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=0
Hash: sshd,sshd_t,unreserved_port_t,tcp_socket,name_bind
El complemento |
4 Información legal #
Copyright © 2006 –2025 SUSE LLC y colaboradores. Reservados todos los derechos.
Está permitido copiar, distribuir y modificar este documento según los términos de la licencia de documentación gratuita GNU, versión 1.2 o (según su criterio) versión 1.3. Esta información de copyright y licencia deberán permanecer inalterados. En la sección titulada “GNU Free Documentation License” (Licencia de documentación gratuita GNU) se incluye una copia de la versión 1.2 de la licencia.
Para obtener información sobre las marcas comerciales de SUSE, consulte https://www.suse.com/company/legal/. Todas las marcas comerciales de otros fabricantes son propiedad de sus respectivas empresas. Los símbolos de marcas comerciales (®, ™, etc.) indican marcas comerciales de SUSE y sus filiales. Los asteriscos (*) indican marcas comerciales de otros fabricantes.
Toda la información recogida en esta publicación se ha compilado prestando toda la atención posible al más mínimo detalle. Sin embargo, esto no garantiza una precisión total. Ni SUSE LLC, ni sus filiales, ni los autores o traductores serán responsables de los posibles errores o las consecuencias que de ellos pudieran derivarse.