如何知道Docker容器是否以特权模式运行

37

希望能够通过bash脚本了解当前正在运行的容器是否从容器内部--privileged模式启动(而不是从主机上启动)。

目前我只能通过传递带有标志的环境变量来解决问题,但这并不是理想的解决方案。

2个回答

70

从Docker主机

使用docker inspect命令:

docker inspect --format='{{.HostConfig.Privileged}}' <container id>

并且在bash脚本中,您可以编写一个测试:

if [[ $(docker inspect --format='{{.HostConfig.Privileged}}' <container id>) == "false" ]]; then
    echo not privileged
else
    echo privileged
fi

从容器内部运行

你需要尝试运行一个需要使用--privileged标志的命令,看看它是否失败。

例如,ip link add dummy0 type dummy是一个需要成功使用--privileged标志的命令:

$ docker run --rm -it ubuntu ip link add dummy0 type dummy
RTNETLINK answers: Operation not permitted

$ docker run --rm -it --privileged ubuntu ip link add dummy0 type dummy

运行良好。

在bash脚本中,你可以做类似于这样的事情:

ip link add dummy0 type dummy >/dev/null
if [[ $? -eq 0 ]]; then
    PRIVILEGED=true
    # clean the dummy0 link
    ip link delete dummy0 >/dev/null
else
    PRIVILEGED=false
fi

我正在尝试使用Ansible的docker_container将容器设置为特权模式并添加权限,但是没有成功,没有错误消息,但最终容器根本没有以特权模式运行。有人知道如何解决这个问题吗? - zevarito
1
docker inspect 的网址已经更改。 - Ioanna
使用crictl?这个不起作用。 - undefined

-6

从容器内部来看,如果你的docker run命令带有-v /var/run/docker.sock:/var/run/docker.sock参数,那么你可以使用docker psdocker inspect或其他任何docker命令。


1
真实但我认为有些过度了。这也会给容器完全访问主机的权限。 - Leo Gallucci
将Docker套接字链接到容器中如何给予主机完全访问权限?有很多人将Docker可执行文件从主机链接。 - Romeo Mihalcea
除非在容器内安装Docker或以奇怪的方式使用API,否则无法使用Docker命令。而且,确实,这将是过度杀伤力的。一个被攻击的容器可能会造成混乱。 - Ricardo Branco
4
访问Docker守护程序允许您在任意配置的容器中运行任意命令。其中一个漏洞是,由于您可以将主机上的任何文件或目录挂载到容器中,因此您可以修改主机上的任何文件。以下是使用Docker获取root访问权限的示例,链接在此:(https://github.com/0cjs/sedoc/blob/master/app/docker.md#leveraging-docker-for-root-access)。(阻止此特定途径仍然会留下许多其他漏洞开放。) - cjs
确实是一种糟糕的安全实践,应该尽量避免使用,除非绝对必要,并且如果可能的话进行隔离(例如在k8s中使用专用节点,具有专用的PSP/用户帐户)。@cjs +1 - tisc0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接