我想它会标记它开始的容器,但是从ps -eZ
的输出中,我看不出任何区别。例如,容器etcd
具有相同的域,无论守护程序是否带有此选项:
system_u:system_r:container_runtime_t:s0 16212 ? 00:00:00 dnsmasq-nanny
但它确实阻止我的容器(k8s-dns-dnsmasq-nanny-amd64:1.14.8)启动,拒绝日志显示访问/etc/localtime
和/ usr / sbin / dnsmasq被拒绝。我认为这些是容器文件系统中的文件。如何编写SELinux策略以允许访问容器文件系统?
--selinux-enabled
将启用selinux策略,该策略允许使用svirt_lxc_net_t
标记的容器进程读取和写入带有svirt_sandbox_file_t
标签的文件。docker inspect -f '{{ .ProcessLabel }}' <container name>
和docker inspect -f '{{ .MountLabel }}' <container name>
检查容器来检查容器标签--selinux-enabled
选项启用docker selinux安全策略,详细描述了here。启用后,此策略将:
svirt_sandbox_file_t
和svirt_lxc_net_t
标签标记容器。这可以通过运行容器并检查应用于它的标签来确认:
docker inspect <container id> | grep "Label"
"MountLabel": "system_u:object_r:svirt_sandbox_file_t:s0:c557,c611",
"ProcessLabel": "system_u:system_r:svirt_lxc_net_t:s0:c557,c611",
svirt_sandbox_file_t
是一个MountLabel,它限制访问主机文件系统上的文件。 docker selinux docs说:
如果文件标记为svirt_sandbox_file_t,则默认情况下所有容器都可以读取它。但是如果容器写入具有svirt_sandbox_file_t所有权的目录,则他们使用自己的类别进行编写
上例中的类别是c557,c611
。
svirt_lxc_net_t
用于保护进程。根据redhat解决方案here,它用于:
...将容器进程与主机隔离,并生成一个唯一的多类别安全标签,以允许SELinux阻止一个容器进程攻击其他容器进程和内容。您的访问问题很可能发生,因为主机文件系统上的selinux标签阻止了从容器内访问。例如,selinux docs说:
默认情况下,docker可以访问/ usr中的所有内容以及/ etc中的大多数内容。
所以你的选择是:
system_u:object_r:svirt_sandbox_file_t
手动重新标记主机系统上的文件。通常不建议将其用于系统文件和目录,因为它可能会对主机产生意外影响。docker run -it --security-opt label:disable alpine sh