SELinux (Security-Enhanced Linux) es un sistema de control de acceso obligatorio (Mandatory Access Control, MAC) que añade una capa adicional de seguridad a los sistemas operativos basados en Linux. Para entender cómo funciona, lo desglosaré en partes utilizando analogías que harán más claro su propósito y operación.
¿Qué es SELinux?
SELinux es como un guardia de seguridad en un edificio. Aunque las puertas (permisos de archivos estándar en Linux) ya tienen cerraduras y permiten o deniegan acceso a las personas (usuarios y procesos), el guardia de seguridad (SELinux) tiene reglas más estrictas que determinan qué personas (usuarios o procesos) pueden entrar en qué habitaciones (archivos, directorios o recursos) y qué pueden hacer allí, independientemente de si tienen una llave válida.
SELinux introduce políticas de seguridad que controlan cómo los procesos interactúan con el sistema, los recursos y entre sí, evitando accesos indebidos incluso si alguien intenta engañar las «cerraduras» tradicionales.
Los dos enfoques clave de seguridad en Linux
- Control de Acceso Discrecional (DAC): Este es el modelo estándar de permisos en Linux. Es como usar cerraduras en las puertas donde el dueño (propietario del archivo) decide quién tiene acceso y qué pueden hacer (lectura, escritura, ejecución).
- Problema: Si un usuario malintencionado o un malware compromete un proceso con permisos suficientes, puede abusar de ellos.
- Control de Acceso Obligatorio (MAC): Aquí es donde entra SELinux. En lugar de depender solo de las decisiones del propietario, el sistema impone reglas que no pueden ser ignoradas, incluso por usuarios con permisos elevados.
¿Cómo funciona SELinux?
Imagina un edificio con un guardia (SELinux) que sigue estrictamente un manual de políticas. Este manual define:
- Tipos de recursos (habitaciones, oficinas, almacenes, etc.).
- Qué roles (empleados, visitantes, personal de limpieza) pueden acceder a qué recursos y con qué permisos.
- Qué acciones están permitidas (entrar, usar equipos, leer documentos).
En términos técnicos:
Contextos de seguridad: SELinux etiqueta cada archivo, proceso y recurso con un «contexto de seguridad», que describe su tipo, rol y usuario.
user_u:role_r:type_t:s0
- user_u: Usuario.
- role_r: Rol asignado al usuario o proceso.
- type_t: Tipo del recurso.
- s0: Nivel de sensibilidad (útil en configuraciones de múltiples niveles de seguridad).
Un archivo de configuración podría tener el contexto system_u:object_r:etc_t:s0
Un servidor web podría ejecutarse con el contexto system_u:system_r:httpd_t:s0
Políticas de SELinux: Estas son como el manual del guardia. Definen qué tipos pueden interactuar con otros tipos y cómo. Por ejemplo:
Un proceso con contexto httpd_t (servidor web) puede leer archivos con contexto httpd_sys_content_t (archivos públicos del servidor), pero no archivos etiquetados como shadow_t (archivos del sistema sensibles).
Modos de funcionamiento de SELinux
SELinux puede operar en tres modos, según el nivel de seguridad deseado:
- Enforcing (Aplicativo): SELinux impone las políticas, bloqueando cualquier acceso no permitido y registrándolo en los logs.
- Ejemplo: Si un proceso intenta acceder a un archivo para el cual no tiene permiso según las políticas, lo bloqueará.
- Permissive (Permisivo): SELinux no bloquea los accesos, pero registra todos los intentos no permitidos. Es útil para pruebas y depuración.
- Disabled (Desactivado): SELinux está desactivado, y el sistema depende únicamente de los permisos tradicionales.
Componentes principales de SELinux
- Políticas de SELinux: Existen dos tipos principales de políticas:
- Política dirigida (targeted): Se enfoca en proteger servicios críticos, mientras que otros procesos quedan con menos restricciones.
- Política estricta (strict): Aplica controles a todos los procesos en el sistema.
- Etiquetas de contexto de seguridad: Todo en el sistema tiene una etiqueta (archivo, directorio, proceso, puerto). Estas etiquetas son claves para que se determine el acceso permitido.
- Herramientas de gestión:
- getenforce: Para verificar el modo de SELinux.
- setenforce: Para cambiar entre los modos Enforcing y Permissive.
- ls -Z o ps -Z: Para ver las etiquetas de contexto de seguridad.
- semanage, audit2allow, restorecon: Herramientas avanzadas para configurar y depurar SELinux.
- Logs: Se registran los eventos en /var/log/audit/audit.log. Analizar estos logs es esencial para entender y solucionar problemas de acceso.
Ejemplo práctico
Supongamos que un servidor web (Apache) intenta acceder a un archivo de configuración:
- Apache tiene el contexto de proceso httpd_t.
- El archivo tiene el contexto httpd_config_t.
- La política SELinux dice que httpd_t puede leer archivos con httpd_config_t.
Si alguien intenta modificar este archivo desde un proceso no autorizado (por ejemplo, un script malicioso etiquetado como user_t), SELinux bloqueará el acceso y registrará el intento.
Ventajas
- Protección adicional contra ataques: Incluso si un atacante obtiene acceso a un proceso, puede limitar lo que puede hacer.
- Menor impacto de vulnerabilidades: Un proceso comprometido no puede acceder a recursos críticos que no están dentro de sus permisos definidos por las políticas.
Desventajas
- Curva de aprendizaje pronunciada: Configurar y depurar puede ser complicado.
- Posibles interrupciones: Si las políticas no están configuradas correctamente, procesos legítimos pueden ser bloqueados.