В документации 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. Но в целом вам не о чем сильно беспокоиться.