在 Docker 中运行 nginx 时应如何配置 SELinux

在 Docker 中运行 nginx 时应如何配置 SELinux

Docker 文档中有一篇关于 Docker 安全性的好文章:https://docs.docker.com/articles/security/

但是,我不太清楚容器中的 root 权限进程实际上是如何在主机系统中运行的,以及我应该如何配置 SELinux 来处理进程“泄漏”到容器外的风险。

例如,我在容器中运行 nginx,当我在容器外执行“ps”时,我可以看到所有 nginx 进程。

root 7281 4078 0 01:36 ? 00:00:00 nginx: 主进程 nginx
www-data 7309 7281 0 01:36 ? 00:00:00 nginx:工作进程
www-data 7310 7281 0 01:36 ? 00:00:00 nginx:工作进程
www-data 7311 7281 0 01:36 ? 00:00:00 nginx:工作进程
www-data 7312 7281 0 01:36 ? 00:00:00 nginx:工作进程

这并不奇怪,因为这就是 Docker 的工作方式——它不是虚拟化,虚拟机之外什么都没有。使用 Docker,容器的进程在命名空间和有限权限内的主机操作系统上运行。它们直接与主机内核对话。

在这种情况下,我认为我应该配置 SELinux 来保护 nginx 进程而不是 docker 进程,就像它在没有 docker 的情况下运行一样。对吗?

此外,是否有任何特定的 Docker 配置更适合运行 nginx 之类的 Web 服务器?

答案1

当然,假设你正在使用启用了 SELinux 的 Docker(RHEL/CentOS 7 和 Fedora),那么你不需要做任何事情除此之外,还要确保 SELinux 已在主机上启用并执行。

使用 Docker 或 virsh 创建的容器会自动分配 SELinux 策略中指定的 SELinux 上下文。

您可能需要检查容器进程运行的安全上下文。为此,请将选项添加-Zps。例如:

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 策略,就好像它们是独立的操作系统安装一样。

对于 libvirt 管理的容器,这似乎还没有像 SELinux 那样完善(目前如此)。但总的来说,你不需要太担心。

相关内容