docker daemon选项--selinux-enabled有什么作用

时间:2018-08-27 06:24:27

标签: docker selinux

我猜它会标记它开始的容器,但是从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策略以允许在容器文件系统内部进行访问?

1 个答案:

答案 0 :(得分:2)

简短回答

  • --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_tsvirt_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中的大多数内容。

因此,您可以选择以下任一方式:

  1. 使用system_u:object_r:svirt_sandbox_file_t在主机系统上手动重新标记文件。通常不建议将其用于系统文件和目录,因为它可能会对主机产生意外影响。

  2. 以无限制类型运行容器。仅在仍继续在主机上强制使用selinux的情况下,这将禁用此容器的隔离:

    docker run -it --security-opt label:disable alpine sh