Resolución de problemas de SELinux
- DESCRIPCIÓN
Un sistema con SELinux en el modo
enforcing
puede provocar denegaciones de acceso que pueden impedir que las aplicaciones se ejecuten correctamente. Puede utilizaraudit2allow
osetroubleshoot
para 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
:>
sudo
systemctl start auditd
Habilite el servicio en los destinos del sistema mediante:
>
sudo
systemctl 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=1316
Un 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=file
Cada 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=SYSCALL
que sigue a otro con un tipo diferente y tiene el mismo valor demsg
puede 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 -d
en la parte situada delante del punto de la notación de tiempo de época para averiguar cuándo se produjo el evento:>
date -d @1348173901
Thu 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:
>
sudo
audit2allow -w -i FILENAME
>
sudo
audit2allow -w -i testfile
type=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:
>
sudo
audit2allow
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:
>
sudo
audit2allow -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:
>
sudo
audit2allow -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:
>
sudo
audit2allow -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 SLE Micro por defecto.
setroubleshoot-server
proporciona 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 usuariosetroubleshoot
dedicado.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
true
si 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
0
para 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:
>
sudo
sealert -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 –2024 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. Este aviso 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.