有谁知道 docker 中无新权限阻止 selinux 转换的解决方法?
Does anyone know a workaround for no-new-privileges blocking selinux transitions in docker?
我正在尝试 运行 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
(我本来是 运行ning 稳定的,然后切换到 edge 版本希望得到修复)
我想做什么:
docker run --security-opt "no-new-privileges" -it --rm busybox /bin/sh
会发生什么:
standard_init_linux.go:178: exec user process caused "operation not permitted"
支持所有功能 - Selinux 在未指定 no-new-privileges 时工作;当守护进程 运行ning 没有 selinux 支持时,no-new-privileges 有效。宽容与强制模式无效。
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 转换。除了禁用其中一项安全功能之外,有谁知道解决这个问题的方法吗?如果需要更多信息,请告诉我!
想通了;为遇到同样问题的其他人发帖。问题确实是没有新的权限阻止 selinux 转换。通过编译一个小的 selinux 策略,使容器类型明确受容器运行时类型的限制,没有新的权限将允许转换。我使用的是来自 docker-ce 边缘存储库的默认 centos docker-ce-selinux 策略,所以我的容器运行时类型是 container_runtime_t,我的容器类型是 svirt_lxc_net_t .其他 packages/distributions 可能使用不同的类型。
在空目录中创建了一个名为 "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
请注意,理论上可能会有副作用,但容器运行时是一个非常特权的领域,因此不应对容器类型强加太多实际的新界限。对我来说没问题,但是 YMMV。
我正在尝试 运行 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
(我本来是 运行ning 稳定的,然后切换到 edge 版本希望得到修复)
我想做什么:
docker run --security-opt "no-new-privileges" -it --rm busybox /bin/sh
会发生什么:
standard_init_linux.go:178: exec user process caused "operation not permitted"
支持所有功能 - Selinux 在未指定 no-new-privileges 时工作;当守护进程 运行ning 没有 selinux 支持时,no-new-privileges 有效。宽容与强制模式无效。
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 转换。除了禁用其中一项安全功能之外,有谁知道解决这个问题的方法吗?如果需要更多信息,请告诉我!
想通了;为遇到同样问题的其他人发帖。问题确实是没有新的权限阻止 selinux 转换。通过编译一个小的 selinux 策略,使容器类型明确受容器运行时类型的限制,没有新的权限将允许转换。我使用的是来自 docker-ce 边缘存储库的默认 centos docker-ce-selinux 策略,所以我的容器运行时类型是 container_runtime_t,我的容器类型是 svirt_lxc_net_t .其他 packages/distributions 可能使用不同的类型。
在空目录中创建了一个名为 "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
请注意,理论上可能会有副作用,但容器运行时是一个非常特权的领域,因此不应对容器类型强加太多实际的新界限。对我来说没问题,但是 YMMV。