Docker在ubuntu上使用SELinux运行约束冲突

Docker在ubuntu上使用SELinux运行约束冲突,ubuntu,docker,lxc,selinux,Ubuntu,Docker,Lxc,Selinux,在Ubuntu 14.04上,我使用SELinux运行Docker,正如我所知,Docker将读取$SELinux Root Dir/default/contexts/lxc_contexts。但是我找不到这个文件,所以我创建了这个文件并放置了一些内容。如下: process = "system_u:system_r:svirt_lxc_net_t:s0" content = "system_u:object_r:virt_var_lib_t:s0" file = "system_u:objec

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

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的许可模式运行Docker,
docker-dD--selinux enabled=false
docker run-it--rmubuntu/bin/bash

最后我想使用audit2allow生成一个*.te和*.pp文件, 我执行
cat/var/log/audit/audit.log | audit2allow-M容器
,但它说

编译失败:
container.te:41:第41行的标记“mlsconstrain”处出现错误“syntax ERROR”:
#约束规则:
mlsconstrain chr_文件{create relabelto}((h1-domh2-Fail-)和(l2-eq-h2));拒绝约束
/usr/bin/checkmodule:解析配置时遇到错误
/usr/bin/checkmodule:从container.te加载策略配置

我对容器进行了分类。te,其内容物为:

#!!!! 此avc违反了约束。您需要修改源或目标类型的属性以允许此访问。
#约束规则:
mlsconstrain chr_文件{create relabelto}((h1-domh2-Fail-)和(l2-eq-h2));拒绝约束
mlsconstrain chr_文件{relabelfrom}((h1-domh2-Fail-);拒绝约束
....
#可能的原因是源电平(s0)和目标电平(s0:c96、c879)不同。
我猜docker使用s0运行,但是它想将docker的rootfs文件系统重新标记为(s0:c96,c879),并且发生了这个错误

因此,我的问题是:


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

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

但我注意到了一些事情:

  • Docker守护程序必须在
    --selinux enabled=true
    下运行才能支持selinux
  • 要创建新的selinux策略模块,您需要以下所有文件:.te、.fc和.if。有关最小SELinux策略的示例,请参见
  • 通过使用
    cat/var/log/audit/audit.log | audit2allow-M容器
    可以处理所有记录的LINE。最好只将需要的行复制到新文件中
  • s0
    是级别而不是标签。而“重新标记”意味着更改类型。看
  • 在运行时,SELinux(不是docker本身)将重新标记docker守护程序类型(docker_t)和正在运行的容器(svirt_lxc_net_t)
  • Docker将默认情况下的文件类别(即s0:c96、c879)更改为将正在运行的容器彼此分开
默认情况下,Ubuntu是与AppArmor一起预装的,如果您想使用SELinux,您必须先删除/禁用它。Ubuntu和Debian没有为SELinux提供Docker策略

可能的解决办法:

  • 在Ubuntu中使用AppArmor(但我不知道是否有现成的Docker配置文件)
  • 在Ubuntu上为SELinux构建自己的Docker策略。请参阅策略,但有很多依赖项,即
    svirt\u lxc\u net\u t
    来自
  • 使用Fedora,它将与SELinux和Docker一起开箱即用,包括提到的文件
    lxc\u contexts