SELinux: Configuración Básica y Modos

Introducción

Security-Enhanced Linux (SELinux) es un mecanismo de control de acceso obligatorio (MAC) integrado en el kernel de Linux que proporciona una capa adicional de seguridad del sistema más allá del control de acceso discrecional tradicional (DAC). Desarrollado originalmente por la Agencia de Seguridad Nacional (NSA), SELinux se ha convertido en un componente crítico de las distribuciones empresariales de Linux, particularmente Red Hat Enterprise Linux, CentOS y Fedora.

SELinux aplica políticas de seguridad que definen cómo los procesos, usuarios y archivos interactúan entre sí y con los recursos del sistema. Al implementar el principio de privilegio mínimo a nivel del kernel, SELinux reduce significativamente el daño potencial de vulnerabilidades de seguridad, errores de configuración y aplicaciones comprometidas.

Esta guía completa explora los fundamentos de SELinux, opciones de configuración, modos operacionales y mejores prácticas. Ya seas un administrador de sistemas nuevo en SELinux o busques profundizar tu comprensión de este poderoso framework de seguridad, esta guía proporciona el conocimiento y las técnicas prácticas necesarias para implementar y administrar efectivamente SELinux en entornos de producción.

Comprendiendo SELinux y el Contexto de Seguridad

¿Qué es SELinux?

Security-Enhanced Linux (SELinux) es un módulo de seguridad del kernel de Linux que proporciona un mecanismo para soportar políticas de control de acceso obligatorio (MAC). A diferencia de los permisos Unix tradicionales que dependen de la discreción del usuario, SELinux aplica políticas de seguridad a nivel del sistema que no pueden ser anuladas por usuarios o aplicaciones.

Cómo Funciona SELinux

SELinux opera usando varios conceptos clave:

1. Contextos de Seguridad (Etiquetas)

Cada archivo, proceso, puerto y objeto del sistema tiene un contexto de seguridad con cuatro componentes:

user:role:type:level
  • User: Usuario SELinux (diferente del usuario Linux)
  • Role: Define qué usuarios SELinux pueden acceder al objeto
  • Type: Mecanismo principal para el control de acceso (aplicación de tipos)
  • Level: Seguridad Multi-Nivel (MLS) y Seguridad Multi-Categoría (MCS)

Ejemplo: system_u:object_r:httpd_sys_content_t:s0

2. Aplicación de Tipos

La característica más importante de SELinux, la aplicación de tipos usa tipos (dominios para procesos, tipos para archivos) para determinar el acceso:

  • Los procesos se ejecutan en dominios específicos (ej., httpd_t para Apache)
  • Los archivos están etiquetados con tipos específicos (ej., httpd_sys_content_t para contenido web)
  • Las reglas de política definen qué dominios pueden acceder a qué tipos

3. Reglas de Política

Las políticas de SELinux contienen reglas que explícitamente permiten o niegan el acceso:

allow httpd_t httpd_sys_content_t:file { read getattr open };

Esta regla permite al proceso Apache (dominio httpd_t) leer archivos etiquetados como httpd_sys_content_t.

Modos Operacionales de SELinux

SELinux opera en tres modos distintos:

Modo Enforcing

  • Las políticas de SELinux se aplican
  • Las violaciones de acceso se niegan y registran
  • Proporciona protección activa
  • Recomendado para sistemas en producción

Modo Permissive

  • Las políticas de SELinux no se aplican
  • Las violaciones de acceso se registran pero se permiten
  • Útil para resolución de problemas y desarrollo de políticas
  • Sin protección de seguridad real

Modo Disabled

  • SELinux está completamente deshabilitado
  • No se cargan ni aplican políticas
  • Sin registro de violaciones
  • No recomendado para sistemas en producción

Por Qué Importa SELinux

SELinux proporciona beneficios críticos de seguridad:

  • Contención: Limita el daño de aplicaciones comprometidas
  • Control de acceso obligatorio: No puede ser eludido por usuarios o aplicaciones
  • Protección zero-day: Reduce la efectividad de exploits incluso antes de que los parches estén disponibles
  • Cumplimiento: Requerido para muchos marcos de seguridad y certificaciones gubernamentales
  • Control granular: Control preciso sobre el acceso a recursos del sistema
  • Defensa en profundidad: Capa de seguridad adicional más allá de los permisos tradicionales

Conceptos Erróneos Comunes sobre SELinux

Mito: "SELinux es demasiado complejo y debería deshabilitarse" Realidad: Las herramientas modernas simplifican la gestión de SELinux, y deshabilitarlo elimina protecciones de seguridad críticas

Mito: "SELinux rompe las aplicaciones" Realidad: Las aplicaciones correctamente etiquetadas funcionan sin problemas; los problemas indican problemas de configuración

Mito: "SELinux es solo para gobierno/militar" Realidad: Cualquier organización que maneje datos sensibles se beneficia de SELinux

Requisitos Previos

Antes de configurar SELinux, asegúrate de tener:

Requisitos del Sistema

  • Sistema Operativo: RHEL, CentOS, Fedora u otra distribución con capacidad SELinux
  • Kernel: Kernel Linux 2.6 o posterior con soporte SELinux
  • Acceso Root: Privilegios administrativos requeridos
  • Espacio en Disco: Espacio adecuado para archivos de política y registros

Conocimientos Requeridos

  • Administración básica de sistemas Linux
  • Comprensión de permisos y propiedad de archivos
  • Competencia en línea de comandos
  • Comprensión básica de servicios del sistema
  • Familiaridad con análisis de registros

Requisitos de Software

La mayoría de las herramientas de SELinux vienen preinstaladas en sistemas RHEL/CentOS:

  • selinux-policy: Política de referencia de SELinux
  • policycoreutils: Utilidades principales de SELinux
  • policycoreutils-python-utils: Utilidades Python para SELinux
  • setroubleshoot-server: Herramientas de resolución de problemas de SELinux
  • setools-console: Herramientas de análisis de políticas de SELinux

Verificación e Instalación

Verificar si SELinux está instalado:

rpm -qa | grep selinux

Instalar herramientas faltantes (CentOS/RHEL 8+):

sudo dnf install policycoreutils policycoreutils-python-utils setroubleshoot-server setools-console

Para CentOS/RHEL 7:

sudo yum install policycoreutils policycoreutils-python setroubleshoot-server setools-console

Verificar soporte del kernel para SELinux:

cat /sys/fs/selinux/enforce

Si el archivo existe, SELinux está soportado.

Configuración Paso a Paso de SELinux

Paso 1: Verificar el Estado Actual de SELinux

Ver el estado detallado de SELinux:

sestatus

Salida esperada:

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

Verificación rápida del estado:

getenforce

Devuelve: Enforcing, Permissive, o Disabled

Ver el contexto de seguridad actual:

id -Z

Salida de ejemplo: unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

Paso 2: Entender los Archivos de Configuración de SELinux

Archivo de configuración principal:

cat /etc/selinux/config

Contenido:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing

# SELINUXTYPE= can take one of these values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

Tipos de política explicados:

  • targeted: Política predeterminada, protege servicios orientados a red
  • minimum: Protección mínima, solo servicios críticos
  • mls: Seguridad Multi-Nivel para entornos clasificados

Paso 3: Cambiar Modos de SELinux

Cambiar temporalmente a modo permissive (hasta el reinicio):

sudo setenforce 0

Cambiar temporalmente a modo enforcing:

sudo setenforce 1

Verificar el cambio:

getenforce

Cambiar permanentemente el modo de SELinux:

Editar /etc/selinux/config:

sudo nano /etc/selinux/config

Cambiar la línea SELINUX:

SELINUX=enforcing  # or permissive or disabled

Reiniciar para que los cambios permanentes surtan efecto:

sudo reboot

ADVERTENCIA: Cambiar de disabled a enabled requiere reetiquetar todo el sistema de archivos en el próximo inicio.

Paso 4: Habilitar SELinux desde Estado Disabled

Si SELinux está actualmente deshabilitado:

  1. Editar configuración:

    sudo nano /etc/selinux/config
    

    Cambiar a:

    SELINUX=permissive
    SELINUXTYPE=targeted
    
  2. Reiniciar el sistema:

    sudo reboot
    
  3. Después del reinicio, el sistema reetiquetará todos los archivos (puede tomar tiempo)

  4. Verificar que el modo permissive esté funcionando:

    sestatus
    
  5. Verificar registros en busca de problemas:

    sudo grep "SELinux" /var/log/messages
    
  6. Si no hay problemas críticos, cambiar a enforcing:

    sudo nano /etc/selinux/config
    

    Cambiar a:

    SELINUX=enforcing
    
  7. Reiniciar nuevamente:

    sudo reboot
    

Paso 5: Gestionar Contextos de SELinux

Ver contextos de seguridad de archivos:

ls -Z /var/www/html/

Salida de ejemplo:

-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html

Ver contextos de procesos:

ps auxZ | grep httpd

Ver contextos de puertos:

sudo semanage port -l | grep http

Cambiar contexto de archivo temporalmente:

sudo chcon -t httpd_sys_content_t /var/www/html/newfile.html

Cambiar contexto de archivo permanentemente:

sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html/newfile.html"
sudo restorecon -v /var/www/html/newfile.html

Restaurar contextos predeterminados:

sudo restorecon -Rv /var/www/html/

Opciones:

  • -R: Recursivo
  • -v: Verbose
  • -F: Forzar reinicio

Paso 6: Gestionar Booleanos de SELinux

Los booleanos de SELinux permiten modificación en tiempo de ejecución del comportamiento de políticas sin reescribir políticas.

Listar todos los booleanos:

getsebool -a

Buscar booleano específico:

getsebool -a | grep httpd

Verificar booleano específico:

getsebool httpd_can_network_connect

Habilitar booleano temporalmente (hasta el reinicio):

sudo setsebool httpd_can_network_connect on

Habilitar booleano permanentemente:

sudo setsebool -P httpd_can_network_connect on

Booleanos útiles comunes:

# Allow httpd to connect to network
sudo setsebool -P httpd_can_network_connect on

# Allow httpd to connect to databases
sudo setsebool -P httpd_can_network_connect_db on

# Allow httpd to send mail
sudo setsebool -P httpd_can_sendmail on

# Allow FTP full access
sudo setsebool -P ftpd_full_access on

# Allow Samba to share home directories
sudo setsebool -P samba_enable_home_dirs on

Paso 7: Gestionar Etiquetado de Puertos de SELinux

Ver etiquetas de puertos:

sudo semanage port -l

Agregar puerto personalizado para servicio (ej., Apache en puerto 8080):

sudo semanage port -a -t http_port_t -p tcp 8080

Modificar etiqueta de puerto existente:

sudo semanage port -m -t http_port_t -p tcp 8080

Eliminar etiqueta de puerto:

sudo semanage port -d -t http_port_t -p tcp 8080

Ver modificaciones personalizadas:

sudo semanage port -l -C

Paso 8: Crear Políticas Personalizadas de SELinux

Para denegaciones recurrentes, crear políticas personalizadas:

  1. Identificar la denegación en los registros:

    sudo ausearch -m avc -ts recent
    
  2. Generar módulo de política:

    sudo grep denied /var/log/audit/audit.log | audit2allow -M mypolicy
    
  3. Revisar la política generada:

    cat mypolicy.te
    
  4. Instalar el módulo de política:

    sudo semodule -i mypolicy.pp
    
  5. Verificar instalación:

    sudo semodule -l | grep mypolicy
    

Eliminar módulo personalizado:

sudo semodule -r mypolicy

Consejos Avanzados de Hardening de SELinux

1. Usar Usuarios Confinados

Crear usuario Linux confinado:

sudo useradd -Z user_u username

Mapear usuario Linux a usuario SELinux:

sudo semanage login -a -s user_u username

Ver mapeos de usuarios:

sudo semanage login -l

Confinar usuarios administrativos:

sudo semanage login -a -s staff_u adminuser

2. Implementar Seguridad Multi-Categoría (MCS)

Etiquetar archivos con categorías:

sudo chcon -l s0:c0,c1 /path/to/file

Ejecutar proceso con categoría específica:

runcon -l s0:c0,c1 command

3. Auditar Política de SELinux

Buscar reglas de aplicación de tipos:

sesearch -A -s httpd_t -t httpd_sys_content_t

Encontrar qué procesos pueden acceder a un tipo:

sesearch -A -t httpd_sys_content_t

Verificar permiso específico:

sesearch -A -s httpd_t -c file -p write

4. Implementar Equivalencia de Contexto de Archivo

Hacer que un directorio sea equivalente en contexto a otro:

sudo semanage fcontext -a -e /var/www/html /srv/website
sudo restorecon -Rv /srv/website

5. Monitorear Denegaciones de SELinux en Tiempo Real

Ver registro de auditoría:

sudo tail -f /var/log/audit/audit.log | grep denied

Usar sealert para alertas legibles:

sudo sealert -a /var/log/audit/audit.log

Configurar alertas automáticas por correo electrónico:

Instalar y configurar setroubleshoot-server, que envía alertas automáticamente.

6. Optimizar Rendimiento de SELinux

Deshabilitar booleanos innecesarios:

Revisar y deshabilitar booleanos que no sean necesarios para tu entorno.

Usar política targeted:

Evitar política MLS a menos que sea específicamente requerida.

Minimizar políticas personalizadas:

Usar características de política integradas cuando sea posible.

7. Implementar Servicios Confinados

Asegurar que los servicios críticos se ejecuten confinados:

ps -eZ | grep -E '(httpd|nginx|mysqld|postfix)'

Verificar que muestren dominio específico (ej., httpd_t), no unconfined_t.

8. Actualizaciones Regulares de Política

Mantener las políticas de SELinux actualizadas:

sudo dnf update selinux-policy\*

Verificación y Pruebas

Verificar que SELinux Está en Modo Enforcing

Verificar estado:

getenforce
sestatus

Verificar que la política está cargada:

sudo semodule -l

Probar Aplicación de Contexto de Archivo

Crear archivo de prueba:

sudo touch /var/www/html/test.html

Verificar etiquetado automático:

ls -Z /var/www/html/test.html

Debería mostrar httpd_sys_content_t

Probar restauración de contexto:

sudo chcon -t user_home_t /var/www/html/test.html
ls -Z /var/www/html/test.html
sudo restorecon -v /var/www/html/test.html
ls -Z /var/www/html/test.html

Probar Denegaciones de SELinux

Intentar acción no autorizada:

sudo -u apache touch /root/test

Verificar denegación:

sudo ausearch -m avc -ts recent

Verificar Cambios de Booleanos

Cambiar booleano y verificar:

getsebool httpd_can_network_connect
sudo setsebool httpd_can_network_connect on
getsebool httpd_can_network_connect

Monitorear Comportamiento del Sistema

Verificar denegaciones inesperadas:

sudo ausearch -m avc -ts today

Usar setroubleshoot:

sudo sealert -a /var/log/audit/audit.log

Solución de Problemas Comunes

Problema 1: El Servicio No Inicia Después de Habilitar SELinux

Síntomas: El servicio falla al iniciar con errores de permisos

Soluciones:

  1. Verificar denegaciones:

    sudo ausearch -m avc -ts recent | grep service_name
    
  2. Usar sealert para sugerencias:

    sudo sealert -a /var/log/audit/audit.log
    
  3. Verificar contextos de archivo:

    ls -Z /path/to/service/files
    sudo restorecon -Rv /path/to/service/files
    
  4. Verificar booleanos requeridos:

    getsebool -a | grep service_name
    

Problema 2: El Servidor Web No Puede Acceder a Archivos

Síntomas: Apache/Nginx devuelve errores 403

Soluciones:

  1. Verificar contextos de archivo:

    ls -Z /var/www/html/
    
  2. Aplicar contexto correcto:

    sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
    sudo restorecon -Rv /var/www/html/
    
  3. Para directorios de usuario:

    sudo setsebool -P httpd_enable_homedirs on
    

Problema 3: Puerto Personalizado No Funciona

Síntomas: El servicio no puede vincularse a puerto no estándar

Soluciones:

  1. Verificar etiquetas de puerto actuales:

    sudo semanage port -l | grep http
    
  2. Agregar puerto personalizado:

    sudo semanage port -a -t http_port_t -p tcp 8080
    
  3. Verificar adición:

    sudo semanage port -l | grep 8080
    

Problema 4: El Sistema No Inicia Después de Habilitar SELinux

Síntomas: El sistema se cuelga o falla al iniciar

Soluciones:

  1. Iniciar en modo permissive:

    • Editar parámetros de arranque de GRUB
    • Agregar: enforcing=0
  2. Después del arranque, verificar problemas:

    sudo ausearch -m avc -ts today
    
  3. Corregir problemas, luego rehabilitar:

    sudo setenforce 1
    

Problema 5: El Reetiquetado Toma Demasiado Tiempo

Síntomas: El reetiquetado del sistema de archivos durante el arranque es muy lento

Soluciones:

  1. Crear bandera de autorelabel:

    sudo touch /.autorelabel
    sudo reboot
    
  2. O reetiquetar mientras se ejecuta:

    sudo fixfiles -F onboot
    sudo reboot
    
  3. Solo para rutas específicas:

    sudo restorecon -Rv /specific/path
    

Problema 6: Denegaciones Desconocidas

Síntomas: Denegaciones sin causa clara

Soluciones:

  1. Usar audit2why:

    sudo ausearch -m avc -ts recent | audit2why
    
  2. Obtener explicación detallada:

    sudo sealert -l <alert_id>
    
  3. Verificar reglas dontaudit:

    sudo semodule -DB  # Temporarily disable dontaudit
    # Reproduce issue
    sudo semodule -B   # Re-enable dontaudit
    

Mejores Prácticas para la Gestión de SELinux

1. Estrategia de Despliegue

  • Nunca deshabilitar SELinux: Usar modo permissive para resolución de problemas en su lugar
  • Comenzar con permissive: Los nuevos despliegues deberían comenzar en modo permissive
  • Aplicación gradual: Moverse a enforcing después de resolver todas las denegaciones
  • Probar exhaustivamente: Probar en no-producción antes de aplicar en producción
  • Planificar reetiquetado: Programar reetiquetado del sistema de archivos durante ventanas de mantenimiento

2. Prácticas Operacionales

  • Monitorear regularmente: Configurar monitoreo automatizado de denegaciones de SELinux
  • Usar rutas estándar: Adherirse a FHS para aprovechar contextos predeterminados
  • Aprovechar booleanos: Usar booleanos antes de crear políticas personalizadas
  • Políticas personalizadas mínimas: Depender de la política predeterminada cuando sea posible
  • Documentar cambios: Mantener registros de todas las personalizaciones de SELinux

3. Flujo de Trabajo de Resolución de Problemas

  1. Identificar la denegación en registros de auditoría
  2. Usar sealert/audit2why para análisis
  3. Verificar booleanos existentes que resuelvan el problema
  4. Verificar que los contextos de archivo sean correctos
  5. Solo crear política personalizada como último recurso
  6. Probar soluciones en modo permissive primero

4. Hardening de Seguridad

  • Aplicar en todos los sistemas: Ejecutar sistemas de producción en modo enforcing
  • Confinar usuarios: Usar usuarios confinados para cuentas interactivas
  • Auditar políticas personalizadas: Revisar regularmente módulos de política personalizados
  • Minimizar permisos: Aplicar principio de privilegio mínimo
  • Mantener actualizado: Actualizar regularmente políticas de SELinux

5. Gestión de Políticas

  • Usar módulos de política: Crear módulos separados para diferentes personalizaciones
  • Control de versiones: Rastrear políticas personalizadas en control de versiones
  • Documentación de políticas: Documentar por qué se crearon políticas personalizadas
  • Revisar regularmente: Auditar políticas personalizadas trimestralmente
  • Eliminar no usadas: Eliminar módulos de política personalizados obsoletos

6. Cumplimiento y Auditoría

  • Habilitar auditoría: Asegurar que el demonio de auditoría esté ejecutándose
  • Retención de registros: Mantener registros de SELinux según requisitos de cumplimiento
  • Revisiones regulares: Revisión mensual de denegaciones y personalizaciones de SELinux
  • Evaluaciones de seguridad: Incluir configuración de SELinux en auditorías de seguridad
  • Cumplimiento de políticas: Verificar que la política cumple con estándares de seguridad organizacionales

7. Capacitación y Documentación

  • Capacitación del equipo: Asegurar que los administradores entiendan los fundamentos de SELinux
  • Runbooks: Mantener documentación para tareas comunes de SELinux
  • Procedimientos de incidentes: Documentar procedimientos de respuesta para problemas de SELinux
  • Compartir conocimiento: Compartir soluciones a desafíos únicos de SELinux
  • Mantenerse actualizado: Seguir actualizaciones del proyecto SELinux y mejores prácticas

Conclusión

SELinux proporciona control de acceso obligatorio robusto que mejora significativamente la seguridad del sistema Linux. Aunque a menudo se percibe como complejo, SELinux se vuelve manejable y valioso una vez que se comprenden sus conceptos fundamentales y modos operacionales. Esta guía completa ha cubierto todo, desde configuración básica hasta gestión avanzada de políticas, proporcionándote el conocimiento para implementar y mantener efectivamente SELinux en entornos de producción.

Conclusiones clave:

  • Capa de seguridad esencial: SELinux proporciona protección crítica más allá de los permisos tradicionales
  • Tres modos operacionales: Enforcing, permissive y disabled cada uno sirve propósitos específicos
  • Seguridad basada en contexto: Comprender los contextos de seguridad es fundamental para SELinux
  • Implementación gradual: Comenzar con modo permissive, resolver problemas, luego aplicar
  • Soluciones integradas: Aprovechar booleanos y políticas predeterminadas antes de crear reglas personalizadas
  • Monitoreo continuo: El monitoreo y mantenimiento regular aseguran seguridad óptima

Siguiendo las prácticas descritas en esta guía, implementas un mecanismo de seguridad poderoso que protege contra amenazas conocidas y de día cero. SELinux es particularmente efectivo para contener aplicaciones comprometidas, prevenir escalada de privilegios y proteger datos sensibles mediante controles de acceso granulares.

Recuerda que SELinux no es un reemplazo para otras medidas de seguridad sino una capa complementaria en una estrategia integral de defensa en profundidad. Combinado con hardening apropiado del sistema, seguridad de red y monitoreo de seguridad, SELinux fortalece significativamente tu postura de seguridad general. Invierte tiempo en comprender y configurar apropiadamente SELinux—los beneficios de seguridad superan ampliamente la curva de aprendizaje inicial, y las herramientas modernas de resolución de problemas hacen que la gestión de SELinux sea cada vez más accesible para administradores de todos los niveles de habilidad.