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_tcontainer_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 驱动程序和一些入口控制器。要检查的一些常见事项是访问特权端口或访问主机上的文件

点赞(3)

评论列表 共有 0 评论

暂无评论

微信服务号

微信客服

淘宝店铺

support@elephdev.com

发表
评论
Go
顶部