Security-Enhanced Linux (SELinux) 是一个 Linux 内核安全模块,提供支持访问控制安全策略的机制,包括强制访问控制 (MAC)。容器支持在启用了 SELinux 的主机上运行
如果您希望在 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
默认情况下,容器与标签上运行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
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 驱动程序和一些入口控制器。要检查的一些常见事项是访问特权端口或访问主机上的文件
发表评论 取消回复