Cómo debo configurar SELinux cuando ejecuto nginx dentro de Docker

Hay un buen artículo en la documentación de Docker sobre seguridad con Docker: https://docs.docker.com/articles/security/

Sin embargo, no me queda muy claro cómo los procesos con privilegios de root en el contenedor realmente se ejecutan en el sistema host, y cómo se supone que debo configurar SELinux para manejar el riesgo de que el proceso se "filtre" fuera del contenedor.

Por ejemplo, estoy ejecutando nginx en un contenedor, y cuando hago " ps " fuera del contenedor, puedo ver todos los procesos de nginx.

root      7281  4078  0 01:36 ?        00:00:00 nginx: master process nginxwww-data  7309  7281  0 01:36 ?        00:00:00 nginx: worker processwww-data  7310  7281  0 01:36 ?        00:00:00 nginx: worker processwww-data  7311  7281  0 01:36 ?        00:00:00 nginx: worker processwww-data  7312  7281  0 01:36 ?        00:00:00 nginx: worker process

Esto no es una sorpresa, ya que esta es la forma en que funciona Docker: no es una virtualización en la que no aparece nada fuera de una máquina virtual. Con Docker, los procesos de un contenedor se ejecutan en el sistema operativo host dentro de espacios de nombres y privilegios limitados. Están hablando directamente con el núcleo del host.

En esta situación, creo que debería configurar SELinux para proteger el proceso nginx en lugar del de docker, como si se estuviera ejecutando sin docker. ¿Es correcto?

Además, ¿hay alguna configuración específica de Docker más apropiada para ejecutar servidores web como nginx ?

Suponiendo, por supuesto, que está utilizando una ventana acoplable habilitada para SELinux (RHEL/CentOS 7 y Fedora), entonces no deberías necesitar hacer nada aparte de asegurarse de que SELinux esté habilitado y se aplique en la máquina host.

Los contenedores creados con Docker o ssh se asignan automáticamente con un contexto de SELinux especificado en la directiva de SELinux.

Es posible que desee verificar el contexto de seguridad en el que se ejecutan los procesos de su contenedor. Para hacerlo, agregue el -Z opción de ps. Por ejemplo:

LABEL                             PID TTY      STAT   TIME COMMANDsystem_u:system_r:virtd_lxc_t:s0:c5,c342 26351 ? Ss   0:00 /sbin/initsystem_u:system_r:virtd_lxc_t:s0:c5,c342 26458 ? Ss   0:00 /usr/sbin/sshd -D

Tenga en cuenta que SELinux en sí no tiene un espacio de nombres, por lo que no puede tener políticas de SELinux separadas dentro de los contenedores, como si fueran instalaciones de SO independientes.

Esto tampoco parece estar tan bien desarrollado (todavía) como SELinux para contenedores administrados por libvirt. Pero, en general, no debería ser algo de lo que deba preocuparse mucho.