Como devo configurar o SELinux ao executar o nginx dentro do Docker

Há um bom artigo na documentação do Docker sobre segurança com o Docker: https://docs.docker.com/articles/security/

No entanto, não está muito claro para mim como os processos com privilégios de root no contêiner realmente são executados no sistema host e como devo configurar o SELinux para lidar com o risco de "vazamento" do processo fora do contêiner.

Por exemplo, estou executando o nginx em um contêiner e, quando faço "ps" fora do contêiner, posso ver todos os processos do 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

Isso não é uma surpresa, pois é assim que o Docker funciona - não é virtualização onde nada aparece fora de uma VM. Com o Docker, os processos de um contêiner são executados no sistema operacional host em namespaces e privilégios limitados. Eles estão falando diretamente com o kernel do host.

Nesta situação, acredito que devo configurar o SELinux para proteger o processo nginx em vez do docker, como se estivesse em execução sem o docker. Está correcto?

Além disso, existe alguma configuração específica do Docker mais apropriada para executar servidores da Web como o nginx ?

Supondo, é claro, que você esteja usando um Docker habilitado para SELinux (RHEL/CentOS 7 e Fedora) então você não deve precisar fazer nada além de certificar-se de que SELinux está habilitado e fazer cumprir na máquina host.

Os contêineres criados com Docker ou virsh são atribuídos automaticamente a um contexto SELinux especificado na política SELinux.

Você pode querer verificar o contexto de segurança em que os processos do seu contêiner são executados. Para fazer isso, adicione o -Z opção para ps. Por exemplo:

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

Observe que o SELinux em si não tem namespaced, portanto, você não pode ter políticas SELinux separadas em contêineres, como se fossem instalações independentes do sistema operacional.

Isso também não parece ser tão bem desenvolvido (ainda) quanto o SELinux para contêineres gerenciados pela libvirt. Mas, em geral, não deve ser algo com o qual você precisa se preocupar muito.