No puedes dejar que tus fracasos te definan. Tienes que dejar que tus fracasos te enseñen ― Barack Obama
Una de las grandes batallas, especialmente con los proveedores de soluciones de terceros, es mantener la seguridad de nuestros servidores. En muchos casos, el desafío es la solicitud de deshabilitar SELinux para que una aplicación pueda funcionar sin problemas. Afortunadamente, eso ocurre cada vez menos.
En la mayoría de estos casos, un análisis es suficiente para encontrar la solución de problemas o la solución alternativa adecuada.
SELinux es un sistema de etiquetado , que nos dice que cada archivo, directorio u objeto en el sistema tiene una Etiqueta correspondiente . Las políticas controlan la interacción entre estos elementos. El núcleo hace cumplir estas reglas.
Los dos conceptos más importantes son Etiquetado (archivos, procesos, puertos, etc.) y Type Enforcement (que aísla los procesos entre sí según su tipo).
El formato utilizado por las etiquetas es:usuario:rol:tipo:nivel (opcional).
Para averiguar la configuración actual, ejecute getenforce
y sestatus
comandos:
# getenforce
Enforcing
# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 32
Las mejores prácticas nos dicen que cuando estamos probando una nueva aplicación de terceros, debemos configurar temporalmente SELinux en modo permisivo para determinar qué políticas o booleanos (cadenas simples que cambian el comportamiento) son necesarias. Ejecute el comando:
# setenforce 0
Mirando a través de los registros, puede averiguar qué requiere SELinux para que la aplicación funcione correctamente.
¿Qué intenta decirme SELinux?
Solo hay cuatro causas principales de errores que generan alertas en SELinux:
- Etiquetado.
- SELinux necesita saberlo.
- La política de SELinux y/o la aplicación pueden tener errores.
- Su información puede verse comprometida.
El último caso se debe a modificaciones realizadas para atacar vulnerabilidades o evitar el seguimiento de actividades, aunque en ambos casos es imprescindible revisar estas alertas; por razones prácticas, por el momento, no las trataremos hasta una posible publicación futura.
Etiquetado
Problema de etiquetado :Archivos en /srv/myweb
no están debidamente etiquetados y no se puede acceder a ellos.
SELinux asigna una etiqueta para cada elemento involucrado en el mismo servicio:
- Archivo binario:/usr/sbin/httpd → httpd_exec_t
- Archivo de configuración:/etc/httpd → httpd_config_t
- Archivo de registro:/var/log/httpd → httpd_log_t
- Directorio de contenido:/var/www/html → httpd_sys_content_t
- Script de inicio:/usr/lib/systemd/system/httpd.service → httpd_unit_file_t
- Proceso:/usr/sbin/httpd → httpd_t
- Puertos:80/tcp, 443/tcp → httpd_t y httpd_port_t
En el servidor web, un proceso que se ejecuta en httpd_t contexto solo puede interactuar con objetos con httpd_something_t etiqueta .
Solución :Etiquetar correctamente los archivos.
Si conoce la etiqueta correcta, ejecute:
# semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'
Si conoce un archivo con la etiqueta equivalente, ejecute:
# semanage fcontext -a -e /srv/myweb /var/www
Restaurar el contexto predeterminado de los archivos, para ambos casos:
# restorecon -vR /srv/myweb
Problema de etiquetado :Si se mueve un archivo, en lugar de copiarlo, mantiene su etiqueta original.
$ mv index.html /var/www/html/
Solución :Etiquetar correctamente el archivo.
Cambie el contexto a la etiqueta correcta:
# chcon -t httpd_system_content_t /var/www/html/index.html
Cambiando el contexto con una etiqueta de referencia:
# chcon --reference /var/www/html/ /var/www/html/index.html
Restaurar el contexto predeterminado del archivo, para ambos casos:
# restorecon -vR /var/www/html/
[ También te puede interesar: Acceder a la documentación de la política de SELinux ]
SELinux necesita saber
Personalización del servicio :El servidor web escuchará las solicitudes en el puerto 8585.
Para agregar el puerto deseado al contexto, ejecute:
# semanage port -a -t http_port_t -p tcp 8585
Adición de funciones al servicio :El servidor web podrá enviar correos electrónicos.
Para habilitar la función de envío de correo, active el booleano, ejecutando:
# setsebool -P httpd_can_sendmail 1
El -P
flag hace que el cambio sea permanente en el booleano.
Para obtener todos los valores booleanos, ejecute:
# getsebool -a
Para verificar el estado de un booleano, ejecute:
# semanage boolean -l
Solución de problemas de políticas
Algunos servicios no tienen una política específica creada que contenga los permisos necesarios para trabajar con SELinux. Para determinar cuáles son estos permisos, es necesario configurar el modo permisivo e inspeccionar los registros en busca de errores de acceso.
El servicio no funciona :se usa wicd en lugar del servicio NetworkManager para manejar las conexiones inalámbricas.
Inspeccionar el audit.log
archivo para acceso denegado:
# grep denied audit.log | cut -d{ -f2 | sort -n | uniq -u
create } for pid=2670 comm="wicd" scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=appletalk_socket permissive=1
create } for pid=2670 comm="wicd" scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=ax25_socket permissive=1
ioctl } for pid=2670 comm="wicd" path="socket:[52681]" dev="sockfs" ino=52681 ioctlcmd=0x8b01 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=ax25_socket permissive=1
ioctl } for pid=2670 comm="wicd" path="socket:[52684]" dev="sockfs" ino=52684 ioctlcmd=0x8b01 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=appletalk_socket permissive=1
setattr } for pid=2214 comm="wicd" name="dhclient.conf.template" dev="dm-0" ino=437068 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=unconfined_u:object_r:etc_t:s0 tclass=file permissive=0
Tenga en cuenta que algunos elementos involucrados en los contextos NetworkManager_t y etc_t requieren derechos y acceso a diferentes archivos y creación de sockets.
Crear el tipo de cumplimiento (.te) archivo con los permisos necesarios para la política:
# vi my_wicd.te
module my_wicd 1.0;
require {
type NetworkManager_t;
type etc_t;
class ipx_socket create;
class ax25_socket { create ioctl };
class appletalk_socket { create ioctl };
class file setattr;
}
#============= NetworkManager_t ==============
allow NetworkManager_t etc_t:file setattr;
allow NetworkManager_t self:appletalk_socket { create ioctl };
allow NetworkManager_t self:ax25_socket { create ioctl };
allow NetworkManager_t self:ipx_socket create;
Para compilar la política, instale el paquete selinux-policy-devel
y genere el paquete de políticas:
# make -f /usr/share/selinux/devel/Makefile my_wicd.pp
Para activar el módulo recién generado, ejecute:
# semodule -i my_wicd.pp
Mensaje de error de política :Intentando acceder a mi sitio web, encuentro errores de SELinux en los registros.
Una de las trampas comunes en la solución de mensajes de error de SELinux es crear políticas de acuerdo con todos los mensajes de error encontrados. En la mayoría de los casos, si el setroubleshoot
paquete está instalado, la misma alerta nos dará todas las posibles opciones de solución, de mejor a menos.
Para revisar el setroubleshoot
alertas generadas hoy, ejecute:
# journalctl -t setroubleshoot --since today
Dec 08 13:08:33 lab.example.com setroubleshoot[12013]: failed to retrieve rpm info for /var/www/html/index.html
Dec 08 13:08:34 lab.example.com setroubleshoot[12013]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html. For complete SELinux messages run: sealert -l 011df984-4eb6-4079-98ab-cba173c4342e
Dec 08 13:08:34 lab.example.com setroubleshoot[12013]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html.
***** Plugin restorecon (99.5 confidence) suggests ************************
If you want to fix the label
/var/www/html/index.html default label should be httpd_sys_content_t.
Then you can run restorecon. The access attempt may have been stopped due to insufficient permissions to access a parent directory, in which case try to change the following command accordingly.
Do
# /sbin/restorecon -v /var/www/html/index.html
***** Plugin catchall (1.49 confidence) suggests **************************
If you believe that httpd should be allowed getattr access on the index.html 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 'httpd' --raw | audit2allow -M my-httpd
# semodule -X 300 -i my-httpd.pp
En este caso, la mejor solución posible es simplemente corregir la etiqueta del archivo.
[ Mejore sus habilidades para administrar y usar SELinux con esta útil guía. ]
Resumir
SELinux puede ser un desafío para solucionar problemas, pero al aplicar los conceptos que se indican aquí y comprender los componentes del servicio, puede manejar cualquier desafío que se presente en su camino.
Recuerda: