Configuración del Control de Acceso Obligatorio (MAC) con SELinux
Se recomienda configurar algún tipo de control de acceso obligatorio (MAC) en el host de Docker, ya sea a través de SELinux o AppArmor, dependiendo de la distribución de Linux. En esta receta, veremos cómo configurar SELinux en un sistema instalado con Fedora/RHEL/CentOS. Primero, veamos qué es SELinux:
-
SELinux es un sistema de etiquetado
-
Cada proceso tiene una etiqueta
-
Cada archivo, directorio y objeto del sistema tiene una etiqueta
-
Las reglas de política controlan el acceso entre procesos etiquetados y objetos etiquetados
-
El núcleo hace cumplir las reglas
Con los contenedores de Docker, utilizamos dos tipos de aplicación de SELinux:
-
Aplicación de tipo : se utiliza para proteger el sistema host de los procesos del contenedor. Cada proceso del contenedor se etiqueta con
svirt_lxc_net_t, y cada archivo del contenedor se etiqueta consvirt_sandbox_file_t. El tiposvirt_lxc_net_testá permitido para gestionar cualquier contenido etiquetado consvirt_sandbox_file_t. Los procesos del contenedor solo pueden acceder o escribir archivos del contenedor. -
Aplicación de seguridad de varias categorías : al establecer la aplicación de tipo, todos los procesos del contenedor se ejecutarán con la etiqueta
svirt_lxc_net_t, y todo el contenido se etiquetará consvirt_sandbox_file_t. Sin embargo, con solo estas configuraciones, no estamos protegiendo un contenedor de otro porque sus etiquetas son las mismas.
Utilizamos la aplicación de seguridad de varias categorías ( MCS ) para proteger un contenedor de otro, que se basa en la seguridad de varios niveles ( MLS ). Cuando se lanza un contenedor, el demonio de Docker elige una etiqueta MCS aleatoria, por ejemplo, s0:c41,c717 y la guarda con los metadatos del contenedor. Cuando cualquier proceso del contenedor se inicia, el demonio de Docker le dice al núcleo que aplique la etiqueta MCS correcta. Como la etiqueta MCS se guarda en los metadatos, si el contenedor se reinicia, obtiene la misma etiqueta MCS.
Preparación
Necesitarás un host Fedora/RHEL/CentOS con la versión más reciente de Docker instalada, que se pueda acceder a través de un cliente de Docker.
Cómo hacerlo…
Fedora/RHEL/CentOS se instala por defecto con SELinux en modo de aplicación, y el demonio de Docker se configura para iniciarse con SELinux. Para comprobar si se cumplen estas condiciones, sigue los siguientes pasos.
- Ejecuta el siguiente comando para asegurarte de que SELinux esté habilitado:
$ sudo setenforce 1
$ getenforce

Si el comando anterior devuelve Enforcing, entonces todo está bien. Si no, entonces debemos cambiarlo actualizando el archivo de configuración de SELinux ( /etc/selinux/config ) y reiniciando el sistema.
- Docker debe estar ejecutándose con la opción
--selinux-enabled. Puedes comprobar el archivo de configuración del demonio de Docker (/etc/docker/daemon.json) y verificar si el servicio de Docker se ha iniciado con la opción de SELinux:

$ docker info

El comando anterior supone que no estás iniciando Docker en modo de demonio manualmente.
Iniciemos un contenedor (sin la opción de privilegios) después de montar un directorio del host como un volumen e intentemos crear un archivo en él:

Como era de esperar, vemos “Permiso denegado” porque un proceso del contenedor con la etiqueta svirt_lxc_net_t no puede crear archivos en el sistema de archivos del host. Si miramos los registros de SELinux ( /var/log/audit/audit.log ) en el host, veremos mensajes similares a los siguientes:

La etiqueta s0:c24,c960 es la etiqueta MCS del contenedor.
Cómo funciona…
SELinux establece tanto la aplicación de tipo como la aplicación de seguridad de varias categorías cuando se configuran las opciones correctas para SELinux y Docker. El núcleo de Linux hace cumplir estas aplicaciones.
Hay más…
Hay mucho que se puede hacer con SELinux para ayudar a hacer que nuestro sistema sea más seguro. A continuación, te presento algunos consejos adicionales:
- Si SELinux está en modo de aplicación y el demonio de Docker está configurado para utilizar SELinux, entonces no podremos apagar el host desde el contenedor, como hicimos anteriormente en este capítulo:

-
Como sabemos, por defecto, todos los contenedores se ejecutarán con la etiqueta
svirt_lxc_net_t, pero también podemos ajustar las etiquetas de SELinux para requisitos personalizados. Intenta visitar la sección de ajuste de etiquetas de SELinux en http://opensource.com/business/15/3/docker-security-tuning. -
Configurar MLS con contenedores de Docker también es posible. Intenta visitar la sección de modo de seguridad de varios niveles en http://opensource.com/business/15/3/docker-security-tuning.
Ver también
El libro de colorear de SELinux está disponible en https://people.redhat.com/duffy/selinux/selinux-coloring-book_A4-Stapled.pdf.