有没有人知道在Docker中阻止selinux转换的无新特权的解决方法?

我试图在docker下运行(任何)容器,使用no-new-privileges标志和Selinux启用。

基本信息:

CentOS 7.3 on bare metal docker-ce 17.05.0-ce (edge) from official repo docker-ce-selinux 17.05.0-ce (edge) from official repo 

(我最初运行稳定,并切换到边缘版本希望修复)

我在做什么:

 docker run --security-opt "no-new-privileges" -it --rm busybox /bin/sh 

怎么了:

 standard_init_linux.go:178: exec user process caused "operation not permitted" 

所有function都支持 – Selinux在没有指定新的权限的情况下工作。 当守护程序在没有selinux支持的情况下运行时,没有新的权限可以使用。 宽容vs强制模式没有效果。

Docker信息:

 Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 40 Server Version: 17.05.0-ce Storage Driver: btrfs Build Version: Btrfs v4.4.1 Library Version: 101 Logging Driver: journald Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 9048e5e50717ea4497b757314bad98ea3763c145 runc version: 9c2d8d184e5da67c95d601382adf14862e4f2228 init version: 949e6fa Security Options: seccomp Profile: default selinux Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 2 Total Memory: 3.536GiB Name: localhost.localdomain ID: EAGL:4QBW:GYM3:XY3U:YOSJ:7NBJ:O5OB:6HWY:S255:2X7D:MFHN:ZOYS Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Username: ----- Registry: https://index.docker.io/v1/ Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false 

“sudo ausearch -m avc -ts recent”结果

 <no matches> 

但是“sudo ausearch -m SELINUX_ERR -ts recent”结果

 time->Tue May 23 02:07:55 2017 type=PROCTITLE msg=audit(1495519675.981:996345): proctitle=2F70726F632F73656C662F65786500696E6974 type=PATH msg=audit(1495519675.981:996345): item=0 name="/bin/sh" inode=260 dev=00:22 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:svirt_sandbox_file_t:s0:c7,c132 nametype=NORMAL type=CWD msg=audit(1495519675.981:996345): cwd="/" type=BPRM_FCAPS msg=audit(1495519675.981:996345): fver=0 fp=0000000000000000 fi=0000000000000000 fe=0 old_pp=00000000a80425fb old_pi=00000000a80425fb old_pe=00000000a80425fb new_pp=00000000a80425fb new_pi=00000000a80425fb new_pe=00000000a80425fb type=SYSCALL msg=audit(1495519675.981:996345): arch=c000003e syscall=59 success=no exit=-1 a0=c420142260 a1=c420142270 a2=c420122960 a3=0 items=1 ppid=30894 pid=30910 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=4294967295 comm="runc:[2:INIT]" exe="/usr/bin/docker-runc" subj=system_u:system_r:container_runtime_t:s0 key=(null) type=SELINUX_ERR msg=audit(1495519675.981:996345): op=security_bounded_transition seresult=denied oldcontext=system_u:system_r:container_runtime_t:s0 newcontext=system_u:system_r:svirt_lxc_net_t:s0:c7,c132 

我认为这里的关键是

 type=SELINUX_ERR msg=audit(1495519675.981:996345): op=security_bounded_transition seresult=denied oldcontext=system_u:system_r:container_runtime_t:s0 newcontext=system_u:system_r:svirt_lxc_net_t:s0:c7,c132 

如果我正确地阅读,没有新的权限阻止selinux转换。 有没有人知道解决这个问题的方法,而不是禁用其中一个安全function? 请让我知道是否需要更多的信息!

弄清楚了; 发布给其他人有相同的问题。 问题确实没有阻止selinux转换的新特权。 通过编译一个小的selinux策略,使容器运行时types显式限制容器types,没有新的权限允许转换。 我使用docker-ce边缘库中默认的centos docker-ce-selinux策略,所以我的容器运行时types是container_runtime_t,而我的容器types是svirt_lxc_net_t。 其他软件包/发行版可能使用不同的types。

在空目录中创build一个名为“dockersvirt.te”的策略文件。

 module dockersvirt 1.0; require { type container_runtime_t; type svirt_lxc_net_t; role system_r; }; typebounds container_runtime_t svirt_lxc_net_t; 

然后编译并安装新的策略。

 checkmodule -M -m -o dockersvirt.mod dockersvirt.te semodule_package -o dockersvirt.pp -m dockersvirt.mod sudo semodule -i dockersvirt.pp 

请注意,理论上可能有副作用,但容器运行时是一个非常特权的域,所以不应该在容器types上施加太多实际的新界限。 对我来说没有问题,但是YMMV。