Una guía SysAdmin para SELinux
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. Pero vayamos por partes.
¿Qué es 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.
Este módulo está incorporado en el núcleo de Linux desde la versión 2.6, a partir de agosto del año 2003.
La guía SysAdmin para SELinux: 42 respuestas a las más grandes preguntas
“Es un hecho importante y popular que las cosas no siempre son lo que parecen…”
Douglas Adams, La Guía del Autoestopista Galáctico
Hace unos días 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-niveles (MLS) es controlar los procesos (denominados dominios) en función del nivel de seguridad de los datos que utilizarán. Por ejemplo, un proceso secreto no puede leer datos supersecretos.
- 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)
- Parámetros del kernel para cambiar los modos de SELinux en el arranque del sistema:
- autorelabel=1 → obliga al sistema a volver a etiquetar
- 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 - Para verificar si SELinux está habilitado : # 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
Un proceso que se ejecuta en el contexto de la etiqueta httpd_t puede interactuar con un objeto con la etiqueta httpd_something_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
Los contextos de la etiqueta se establecen cuando los archivos se crean en función del contexto del directorio principal (con algunas excepciones). Los RPM pueden establecer contextos como parte de la instalación
- 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:
- Si conoce la etiqueta:
# semanage fcontext -a -t httpd_sys_content_t ‘/srv/myweb(/.*)?’ - Si conoce el archivo con el etiquetado equivalente:
# semanage fcontext -a -e / srv / myweb / var / www - Restaure el contexto (para ambos casos):
# restorecon -vR / srv / myweb
- Si conoce la etiqueta:
- Problema de etiquetado: si se mueve un archivo en lugar de copiarlo, el archivo mantendrá su contexto original. Para solucionar estos problemas:
- Cambie el contexto de la etiqueta con el comando:
# chcon -t httpd_system_content_t /var/www/html/index.html - Cambie el contexto con la etiqueta de referencia:
# chcon –reference /var/www/html/ /var/www/html/index.html - Restaure el contexto (para ambos casos):
# restorecon -vR /var/www/html/
- Cambie el contexto de la etiqueta con el comando:
- Si SELinux necesita saber que HTTPD va a escuchar en el puerto 8585, le tenemos que informar:
# semanage port -a -t http_port_t -p tcp 8585 - Si SELinux necesita saber alguna configuración particular, los booleanos nos permiten que se cambien partes de la política de SELinux en tiempo de ejecución, sin necesidad de recompilar las políticas de SELinux. Por ejemplo: si quiere que “httpd” envíe correo electrónico, ingrese:
# 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] - Para configurarlo permanentemente, agregue -P, por ejemplo:
# setsebool httpd_enable_ftp_server 1 -P
- Las políticas / aplicaciones de SELinux pueden tener errores, que incluyen:
- Rutas de código inusuales
- Configuraciones
- Redirecciones de stdout
- Descripciones de archivos filtrados
- Memoria ejecutable
- Bibliotecas mal construidas
Abra un ticket (no reporte en Bugzilla, no hay acuerdos de nivel de servicio [SLA’s] en Bugzilla)
- Su información puede verse comprometida si tiene dominios confinados que intentan:
- 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 - Análisis de problemas: Utiliza journalctl para listar todos los registros relacionados con “setroubleshoot” :
# journalctl -t setroubleshoot –since=14:20 - Análisis de problemas: Utiliza journalctl para listar todos los registros relacionados con una etiqueta SELinux en particular. Por ejemplo:
# journalctl SELINUX_CONTEXT=system_u:system_r:policykit_t:s0 - Análisis de problemas: Revisa el registro “setroubleshoot” cuando ocurra un error de SELinux y las posibles soluciones. Por ejemplo, de journalctl:
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 - Bitácora: SELinux registra información en todos estos lugares:
- /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 - Bitácora: Para buscar mensajes de “Access Vector Cache (AVC)” para un servicio en particular:
# ausearch -m avc -c httpd -i - La utilidad “audit2allow” recopila información de registros de operaciones denegadas y luego genera reglas de permisos para crear una política de SELinux. Por ejemplo:
- Para producir una descripción legible de por qué se denegó el acceso:
# audit2allow -w -a - Para ver el tipo de ejecución que permite el acceso denegado:
# audit2allow -a - Para crear un módulo personalizado:
# audit2allow -a -M mypolicy - La opción –M crea un archivo de ejecución de tipo (.te) con el nombre especificado y compila la regla en un paquete de política (.pp): mypolicy.pp mypolicy.te
- Para instalar el módulo personalizado:
# semodule -i mypolicy.pp
- Para producir una descripción legible de por qué se denegó el acceso:
- Para configurar que un solo proceso (dominio) se ejecute en modo permisivo:
# semanage permissive -a httpd_t - Si ya no desea que dicho dominio sea permisivo:
# semanage permissive -d httpd_t - Para deshabilitar todos los dominios permisivos:
# semodule -d permissivedomains - Para habilitar la política MLS en SELinux, configura /etc/selinux/config como:
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 - Crear un usuario con un nível MLS específico:
# 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) - Para ver el mapeo entre los usuarios de SELinux y los del Sistema Operativo:
# semanage login -l - Defina un nivel específico para un usuario:
# semanage login –modify –range s2:c100 john - Para corregir la etiqueta en el directorio de inicio del usuario (si es necesario modificar el nivel):
# chcon -R -l s2:c100 /home/John - Para enumerar las categorías actuales:
# chcat -L - Para enumerar las categorías o para comenzar a crear una propia, modifique el archivo de la siguiente manera:
/etc/selinux/__/setrans.conf - Para ejecutar un comando o script en un archivo específico, rol y contexto de usuario:
# 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:
- Con Podman: # podman run –security-opt label=disable …
- Con Docker: # docker run –security-opt label=disable …
- Si necesita dar un contenedor acceso completo al sistema:
- Con Podman: # podman run –privileged …
- Con Docker: # docker run –privileged …
Y con esto, ya sabes la respuesta. Entonces, por favor: no entre en pánico, y encienda SELinux.
El artículo apareció originalmente en inglés:
Opensource.com – A sysadmin’s guide to SELinux: 42 answers to the big questions
Fuentes:
- SELinux por Dan Walsh
- Your visual how-to guide for SELinux policy enforcement también por Dan Walsh
- Security Enhanced Linux for mere mortals por Thomas Cameron
- The SELinux Coloring Book por Máirín Duffy
- SELinux User’s and Administrator’s Guide—Red Hat Enterprise Linux 7
Espero que el artículo os haya parecido de interés. Nos vamos leyendo ^.^
NOTA: Muchas gracias a la estimable colaboración en todo momento de Alex Callejas para elaborar este artículo.