无法 ping(权限被拒绝)

Phi*_*hil 2 docker

我的 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?)
Run Code Online (Sandbox Code Playgroud)

我已经用 AppArmor 尝试了一些东西,分配更多的功能等等。但没有任何帮助来解决这个问题。

运行镜像是一个没有任何修改的 alpine linux。

你有解决我的问题的方法吗?

Zei*_*tor 7

TLDR;

apk add iputils
Run Code Online (Sandbox Code Playgroud)

解释

Alpine 基于busybox,它在单个二进制文件中实现了 linux 常用命令。如果您查看/bin基本 alpine 映像上的目录,您将看到该ping命令(与其他命令一样)是指向/bin/busybox

要以普通用户身份运行,ping需要设置suid 位。您可能会想在符号链接(即chmod u+s /bin/ping)上设置 suid 位。但这实际上会将它设置在 busybox 二进制文件上,因此在所有其他注册为符号链接的命令上,这将是安全漏洞。

幸运的是,iputilsalpine 中有一个包含替代版本的ping. 如果您安装它,它将用一个普通的二进制文件替换符号链接,该二进制文件持有每个人都可以执行的必要权限。只需在 Dockerfile 中添加必要的命令。

  • OP 在问题中提到了用户命名空间。我只是澄清用户命名空间不会影响这一点,因为容器仍然会从 Docker 获取 CAP_NET_RAW。使用用户命名空间,尽管用户在容器中是“root”,但他们实际上在主机上并不是“uid 0”,因此实际上,在容器中以 root 身份运行并不比以非用户身份运行有更多风险。此时 root 用户。 (2认同)

Kri*_*hna 6

虽然它没有回答OP问题,但对于搜索标题中的错误的人来说可能会有所帮助。

您可以运行以下命令以 docker 容器的 root 用户身份进入 shell。

docker exec -u 0 -it <container-name> <shell>

根据镜像中存在的 shell,shell可以是zshbashshash等中的任何一个。您可以通过试错法找到。

如果您没有 dockerfile 来修改它(例如,直接从注册表获取 docker 映像时),这尤其有用。

  • `-u root` 完全没问题。请注意,这也可以是“docker run”的一个选项。为了记录,在未修改的 alpine 映像上执行上述命令(如 OP 所要求)将给出错误“启动容器进程导致:exec:“bash”:在 $PATH 中找不到可执行文件:未知”,因为未安装 bash默认情况下。 (2认同)