我的 docker 安装有问题。出于某些安全原因,我配置了“daemon.json”,将命名空间切换到另一个用户(userns-remap
)。现在我遇到的问题是,如果我运行一个容器(具有切换的用户上下文(USER containeruser
)并尝试 ping 同一容器网络中的另一个容器,我会收到以下错误:
$ ping 172.16.0.3
PING 172.16.0.3 (172.16.0.3): 56 data bytes
ping: permission denied (are you root?)
我已经尝试了 AppArmor 的几种方法,分配更多功能等等。但都无法解决这个问题。
运行的图像是未经任何修改的 Alpine Linux。
你能解决我的问题吗?
答案1
总结
apk add iputils
解释
Alpine 基于忙碌箱它在一个二进制文件中实现了 Linux 常用命令。如果你查看/bin
基础 Alpine 映像上的目录,你会看到该ping
命令(与其他命令一样)是指向/bin/busybox
要以普通用户身份运行,ping
需要自杀位设置。您可能想在符号链接上设置 suid 位(即chmod u+s /bin/ping
)。但这实际上会将其设置在 busybox 二进制文件上,因此也会将其设置在注册为符号链接的所有其他命令上,这会造成安全漏洞。
幸运的是,alpine 中有一个iputils
包含替代版本的软件包ping
。如果你安装它,它将用一个普通的二进制文件替换符号链接,该二进制文件具有每个人都可以执行的必要权限。只需在 Dockerfile 中的一行中添加上述必要命令即可RUN
。
答案2
虽然它没有回答 OP 的问题,但对于寻找标题错误的人来说可能会有帮助。
您可以运行以下命令以作为docker容器的root用户进入shell。
docker exec -u 0 -it <container-name> <shell>
根据图像中存在的壳,shell
可以是、、、等中的任意一个zsh
。您bash
可以通过反复试验的方法找到。sh
ash
如果您没有 dockerfile 来修改它(例如,直接从注册表获取 docker 映像时),这将特别有用。