Using SELinux with Containers

  • 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

If you want to mount a folder so that only that container can access the folder, for example such as your logging daemon, swap out :z with :Z.

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

How to Enable SELinux for Containers

Enabling SELinux with containers is only supported on CentOS and Red Hat Enterprise Linux.

Amazon Linux 2 currently lacks the policy modules that make containers work with SELinux.

  1. Enable SELinux on the host operating system
  2. Install Docker CE with the container-selinux package
  3. Enabled the container cgroup boolean setsebool container_manage_cgroup 1
  4. Add "selinux-enabled": true to /etc/docker/daemon.json
  5. systemctl daemon-reload && systemctl restart docker

Conclusion

Container linux can be difficult to work with and may interfere with Kubernetes CNI drivers, CSI drivers, and some Ingress Controllers. Some common things to check for are access to privileged ports, or access to files on the host.

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