Desde hace un tiempo los administradores de sistemas y también los usuarios domésticos nos hemos tenido que acostumbrar a trabajar con SELinux; seguro habrán oído de él, ese módulo de seguridad, medio desconocido y que por norma todos nos dicen que deshabilitamos recién hemos instalado el sistema operativo en turno.
¿Qué es SELinux?
Security-Enhanced Linux (SELinux)
Cómo hemos dicho se trata de un módulo de seguridad para el kernel Linux. En inglés “Security-Enhanced Linux”, Seguridad-Mejorada de Linux. Dicho módulo proporciona el mecanismo para utilizar políticas de seguridad en el control de acceso más allá de los permisos tradicionales de propiedad, incluyendo controles de acceso obligatorios, como los implementados por del departamento de defensa de Estados Unidos en sistemas de alta seguridad.
A nivel técnico se trata de un conjunto de modificaciones al núcleo del sistema operativo, que pueden ser agregadas a cualquiera de las distribuciones GNU/Linux. Su arquitectura se enfoca en separar las decisiones sobre los objetos del sistema, en función a su aplicación y ejecución para asegurar que el sistema funcione de la forma y bajo las condiciones que nosotros hemos configurado a través de las políticas aplicadas.
Alex Callejas, del equipo de Red Hat para América Latina, escribió un extenso y magnífico artículo, a modo de preguntas y respuestas, sobre este módulo, en el portal opensource.com, por lo que me he decidido a traducirlo con su apoyo y aquí les presentamos el resultado:
Seguridad. Endurecimiento. Conciliación. Política. Los cuatro jinetes del Apocalipsis de todo SysAdmin. Además de nuestras tareas diarias, monitoreo, respaldo, implementación, puesta a punto, actualización, etcétera, también estamos a cargo de asegurar nuestros sistemas. Incluso aquellos sistemas en los que el proveedor externo nos pide que desactivemos la seguridad mejorada. Parece más un trabajo para Ethan Hunt de Misión Imposible.
Ante este dilema, algunos administradores de sistemas deciden tomar la píldora azul porque creen que nunca conocerán la respuesta a la gran pregunta de la vida, el universo y todo lo demás. Y, como todos nosotros sabemos, esa respuesta es el número 42.
En el espíritu del libro “Guía del autoestopista galáctico” , estas son las 42 respuestas a las más grandes preguntas sobre la administración y el uso de SELinux en sus sistemas.
SELINUX es un sistema de ETIQUETADO, lo que significa que cada
proceso tiene una ETIQUETA. Cada archivo, directorio y objeto del
sistema tiene una ETIQUETA. Las reglas de la política en turno controlan
el acceso entre los procesos etiquetados y los objetos etiquetados. El
kernel hace valer estas reglas.
Los dos conceptos más importantes son: etiquetado (archivos, procesos, puertos, etc.) y tipo de ejecución (que aísla los procesos en función de su tipo
El formato de etiqueta correcto es:
usuario:rol:tipo:nivel [y/ó categoría] (← ambos opcionalmente)
El objetivo del tipo de ejecución de seguridad de multi-categorías (MCS) es proteger procesos similares entre sí (como máquinas virtuales, engranajes de OpenShift (pods), cajas de arena (sandboxes) de SELinux, contenedores, etcétera)
selinux=0 → el kernel no carga ninguna función de SELinux
enforcing=0 → arranque en modo permisivo
Si necesita volver a etiquetar todo el sistema:
- # touch /.autorelabel
- # reboot
- Si el etiquetado del sistema contiene una gran cantidad de errores, es posible que se deba arrancar en modo permisivo para que el etiquetado automático tenga éxito
# getenforce
Para habilitar o deshabilitar temporalmente SELinux:
# setenforce [ 1 | 0 ]
Herramienta para saber el estado de SELinux:
# sestatus
Archivo de configuración ubicado en :
/etc/selinux/config
¿Cómo funciona SELinux? Aquí hay un ejemplo de etiquetado para un servidor web Apache:
- tipo de objeto: objeto → etiqueta
- Binario: /usr/sbin/httpd → httpd_exec_t
- Directorio de configuración: /etc/httpd → httpd_config_t
- Directorio de ficheros 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_d
- Proceso: /usr/sbin/httpd -DFOREGOUND → httpd_t
- Puertos: 80/tcp, 443/tcp → httpd_t, httpd_port_t
Muchos comandos aceptan el argumento -Z para ver, crear y modificar el contexto de la etiqueta:
- ls -Z
- id -Z
- ps -Z
- netstat -Z
- cp -Z
- mkdir -Z
Existen cuatro causas principales en los errores con SELinux:
- Problemas de etiquetado
- Algo que SELinux necesita saber
- Un error en una política / aplicación de SELinux
- Su información puede estar comprometida
Problema de etiquetado: si sus archivos en “/srv/myweb” no están etiquetados correctamente, se puede denegar el acceso. Aquí hay algunas maneras de arreglar esto:
- # semanage fcontext -a -t httpd_sys_content_t ‘/srv/myweb(/.*)?’
- # semanage fcontext -a -e / srv / myweb / var / www
- # restorecon -vR / srv / myweb
- # chcon -t httpd_system_content_t /var/www/html/index.html
- # chcon –reference /var/www/html/ /var/www/html/index.html
- # restorecon -vR /var/www/html/
- # semanage port -a -t http_port_t -p tcp 8585
- # setsebool -P httpd_can_sendmail 1
Si SELinux necesita saber, los booleanos se pueden administrar, mediante los comandos: Para ver todos los booleanos:
# getsebool -a
Para ver la descripción de cada uno: # semanage boolean -l
Para establecer un booleano, ejecuta:
- # setsebool [_boolean_] [1|0]
- # setsebool httpd_enable_ftp_server 1 -P
- Rutas de código inusuales
- Configuraciones
- Redirecciones de stdout
- Descripciones de archivos filtrados
- Memoria ejecutable
- Bibliotecas mal construidas
- Cargar módulos del kernel
- Desactiva el modo de aplicación de SELinux
- Escribir hacia etc_t / shadow_t
- Modificar las reglas de iptables (cortafuegos/firewall)
Análisis de problemas: Instale los paquetes de herramientas de SELinux:
- # yum -y install setroubleshoot setroubleshoot-server
- Reinicie o recargue el servicio auditoría (audit) después de la instalación
- # journalctl -t setroubleshoot –since=14:20
- # journalctl SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
- Jun 14 19:41:07 web1 setroubleshoot: SELinux is preventing httpd from getattr access on the file /var/www/html/index.html. For complete message run: sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e# sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e
- SELinux is preventing 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_syscontent_t.
- Then you can restorecon.
- Do
- # /sbin/restorecon -v /var/www/html/index.html
Análisis de Logs
- /var/log/messages
- /var/log/audit/audit.log
- /var/lib/setroubleshoot/setroubleshoot_database.xml
Bitácora: buscar errores SELinux en el registro de auditoría:
- # ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today -i
- # ausearch -m avc -c httpd -i
- # audit2allow -w -a
- # audit2allow -a
- # audit2allow -a -M mypolicy
Para instalar el módulo personalizado:
- # semodule -i mypolicy.pp
- # semanage permissive -a httpd_t
- # semanage permissive -d httpd_t
- # semodule -d permissivedomains
- SELINUX=permissive
- SELINUXTYPE=mls
- Asegúrese de que SELinux se esté ejecutando en modo permisivo:
- # setenforce 0
- Utilice el script “fixfiles” para asegurarse de que los archivos se vuelvan a etiquetar en el próximo reinicio:
- # fixfiles -F onboot
- # reboot
- # useradd -Z staff_u John
- Usando el comando “useradd”, se asigna al nuevo usuario un tipo de usuario de SELinux existente (en este caso, staff_u)
- # semanage login -l
- # semanage login –modify –range s2:c100 john
- # chcon -R -l s2:c100 /home/John
- # chcat -L
- /etc/selinux/__/setrans.conf
- # runcon -t initrc_t -r system_r -u user_u yourcommandhere
- -t es el contexto de la etiqueta del archivo
- -r es contexto de la etiqueta del rol
- -u es el contexto de la etiqueta del usuario
Contenedores que se ejecutan con SELinux deshabilitado:
# podman run –security-opt label=disable …
Con Docker:
# docker run –security-opt label=disable …
Si necesita dar un contenedor acceso completo al sistema:
# podman run –privileged …
Con Docker:
# docker run –privileged …
No hay comentarios:
Publicar un comentario