domingo, 19 de diciembre de 2021

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.




¿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-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
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/
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
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


Análisis de Logs


Bitácora (logs)
: 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 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 …

Fuentes:

No hay comentarios:

Publicar un comentario