Назад | Перейти на главную страницу

Как мне настроить 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 nginx
www-data  7309  7281  0 01:36 ?        00:00:00 nginx: worker process
www-data  7310  7281  0 01:36 ?        00:00:00 nginx: worker process
www-data  7311  7281  0 01:36 ?        00:00:00 nginx: worker process
www-data  7312  7281  0 01:36 ?        00:00:00 nginx: worker process

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

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

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

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

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

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

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

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

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