Как я должен настроить SELinux при запуске nginx внутри Docker

В документации Docker есть хорошая статья о безопасности с помощью Docker: https://docs.docker.com/articles/security/

Однако мне не очень ясно, как процессы с привилегиями root в контейнере на самом деле выполняются в хост-системе, и как я должен настроить SELinux, чтобы справиться с риском "утечки" процесса за пределы контейнера.

Например, я запускаю nginx в контейнере, и когда я выполняю "ps" вне контейнера, я могу видеть все процессы 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

Это неудивительно, поскольку именно так работает Docker - это не виртуализация, где ничего не появляется за пределами виртуальной машины. С помощью Docker процессы контейнера выполняются в ОС хоста в пределах пространств имен и с ограниченными привилегиями. Они разговаривают непосредственно с ядром хоста.

В этой ситуации я полагаю, что мне следует настроить SELinux для защиты процесса nginx вместо процесса docker, как если бы он работал без docker. Это правильно?

Кроме того, существует ли какая-либо конкретная конфигурация Docker, более подходящая для запуска веб-серверов, таких как nginx?

Предполагая, конечно, что вы используете докер с поддержкой SELinux (RHEL / CentOS 7 и Fedora), тогда вам не нужно ничего делать помимо того, убедитесь, что SELinux включен и применяется на главном компьютере.

Контейнерам, созданным с помощью Docker или virsh, автоматически присваивается контекст SELinux, указанный в политике SELinux.

Возможно, вы захотите проверить контекст безопасности, в котором выполняются процессы вашего контейнера. Для этого добавьте -Z возможность для ps. Например:

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

Обратите внимание, что сам SELinux не имеет пространства имен, поэтому вы не можете иметь отдельные политики SELinux внутри контейнеров, как если бы они были независимыми установками ОС.

Это также, по-видимому, не так хорошо разработано (пока), как SELinux для контейнеров, управляемых libvirt. Но в целом это не должно быть чем-то, о чем вам нужно сильно беспокоиться.