在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=false
和docker 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)并发生此错误。
所以我的问题:
容器的类型是否有错误?如何关闭此约束或如何解决此问题?
答案 0 :(得分:1)
我不知道你的container.te文件的第41行。通常'语法错误'表示缺少selinux类型或未知的selinux接口,这意味着问题出在不同的地方。
但是我注意到了一些事情:
--selinux-enabled=true
一起运行以支持SELinux cat /var/log/audit/audit.log | audit2allow -M container
,您可以处理所有已记录的内容。最好只将所需的行复制到新文件中。s0
是级别而不是标签。虽然“重新贴牌”'意味着改变类型。见labeling files。默认情况下,Ubuntu预装了AppArmor,如果你想使用SELinux,你首先删除/禁用它。 Ubuntu和Debian不为SELinux提供Docker策略。
可能的解决方案:
svirt_lxc_net_t
来自virt.te lxc_contexts
。