将 SELinux 与容器一起使用

  • A+
所属分类:系统文档

Security-Enhanced Linux (SELinux) 是一个 Linux 内核安全模块,它提供了一种支持访问控制安全策略的机制,包括强制访问控制 (MAC)。容器支持在启用 SELinux 的主机上运行。

如果您刚刚开始使用 SeLinux,我强烈建议您观看“Thomas Cameron 为普通人设计的安全增强型 Linux”

在云中,如果您希望在 SELinux 上运行容器,则需要在 CentOS 或 Red Hat Enterprise Linux 上运行。这些操作系统对 SELinux 和相应的策略模块的支持最好。

我最近一直在研究 SELinux,以便在高度监管的环境中使用。我试图解释 SELinux 如何与容器一起工作以及如何开始。

用于容器的 SELinux

容器的 SELinux 策略由container-selinux包定义。Docker CE 需要这个包(以及它的依赖项),以便 Docker 创建的进程和文件能够在有限的系统访问权限下运行。容器利用container_t标签,它只是一个别名svirt_lxc_net_tcontainer_file_t也是一个别名svirt_sandbox_file_t更多信息可在Dan Walsh 的博客上找到。

默认情况下,容器使用标签运行并且container_t允许. 下的文件具有标签/usr/etc/var/lib/docker/var/lib/containerscontainer_var_lib_t

ls -Z /var/lib/docker
# drwx------. root root system_u:object_r:container_var_lib_t:s0 builder
# drwx--x--x. root root system_u:object_r:container_var_lib_t:s0 buildkit
# drwx------. root root system_u:object_r:container_var_lib_t:s0 containers
# drwx------. root root system_u:object_r:container_var_lib_t:s0 image
# drwx------. root root system_u:object_r:container_var_lib_t:s0 lost+found
# drwxr-x---. root root system_u:object_r:container_var_lib_t:s0 network
# drwx------. root root system_u:object_r:container_share_t:s0 overlay2
# drwx------. root root system_u:object_r:container_var_lib_t:s0 plugins
# drwx------. root root system_u:object_r:container_var_lib_t:s0 runtimes
# drwx------. root root system_u:object_r:container_var_lib_t:s0 swarm
# drwx------. root root system_u:object_r:container_var_lib_t:s0 tmp
# drwx------. root root system_u:object_r:container_var_lib_t:s0 trust
# drwx------. root root system_u:object_r:container_var_lib_t:s0 volumes
ls -Z /etc/docker
# dr--r--r--. root root unconfined_u:object_r:cert_t:s0  certs.d
# -rw-r--r--. root root system_u:object_r:container_config_t:s0 daemon.json
# -rw-------. root root system_u:object_r:container_config_t:s0 key.json

容器无权访问这些文件夹,因为它会干扰容器引擎。默认情况下,SELinux 策略还阻止将受保护的文件挂载到容器中。

docker run -it \
  -v /var/lib/docker/image/overlay2/repositories.json:/host/repositories.json \
  centos:7 cat /host/repositories.json
# cat: /host/repositories.json: Permission denied

docker run -it \
  -v /etc/passwd:/host/etc/passwd \
  centos:7 cat /host/etc/passwd
# cat: /host/etc/passwd: Permission denied

标有container_file_t的文件是容器可写的唯一文件。如果您希望卷挂载可写,则需要在末尾指定:z或。:Z他们的行为是不同的,所以要小心你使用的是哪一个。让我们从:z

ls -Z /var/lib/misc
# -rw-r--r--. root root system_u:object_r:var_lib_t:s0   postfix.aliasesdb-stamp

docker run -it \
  -v /var/lib/misc:/host/var/lib/misc:z \
  centos:7 echo "Relabeled!"

ls -Z /var/lib/misc
#-rw-r--r--. root root system_u:object_r:container_file_t:s0 postfix.aliasesdb-stamp

如果您想挂载一个文件夹,以便只有该容器可以访问该文件夹,例如您的日志记录守护程序,请:z使用:Z.

docker run -it \
  -v /var/log:/host/var/log:Z \
  fluentbit:latest

如何为容器启用 SELinux

仅 CentOS 和 Red Hat Enterprise Linux 支持使用容器启用 SELinux 。

Amazon Linux 2 目前缺少使容器与 SELinux 配合使用的策略模块。

  1. 在主机操作系统上启用 SELinux
  2. container-selinux使用包安装 Docker CE
  3. 启用容器 cgroup 布尔值setsebool container_manage_cgroup 1
  4. 添加"selinux-enabled": true/etc/docker/daemon.json
  5. systemctl daemon-reload && systemctl restart docker

结论

容器 linux 可能难以使用,并且可能会干扰 Kubernetes CNI 驱动程序、CSI 驱动程序和一些 Ingress Controller。一些常见的检查是访问特权端口,或访问主机上的文件。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin