ping 在 Fedora 上的无根 Ubuntu podman 容器上不起作用

ping 在 Fedora 上的无根 Ubuntu podman 容器上不起作用

在 Fedora 主机上使用 podman 运行无根 Ubuntu 映像时,ping出现“操作不允许”错误。

root@337e8ebdc287:/# ping google.com
bash: /usr/bin/ping: Operation not permitted

在 alpine/fedora 镜像上,ping 可以工作

$ podman run alpine ping -c1 google.com
PING google.com (172.217.169.110): 56 data bytes
64 bytes from 172.217.169.110: seq=0 ttl=42 time=119.706 ms

--- google.com ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 119.706/119.706/119.706 ms

当我用 运行图像时,它也可以在 Ubuntu 上运行--privileged

在主机上,ping_group_range设置为包含所有 uid。

$ sudo sysctl --all | grep ping
net.ipv4.ping_group_range = 0   2147483647

使用带有 Podman 4.2.1 的 Fedora 36。

如何ping在无根 Ubuntu 镜像上工作?

除了回答这个特定问题之外,我还想自己学习如何调试这种权限问题。我是否必须事先知道导致“操作不允许”错误的所有可能性?此错误是由操作系统还是正在运行的程序引发的?如果是由操作系统引发的,它是否也会在某处记录不允许操作的原因?

答案1

您肯定知道,容器利用了某些内核功能。最突出的是内核命名空间和资源组。

要与网络交互,您通常通过系统调用与内核交互。当您尝试执行系统调用时,内核会检查您是否有权执行这些系统调用。此检查会考虑您当前使用哪个用户(调用用户)、哪个用户执行程序(执行用户)以及在执行上下文中授予了哪些功能。

正如你在这个 GitHub 问题中看到的那样(https://github.com/mviereck/dockerfile-x11docker-deepin/issues/19),ping 需要该NET_RAW功能。检查https://security.stackexchange.com/a/128988这是什么意思?你可能还想读https://superuser.com/a/1702188/1737591关于类似的问题。这也有助于解释为什么它在 alpine 上按预期工作,但在 ubuntu 镜像上却不行。

有了--privilegedFlag,您基本上可以将其包含CAP_NET_RAW在许多其他权限中。相反,您应该能够使用该--cap-add=NET_RAW标志执行容器,以将功能限制到最低限度。

我不知道这些错误可能记录在哪里,但我会dmesg先检查系统的系统日志。

编辑:

当使用官方 ubuntu 镜像并在其上安装 ping 时,您还需要setcap cap_net_raw+p /usr/bin/ping 在该容器内运行。否则,容器本身内的权限检查(定义执行上下文)将不允许您执行 ping,因为所需的功能不属于有效功能的一部分。

$ podman run --rm -it ubuntu:22.04
Resolved "ubuntu" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/ubuntu:22.04...
Getting image source signatures
Copying blob cf92e523b49e skipped: already exists  
Copying config 216c552ea5 done  
Writing manifest to image destination
Storing signatures
root@af1a4b5052e9:/# apt-get update && apt-get install -y iputils-ping && apt-get clean autoclean && apt-get -y autoremove
### Skipped apt output ###
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
root@af1a4b5052e9:/# ping -c 3 stackoverflow.com
bash: /usr/bin/ping: Operation not permitted
root@30d9c3c936fc:/# sysctl 'net.ipv4.ping_group_range'             
net.ipv4.ping_group_range = 0   0
root@af1a4b5052e9:/# setcap cap_net_raw+p /usr/bin/ping
root@af1a4b5052e9:/# ping -c 3 stackoverflow.com
PING stackoverflow.com (151.101.193.69) 56(84) bytes of data.
64 bytes from 151.101.193.69 (151.101.193.69): icmp_seq=1 ttl=255 time=8.61 ms
64 bytes from 151.101.193.69 (151.101.193.69): icmp_seq=2 ttl=255 time=8.67 ms
64 bytes from 151.101.193.69 (151.101.193.69): icmp_seq=3 ttl=255 time=8.86 ms

--- stackoverflow.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 8.609/8.713/8.857/0.105 ms
root@af1a4b5052e9:/#

很有可能,您尝试的其他图像已经包含权利,或者在发布图像之前net.ipv4.ping_group_range执行了类似的操作。setcap cap_net_raw+p /usr/bin/ping

请随意使用getcap $(which ping)列出其他图像可能在 ping 上设置的功能。

cap_net_raw+ep意思是:
对于能力net_raw添加(+)有效(e)和允许(p)。

我建议看看https://book.hacktricks.xyz/linux-hardening/privilege-escalation/linux-capabilities如果您渴望了解更多,请参阅有关功能的入门知识。

相关内容