在运行带有卷挂载的 podman 容器时,通常需要将:z
(或:Z
)参数添加到挂载路径。这是由于 SELinux 及其类型强制。该参数的作用是改变挂载文件的类型。我认为这实际上是一个非常危险的操作,如果我们挂载一些需要应用其他 SELinux 类型的文件,它可能会导致一些问题。让我们考虑一个 apache httpd 服务器的例子。据我所知,httpd 只能从标有适当标签(例如httpd_file_t
或其他无关紧要)的目录中提供文件。如果我启动一个 podman 容器并将 httpd 的www
目录挂载到它(使用:z
)会发生什么?上下文将更改为container_file_t
键入,我相信服务器将停止工作(它将无法访问 中的文件www
)。
我的理解正确吗?
你的理解是正确的。来自 Docker 手册(与 podman 基本相同):
这意味着如果您将某个主机目录绑定挂载到 Docker,SELinux 上下文标签将被更改以确保该特定目录只能从该特定容器 (
:Z
) 或所有容器 (:z
) 访问。因为这些操作是在主机文件系统本身上执行的,所以它们会在容器虚拟化范围之外产生影响。您的示例很好:当绑定安装主机 webroot 时,标准
httpd_sys_(rw_)content_t
将被替换。然后主机上的 Apache 将拒绝为该 webroot 提供服务。幸运的是,使用自定义策略模块可以轻松解决这个问题。
使用
:z
or:Z
并启动 Docker/podman。确保它有效。现在将 SELinux 设置为允许使用setenforce 0
. 然后启动 Apache。它会工作(因为 SELinux 是允许的),但 AVC 拒绝将记录在审计日志中。这会在
/etc/selinux/targeted/modules/active/modules
.要安装和激活此模块,请运行:
semodule -i mnj-[policyname].pp
现在重新启用 SELinux
setenforce 1
:。Apache 现在将能够再次为 webroot 提供服务。