如何使用SELinux在Kubernetes中挂载HostPath Volume

时间:2018-06-23 11:38:39

标签: docker kubernetes rhel selinux

我正在尝试将hostPath volume装入Kubernetes Pod。下面显示了hostPath卷规格的示例,该示例取自文档。我正在部署到运行启用了SELinux的RHEL 7的主机。

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # directory location on host
      path: /data
      # this field is optional
      type: Directory

当我的Pod尝试读取从基础主机装载的文件时,出现“权限被拒绝”错误。当我运行setenforce 0关闭SELinux时,错误消失了,我可以访问文件了。当我将目录绑定到Docker容器中时,会遇到相同的错误。

here中描述了该问题,在使用Docker时,可以使用Docker文档here中所述的zZ绑定安装标志来解决。

虽然我可以通过运行来解决问题

chcon -Rt svirt_sandbox_file_t /path/to/my/host/dir/to/mount

我将其视为讨厌的黑客,因为我需要在Kubernetes集群中的每台主机上执行此操作,并且还因为YAML规范中描述的我对Kubernetes的部署并不能完整描述完成以使我的YAML正常运行。无法关闭SELinux。

我可以看到Kubernetes在文档here中提到了SELinux安全上下文,但是在没有出现权限拒绝错误的情况下,我无法成功地将hostPath卷挂载到pod中。

YAML要使容器成功地从运行SELinux的基础主机上装载HostPath卷,需要什么样的外观?

更新

我正在访问的文件是具有以下标签的CA证书:

system_u:object_r:cert_t:s0

当我使用以下选项时:

securityContext:
  seLinuxOptions:
    level: "s0:c123,c456"

,然后通过ausearch -m avc -ts recent检查访问控制审核错误,我可以看到容器的级别标签为s0:c123,c456时存在权限拒绝错误,因此我可以看到该级别标签作品。我将标签设置为s0

但是,如果我尝试将type标签更改为cert_t,则容器甚至无法启动,就会出现错误:

container_linux.go:247: starting container process caused "process_linux.go:364: container init caused \"write /proc/self/task/1/attr/exec: invalid argument\""

我似乎无法更改容器的类型标签。

4 个答案:

答案 0 :(得分:0)

您可以尝试使用完整权限:

 ...
 image: k8s.gcr.io/test-webserver
 securityContext:
   privileged: true
 ...

答案 1 :(得分:0)

您可以使用seLinuxOptions分配SELinux标签:

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
    securityContext:
      seLinuxOptions:
        level: "s0:c123,c456"
  volumes:
  - name: test-volume
    hostPath:
      # directory location on host
      path: /data
      # this field is optional
      type: Directory

根据documentation

  • seLinuxOptions :支持SELinux标签的卷已重新标记为可以通过seLinuxOptions下指定的标签进行访问。通常,您只需要设置级别部分。这将为Pod中的所有容器和卷设置多类别安全性(MCS)标签

答案 2 :(得分:0)

我正面临类似的问题,唯一可行的解​​决方法是在“ securityContext”中添加“ privileged:true”。

如果您已找到解决方案,请告诉我。

答案 3 :(得分:0)

the answer from VAS上展开,因为它部分正确:

仅当重新标记hostPath卷所指向的路径目标时,才可以指定SELinux标签的级别部分。这是通过seLinuxOptions.level中指定的securityContext属性自动完成的。

但是,诸如seLinuxOptions.type之类的属性当前对卷重新标记没有影响。在撰写本文时,这仍然是open issue within Kubernetes