- 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_t
,container_file_t
也是 的别名svirt_sandbox_file_t
。更多信息可在Dan Walsh 的博客上找到。
默认情况下,容器使用标签运行,并container_t
允许在. 和下的文件具有标签。/usr
/etc
/var/lib/docker
/var/lib/containers
container_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.
- Enable SELinux on the host operating system
- Install Docker CE with the
container-selinux
package - Enabled the container cgroup boolean
setsebool container_manage_cgroup 1
- Add
"selinux-enabled": true
to/etc/docker/daemon.json
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.
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫