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(/.*)?’

# 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

# semanage fcontext -a -e / srv / myweb / var / www Restaure el contexto (para ambos casos):

# restorecon -vR / srv / myweb 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

# 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

# chcon –reference /var/www/html/ /var/www/html/index.html Restaure el contexto (para ambos casos):

# restorecon -vR /var/www/html/ 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]

# 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

# audit2allow -w -a Para ver el tipo de ejecución que permite el acceso denegado:

# audit2allow -a

# audit2allow -a Para crear un módulo personalizado:

# audit2allow -a -M mypolicy

# 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 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:

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.