- 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
如果您想挂载一个文件夹,以便只有该容器可以访问该文件夹,例如您的日志记录守护程序,请: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 配合使用的策略模块。
- 在主机操作系统上启用 SELinux
container-selinux
使用包安装 Docker CE- 启用容器 cgroup 布尔值
setsebool container_manage_cgroup 1
- 添加
"selinux-enabled": true
到/etc/docker/daemon.json
systemctl daemon-reload && systemctl restart docker
结论
容器 linux 可能难以使用,并且可能会干扰 Kubernetes CNI 驱动程序、CSI 驱动程序和一些 Ingress Controller。一些常见的检查是访问特权端口,或访问主机上的文件。
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫