允许容器的非根用户执行需要功能的二进制文件
Allow non-root user of container to execute binaries that need capabilities
默认情况下,我需要 运行 一个容器作为非 root 用户。
但是,此容器内的特定进程需要执行需要 cap_net_admin 功能(例如:ip 命令)的二进制文件。
我尝试运行使用“--privileged”标志设置容器,将文件功能cap_net_admin分配给'ip'二进制文件,并将组更改为用户组。
这没有用。使其正常工作的正确方法是什么?
# cat Dockerfile
FROM ubuntu:21.04
RUN apt-get update
RUN apt-get install -f -y iproute2
RUN chgrp nogroup /bin/ip
RUN chmod g+x /bin/ip
RUN setcap 'cap_net_admin+epi' /bin/ip
USER nobody
# docker build .
Successfully built be565bc8f52d
# docker run --rm --user nobody --privileged -it be565bc8f52d /bin/bash
nobody@9834cfaa833f:/$ getcap /bin/ip
/bin/ip cap_net_admin=eip
nobody@9834cfaa833f:/$ ls -lhrt /bin/ip
-rwxr-xr-x 1 root nogroup 626K Mar 17 2021 /bin/ip
nobody@9834cfaa833f:/$ groups nobody
nobody : nogroup
nobody@9834cfaa833f:/$ cat proc/self/status | grep Cap
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
nobody@9834cfaa833f:/$ ip link add dummy0 type dummy
RTNETLINK answers: Operation not permitted
注意:对于较旧的 docker 版本,这是与 setcap 和特权标志一起使用的。
可能由于修复此 CVE.
而停止工作
# docker --version
Docker version 20.10.14, build a224086
详细说明我对问题的评论,我认为这是 ip
代码试图抑制环境功能的问题,但在一个特定的命令行情况下除外。
我已在此错误报告中提出修复建议:https://github.com/shemminger/iproute2/issues/62 (which appears to have been deleted, since this was not how iproute2 wants to receive bug reports). I was directed to try again with this email thread,以便我们了解该报告的结果。
我确实开发了一个您可能想尝试的部分解决方法:
$ sudo setcap cap_net_admin=ie ./ip
$ sudo capsh --inh=cap_net_admin --user=`whoami` --
$ ./ip ...
这通过使用可继承的文件功能而不是您所依赖的允许的文件功能来实现。 ip
代码似乎更喜欢可继承的功能而不是允许的功能。
默认情况下,我需要 运行 一个容器作为非 root 用户。 但是,此容器内的特定进程需要执行需要 cap_net_admin 功能(例如:ip 命令)的二进制文件。
我尝试运行使用“--privileged”标志设置容器,将文件功能cap_net_admin分配给'ip'二进制文件,并将组更改为用户组。 这没有用。使其正常工作的正确方法是什么?
# cat Dockerfile
FROM ubuntu:21.04
RUN apt-get update
RUN apt-get install -f -y iproute2
RUN chgrp nogroup /bin/ip
RUN chmod g+x /bin/ip
RUN setcap 'cap_net_admin+epi' /bin/ip
USER nobody
# docker build .
Successfully built be565bc8f52d
# docker run --rm --user nobody --privileged -it be565bc8f52d /bin/bash
nobody@9834cfaa833f:/$ getcap /bin/ip
/bin/ip cap_net_admin=eip
nobody@9834cfaa833f:/$ ls -lhrt /bin/ip
-rwxr-xr-x 1 root nogroup 626K Mar 17 2021 /bin/ip
nobody@9834cfaa833f:/$ groups nobody
nobody : nogroup
nobody@9834cfaa833f:/$ cat proc/self/status | grep Cap
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
nobody@9834cfaa833f:/$ ip link add dummy0 type dummy
RTNETLINK answers: Operation not permitted
注意:对于较旧的 docker 版本,这是与 setcap 和特权标志一起使用的。 可能由于修复此 CVE.
而停止工作# docker --version
Docker version 20.10.14, build a224086
详细说明我对问题的评论,我认为这是 ip
代码试图抑制环境功能的问题,但在一个特定的命令行情况下除外。
我已在此错误报告中提出修复建议:https://github.com/shemminger/iproute2/issues/62 (which appears to have been deleted, since this was not how iproute2 wants to receive bug reports). I was directed to try again with this email thread,以便我们了解该报告的结果。
我确实开发了一个您可能想尝试的部分解决方法:
$ sudo setcap cap_net_admin=ie ./ip
$ sudo capsh --inh=cap_net_admin --user=`whoami` --
$ ./ip ...
这通过使用可继承的文件功能而不是您所依赖的允许的文件功能来实现。 ip
代码似乎更喜欢可继承的功能而不是允许的功能。