Docker使用SELinux运行ubuntu约束违规

时间:2015-05-28 07:48:56

标签: ubuntu docker lxc selinux

在Ubuntu 14.04上,我使用SELinux运行Docker,正如我所知,Docker将读取$ Selinux-Root-Dir / default / contexts / lxc_contexts。但是我找不到这个文件,所以我创建了这个文件并放了一些contents.following:

process = "system_u:system_r:svirt_lxc_net_t:s0"
content = "system_u:object_r:virt_var_lib_t:s0"
file = "system_u:object_r:svirt_lxc_file_t:s0"
sandbox_kvm_process = "system_u:system_r:svirt_qemu_net_t:s0"
sandbox_lxc_process = "system_u:system_r:svirt_lxc_net_t:s0"

然后我用Selinux的Permissive模式运行Docker, docker -dD --selinux-enabled=falsedocker run -it --rm ubuntu /bin/bash

最后我想使用audit2allow生成* .te和* .pp文件, 我执行cat /var/log/audit/audit.log | audit2allow -M container,但它说 compilation failed: container.te:41:ERROR 'syntax error' at token 'mlsconstrain' on line 41: #Constraint rule: mlsconstrain chr_file { create relabelto } ((h1 dom h2 -Fail-) and (l2 eq h2) ); Constraint DENIED /usr/bin/checkmodule: error(s) encountered while parsing configuration /usr/bin/checkmodule: loading policy configuration from container.te

我cat容器.te,其内容是: #!!!! This avc is a constraint violation. You would need to modify the attributes of either the source or target types to allow this access. #Constraint rule: mlsconstrain chr_file { create relabelto } ((h1 dom h2 -Fail-) and (l2 eq h2) ); Constraint DENIED mlsconstrain chr_file { relabelfrom } ((h1 dom h2 -Fail-) ); Constraint DENIED .... # Possible cause is the source level (s0) and target level (s0:c96,c879) are different. 我想这个docker运行的是s0,但它想将docker的rootfs文件系统重新标记为(s0:c96,c879)并发生此错误。

所以我的问题:

容器的类型是否有错误?如何关闭此约束或如何解决此问题?

1 个答案:

答案 0 :(得分:1)

我不知道你的container.te文件的第41行。通常'语法错误'表示缺少selinux类型或未知的selinux接口,这意味着问题出在不同的地方。

但是我注意到了一些事情:

  • Docker守护程序必须与--selinux-enabled=true一起运行以支持SELinux
  • 要创建新的selinux策略模块,您需要以下所有文件:.te,.fc和.if。有关最小SELinux策略的示例,请参阅Debian how-to
  • 通过使用cat /var/log/audit/audit.log | audit2allow -M container,您可以处理所有已记录的内容。最好只将所需的行复制到新文件中。
  • s0是级别而不是标签。虽然“重新贴牌”'意味着改变类型。见labeling files
  • 在运行时,SELinux(不是docker本身)将重新标记docker守护程序类型(docker_t)和正在运行的容器(svirt_lxc_net_t)。
  • Docker默认更改文件类别(即s0:c96,c879)以将正在运行的容器彼此分开。

默认情况下,Ubuntu预装了AppArmor,如果你想使用SELinux,你首先删除/禁用它。 Ubuntu和Debian不为SELinux提供Docker策略。

可能的解决方案:

  • 将AppArmor与Ubuntu一起使用(但我不知道是否有可立即使用的Docker配置文件)。
  • 在Ubuntu上为SELinux构建自己的Docker策略。请参阅Fedora-Cloud Docker SELinux政策,但有很多依赖关系,即svirt_lxc_net_t来自virt.te
  • 使用Fedora,它可以与SELinux和Docker一起使用,包括提到的文件lxc_contexts