5.3. Corrección de las denegaciones de SELinux analizadas
En la mayoría de los casos, las sugerencias proporcionadas por la herramienta sealert
le dan la orientación correcta sobre cómo solucionar los problemas relacionados con la política de SELinux. Consulte Análisis de los mensajes de denegación de SELinux para obtener información sobre cómo utilizar sealert
para analizar las denegaciones de SELinux.
Tenga cuidado cuando la herramienta sugiere usar la herramienta audit2allow
para los cambios de configuración. No debe utilizar audit2allow
para generar un módulo de política local como primera opción cuando vea una denegación de SELinux. La resolución de problemas debe comenzar con una comprobación de si hay un problema de etiquetado. El segundo caso más frecuente es que hayas cambiado la configuración de un proceso, y hayas olvidado avisar a SELinux de ello.
Problemas de etiquetado
Una causa común de problemas de etiquetado es cuando se utiliza un directorio no estándar para un servicio. Por ejemplo, en lugar de usar /var/www/html/
para un sitio web, un administrador podría querer usar /srv/myweb/
. En Red Hat Enterprise Linux, el directorio /srv
está etiquetado con el tipo var_t
. Los archivos y directorios creados en /srv
heredan este tipo. También, los objetos recién creados en directorios de nivel superior, como /myserver
, pueden ser etiquetados con el tipo default_t
. SELinux impide que el servidor HTTP Apache (httpd
) acceda a estos dos tipos. Para permitir el acceso, SELinux debe saber que los archivos en /srv/myweb/
deben ser accesibles por httpd
:
# semanage fcontext -a -t httpd_sys_content_t "/srv/myweb(/.*)?"
Este comando semanage
agrega el contexto para el directorio /srv/myweb/
y todos los archivos y directorios bajo él a la configuración del contexto de archivos de SELinux. La utilidad semanage
no cambia el contexto. Como root, utilice la utilidad restorecon
para aplicar los cambios:
# restorecon -R -v /srv/myweb
Contexto incorrecto
La utilidad matchpathcon
comprueba el contexto de una ruta de archivo y lo compara con la etiqueta por defecto para esa ruta. El siguiente ejemplo demuestra el uso de matchpathcon
en un directorio que contiene archivos incorrectamente etiquetados:
$ matchpathcon -V /var/www/html/*
/var/www/html/index.html has context unconfined_u:object_r:user_home_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
/var/www/html/page1.html has context unconfined_u:object_r:user_home_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
En este ejemplo, los archivos index.html
y page1.html
están etiquetados con el tipo user_home_t
. Este tipo se utiliza para los archivos de los directorios personales de los usuarios. Si se utiliza el comando mv
para mover archivos desde el directorio personal, los archivos pueden ser etiquetados con el tipo user_home_t
. Este tipo no debería existir fuera de los directorios personales. Utilice la utilidad restorecon
para restaurar dichos archivos a su tipo correcto:
# restorecon -v /var/www/html/index.html
restorecon reset /var/www/html/index.html context unconfined_u:object_r:user_home_t:s0->system_u:object_r:httpd_sys_content_t:s0
Para restaurar el contexto de todos los archivos de un directorio, utilice la opción -R
:
# restorecon -R -v /var/www/html/
restorecon reset /var/www/html/page1.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
restorecon reset /var/www/html/index.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
Aplicaciones confinadas configuradas de forma no estándar
Los servicios pueden ejecutarse de diversas maneras. Para tener en cuenta esto, es necesario especificar cómo se ejecutan los servicios. Esto se puede lograr mediante booleanos de SELinux que permiten cambiar partes de la política de SELinux en tiempo de ejecución. Esto permite cambios, como permitir el acceso de los servicios a los volúmenes NFS, sin recargar o recompilar la política de SELinux. Además, la ejecución de servicios en números de puerto no predeterminados requiere la actualización de la configuración de la política mediante el comando semanage
.
Por ejemplo, para permitir que el servidor HTTP Apache se comunique con MariaDB, active el booleano httpd_can_network_connect_db
:
# setsebool -P httpd_can_network_connect_db on
Tenga en cuenta que la opción -P
hace que la configuración persista a través de los reinicios del sistema.
Si se deniega el acceso a un servicio concreto, utiliza las utilidades getsebool
y grep
para ver si hay algún booleano que permita el acceso. Por ejemplo, utilice el comando getsebool -a | grep ftp
para buscar booleanos relacionados con FTP:
$ getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_nfs --> off
ftpd_connect_db --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
Para obtener una lista de booleanos y saber si están activados o desactivados, utilice el comando getsebool -a
. Para obtener una lista de booleanos con su significado y saber si están activados o desactivados, instale el paquete selinux-policy-devel
y utilice el comando semanage boolean -l
como root.
Números de puerto
Dependiendo de la configuración de la política, los servicios sólo pueden ejecutarse en determinados números de puerto. Si se intenta cambiar el puerto en el que se ejecuta un servicio sin cambiar la política, es posible que el servicio no se inicie. Por ejemplo, ejecute el comando semanage port -l | grep http
como root para listar los puertos relacionados con http
:
# semanage port -l | grep http
http_cache_port_t tcp 3128, 8080, 8118
http_cache_port_t udp 3130
http_port_t tcp 80, 443, 488, 8008, 8009, 8443
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
El tipo de puerto http_port_t
define los puertos en los que puede escuchar el Servidor HTTP Apache, que en este caso son los puertos TCP 80, 443, 488, 8008, 8009 y 8443. Si un administrador configura httpd.conf
para que httpd
escuche en el puerto 9876 (Listen 9876
), pero la política no se actualiza para reflejar esto, el siguiente comando falla:
# systemctl start httpd.service Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details. # systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: failed (Result: exit-code) since Thu 2013-08-15 09:57:05 CEST; 59s ago Process: 16874 ExecStop=/usr/sbin/httpd $OPTIONS -k graceful-stop (code=exited, status=0/SUCCESS) Process: 16870 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
Un mensaje de denegación de SELinux similar al siguiente se registra en /var/log/audit/audit.log
:
type=AVC msg=audit(1225948455.061:294): avc: denied { name_bind } for pid=4997 comm="httpd" src=9876 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket
Para permitir que httpd
escuche en un puerto que no está listado para el tipo de puerto http_port_t
, utilice el comando semanage port
para asignar una etiqueta diferente al puerto:
# semanage port -a -t http_port_t -p tcp 9876
La opción -a
añade un nuevo registro; la opción -t
define un tipo; y la opción -p
define un protocolo. El último argumento es el número de puerto a añadir.
Casos de esquina, aplicaciones en evolución o rotas, y sistemas comprometidos
Las aplicaciones pueden contener errores, haciendo que SELinux deniegue el acceso. Además, las reglas de SELinux están evolucionando
Para estas situaciones, después de que se deniegue el acceso, utilice la utilidad audit2allow
para crear un módulo de política personalizado que permita el acceso. Puedes informar de las reglas que faltan en la política de SELinux en Red Hat Bugzilla. Para Red Hat Enterprise Linux 8, cree errores contra el producto Red Hat Enterprise Linux 8
y seleccione el componente selinux-policy
. Incluya la salida de los comandos audit2allow -w -a
y audit2allow -a
en dichos informes de errores.
Si una aplicación pide privilegios de seguridad importantes, podría ser una señal de que la aplicación está comprometida. Utilice herramientas de detección de intrusos para inspeccionar ese comportamiento sospechoso.
La página web Solution Engine en el Portal del Cliente de Red Hat también puede proporcionar orientación en forma de un artículo que contiene una posible solución para el mismo problema o uno muy similar que usted tiene. Seleccione el producto y la versión pertinentes y utilice palabras clave relacionadas con SELinux, como selinux o avc, junto con el nombre de su servicio o aplicación bloqueada, por ejemplo: selinux samba
.