Inicio / Blog / SELinux y control de acceso obligatorio

SELinux y control de acceso obligatorio

Publicado el 29/12/2014, por Antonio López (INCIBE)
SELinux

Security Enhanced Linux, SELinux, es un proyecto que nació con la intención de dotar de medidas de seguridad más estrictas para el control de acceso y permisos sobre usuarios, procesos, ficheros, dispositivos, etc. en sistemas Linux. Esta propuesta vio la luz inicialmente en el año 2000 desde la NSA (National Security Agency) de Estados Unidos, publicada como código abierto bajo licencia GNU PNL. Este proyecto se integró en los módulos de seguridad Linux (LSM) desde de la versión 2.6.0 del kernel Linux publicado en 2003. A partir de ese momento varias personas, comunidades y organizaciones han colaborado para implementar, mejorar y mantener el proyecto. Red hat, o SElinux Project son dos actores principales en este proceso.

 

¿Qué es SELinux?

 

SELinux es una implementación de control de acceso obligatorio (MAC), en este caso para sistemas Linux. Frente a mecanismos tradicionales basados en permisos de fichero, el control de acceso obligatorio aporta una mayor seguridad en acceso e interacciones entre objetos (dispositivos, ficheros) y sujetos (usuarios, procesos, comunicaciones y acciones) del sistema. Además, este sistema de control de acceso es "transparente" para el usuario del sistema y su configuración depende de un administrador con máximo privilegio en el sistema.

SELinux se basa en "contextos de seguridad", asignando unas "etiquetas" a todo elemento bajo supervisión y una política que define qué acceso y qué operaciones están permitidos. Las reglas establecidas por la política SELinux se aplicarán de forma ineludible sobre los contextos, por encima de los permisos de ficheros (lectura, escritura, ejecución), típicos de un control de acceso discrecional (DAC).

Hay dos términos fundamentales para entender SELinux: etiquetas y tipos de restricciones. Con SELinux todo fichero, usuario, puerto, proceso, etc. tiene unas "etiquetas" que caracterizarán los permisos y acciones que tiene permitidos y conforma lo que se denomina un contexto de seguridad SELinux. Las restricciones vienen determinadas por las reglas establecidas en la política.

- Etiquetas y políticas SELinux -

 

Componentes SELinux

 

Políticas SELinux.

SELinux incorpora dos tipos de políticas:

  • Política "targeted": Donde únicamente una serie de demonios escogidos del sistema están bajo el control SELinux, entre ellos los de apache, dns, proxy squid, snmp y syslog. Es la política por defecto y proporciona ya de por sí un control bastante eficaz y de relativa sencillez de administración. El resto de demonios o procesos quedan fuera del contexto de seguridad SELinux y sobre los cuales aplica la seguridad estándar de Linux.
  • Política Multinivel/Multicategoría (MLS/MCS): Es una aplicación avanzada de SELinux de una complejidad y alcance que queda fuera de este artículo. Es utilizada cuando se quiere aportar un estricto control por ejemplo, en organizaciones cuya seguridad es crítica.

Contexto y Etiquetado SELinux.

Como se ha indicado, todo elemento bajo la supervisión de SELinux opera en un contexto de seguridad. El contexto SELinux de un objeto o sujeto del sistema se especifica con unas "etiquetas" que se almacenan como atributos extendidos en ficheros y directorios en el sistema de ficheros. En el caso de procesos, puertos, etc., es el propio kernel el que mantiene las etiquetas. Las etiquetas se establecen basándose en unas políticas genéricas configuradas en el sistema. Estos contextos preconfigurados pueden ser modificados, adaptados o incluso desactivados por un administrador según las necesidades requeridas.

Las etiquetas SELinux siguen el siguiente formato:

user:role:type:level(sensibilidad:categoría)

La etiqueta user identifica el usuario selinux, un concepto diferente el usuario Linux.

La etiqueta role, es la parte del modelo basado en roles (RBAC) utilizada también por SELinux.

La etiqueta type, define el tipo de restricción. En caso de un proceso se denomina dominio y en el caso de un fichero se denomina tipo. Las reglas de la política SELinux determinan como pueden acceder tipos entre sí, dominios con tipos , o accesos entre dominios

La etiqueta level se utiliza con políticas avanzadas MLS/MCS. Son extensiones que permiten un control aún más preciso mediante un etiquetado adicional con dos entidades: sensibilidad y categoría. La etiqueta sensibilidad es jerárquica, así un proceso en un determinado nivel tiene acceso de lectura a niveles inferiores pero solo puede escribir en nivel igual o superior. La etiqueta categoría es un atributo no jerárquico. Con este tipo de política se pueden definen reglas más granulares y precisas, aunque la complejidad aumenta.

La forma más sencilla de operar de SELinux es a través de políticas "targeted" que se basan principalmente en el uso de las etiquetas type.

Los contextos que conformados por las etiquetas pueden visualizarse de forma sencilla con el parámetro "Z" en comandos como ls para ficheros o directorios.

En el siguiente ejemplo podemos ver el contexto definido para el contenido del directorio /var/www. Observamos que SELinux establece en este contexto el usuario system_u, el rol object_r, y el tipo asociados a cada objeto, en este caso tipos (dominios) relacionados con los contenidos del programa apache y su demonio httpd. Finalmente s0, marca el nivel el cual solo es relevante en políticas MLS/MC.

- Etiquetas y contexto SELinux . El "." que sigue a las ternas rxw de los permisos indican la presencia de SELinux en el sistema -

Similarmente, puede comprobarse el etiquetado con el mismo parámetro para usuarios (id -Z) o procesos (ps -Z). Obsérvese el tipo "unconfined_t" y las etiquetas extendidas MLS/MCS (s0-s0:c0.c1023)

- Etiquetas SELinux de usuario (id- Z) y procesos (ps -Z) -

Booleanos.

Los booleanos son valores concretos de las políticas SELinux que pueden ser cambiados en tiempo de ejecución sin tener que manipular una política definida. Es útil para modificar elementos o acciones concretas en tiempo de ejecución o hacer persistente con la opción de hacer el cambio permanente (parámetro -P). Los comandos para visualizar y manipular booleanos son getsebool y setsebool.

En el siguiente ejemplo podemos ver como cambiar el booleano allow_ftpd_anon_write al valor "on" lo que concede permiso de escritura ftp al usuario anónimo.

- Cambiando un valor booleano del demonio ftpd -

 

Modo de ejecución de SELinux.

 

SELinux puede operar bajo tres modos distintos:

  • Enforcing: SELinux aplica sus políticas y toma las acciones establecidas si se produce alguna violación de la misma.
  • Permissive: SELinux aplica las políticas pero no toma acciones, únicamente registra y alerta al administrador de que se ha violado alguna regla
  • Disabled: SELinux está deshabilitado.

El modo puede fijarse de forma permanente en el fichero de configuración /ect/selinux/config. En ese fichero también se especifica el tipo de política (por defecto, "targeted")

- Configuración modo SELinux -

En tiempo de ejecución, los comandos sestatus, getenforce, setenforce permiten comprobar, activar y desactivar cómodamente SELinux sin tener que reiniciar el sistema y sin que los resultados sean persistentes a reinicios:

- Activación, desactivación dinámica de SELinux -

¿Cómo funciona SELinux?

 

Las reglas definidas en la política SELinux es cacheada por el kernel del sistema en vectores AVC (Access Vector Cache) que contienen los permisos de cada objeto y sujeto bajo control. Cuando una operación o acceso va a ejecutarse, el kernel comprueba la cache AVC permitiendo o bloqueando la acción según corresponda.

- Proceso de decisión SELinux (Red Hat. Selinux Users and Administrators Guide) -

Todas las acciones que adopta SELinux vienen determinadas pues por los contextos (etiquetados) y por las restricciones definidas en las reglas de la política que se almacenan el los vectores AVC.

SELinux en acción

EL contexto que crea el etiquetado SELinux aplica a todo elemento del sistema, incluido usuarios del mismo (etiqueta _u). Con esto se consiguen crear "dominios" caracterizados por su contexto de seguridad y aplicar las reglas para la interacción entre elementos de los distintos dominios.

Por ejemplo, para el caso de los usuarios del sistema Linux, tenemos que todos ellos tienen un contexto determinado por sus etiquetas, entre ellas la etiqueta _u que identifica el correspondiente usuario selinux. Esto permite añadir una capa de seguridad adicional a los tradicionales permisos discrecionales (DAC) del usuario Linux con el control de acceso obligatorio (MAC) del usuario selinux. Los permisos del usuario selinux aplican según el contexto en el que el usuario esté confinado con su etiquetado.

- Usuarios selinux. Etiquetado -

- Control de acceso clásico Linux (DAC) -

Similarmente, todos los procesos y ficheros están etiquetados con un tipo (etiqueta _t). Podemos entender que el tipo representa un dominio para los procesos y un tipo para ficheros. De esta forma se consigue que cada proceso se separe de otros que se encuentren corriendo en otro dominio determinado por su contexto. Las políticas SELinux establecerán cómo los procesos pueden interaccionar con otros procesos o ficheros. ¿Qué conseguimos con esto? Confinamiento. Este modo de operación disminuye, por ejemplo, el riesgo de elevación de privilegios o que unos procesos puedan acceder a determinados ficheros o ejecutables aunque los permisos clásicos (DAC) lo permitan. Todo ello gracias a la separación en contextos SELinux. Por ejemplo, supongamos que un servidor HTTP es comprometido por un atacante. Con una política SELinux bien configurada, el ataque se verá confinado y restringido a lo permitido en el contexto y dominio del proceso del usuario, rol, tipo y opcionalmente el nivel, así como el dominio del proceso. Se denegará la opción a acceder a otros recursos que bajo un mecanismo discrecional podrían ser vulnerados.

- Control de Acceso MAC. SELinux. Confinamientos en contextos -

 

 

Un ejemplo práctico.

 

Vamos a describir un ejemplo en el cual el control de acceso SELinux deniega en última instancia la ejecución de un fichero, aun cuando los permisos estándar Linux lo permiten.

Usuarios selinux y contexto.

Cada usuario del sistema Linux está "mapeado" a un tipo de usuario SELinux con la correspondiente política.

Veamos los tipos de usuarios selinux:

- Etiquetas de usuario y rol SELinux -

El usuario SELinux unconfined_u es un tipo de usuario selinux que no está bajo ninguna restricción de contexto particular. De este modo, sobre este tipo de usuario solo aplicarán las restricciones de seguridad estándar de Linux DAC.

En la figura siguiente comprobamos que el usuario2 el puede ejecutar el archivo "fichero.sh" puesto que los permisos estándar que tiene permiten ejecución tanto al usuario propietario (usuario1) como a usuarios del grupo y otros:

-rwxrwxr-x usuario1 usuario1 fichero.sh

Como los permisos estándar permiten el acceso y no existe restricción de contexto SELinux, la ejecución del archivo por parte del usuario2 es permitida:

- Usuarios selinux en el sistema. Por defecto, a cada usuario linux se le asigna el usuario selinux "unconfined_u" -

Ahora comprobemos que ocurre cuando al usuario2 (usuario selinux unconfined_u) se le modifica el mapeo SELinux y se le asocia el usuario selinux guest_u.

Según el guía de administración de SELinux publicada por Red Hat, el usuario selinux guest_u, tiene restringido los permisos de ejecución:

"By default, Linux users in the guest_t and xguest_t domains cannot execute applications in their home directories or the /tmp/ directory, preventing them from executing applications, which inherit users’ permissions, in directories they have write access to. This helps prevent flawed or malicious applications from modifying users’ files."

 

Es decir un usuario Linux mapeado a un usuario selinux "guest_u" no podrá ejecutar ficheros aun cuando posea permisos de ejecución Linux (DAC) para ello.

Efectivamente, si cambiamos el mapeo del usuario2 al usuario selinux guest_u comprobaremos como la aplicación de la política SELinux impedirá la ejecución:

- Modificación de la etiqueta que identifica el usuario SELinux. Cambiamos el tipo unconfined_u a guest_u -

- Ejecución denegada por SELinux a pesar de existir permisos de ejecución para todo usuario Linux -

SELinux cuenta además con un mecanismo de registro de eventos cuando se ha producido una violación de AVC y unas herramientas destinadas a detectar posibles problemas, así como sugerir la solución. Estos registros se almacenan en un registro de log que se gobierna por un proceso del sistema. En el caso del ejemplo, el evento generado es el siguiente:

- Registro de log generado por SELinux -