如何在 Linux 发行版上对非 root 用户执行 ping 操作?

How is ping for non-root user implemented on Linux distros?

我正在浏览 Linux 的 ping 形式 iputils 包的代码。

我注意到 ping uses raw sockets SOCK_RAW,任何用户空间应用程序都需要 root 权限才能使用。

Linux 发行版的开发人员如何设法为非根用户提供 ping 命令?

ping 可执行文件是 setuid root:

$ ls -l /bin/ping
-rwsr-xr-x 1 root root 35712 Nov  8  2011 /bin/ping

在现代发行版中,ping 使用扩展文件属性向非特权用户授予 CAP_NET_RAW。

我的 Debian 测试示例:

jbm@sumo:~$ ls -l /bin/ping
-rwxr-xr-x 1 root root 57048 Mar  1 15:49 /bin/ping
jbm@sumo:~$ filecap /bin/ping
file                 capabilities
/bin/ping     net_raw

...这比 SUID 更好,安全方面:这里只有一个功能,而不是完整的根集(我的 4.5 内核有 37 个功能)。

编辑:几件事。

首先:您可能想使用 getcap.

而不是 filecap

后者随 "regular" lipcap 及其 CLI 工具一起提供,无论发行版如何,您都可以肯定在系统上拥有这些工具。与前者相反,前者带有 libcap-ng.

第二:关于Ubuntu.

确实,现在我在办公室,在我的 Debian 测试主机上有几个 Ubuntu LTS VM(14.04 和 16.04)来宾,我可以看到 Canonical 确实使用 SUID 位 而不是扩展文件属性。他们似乎依赖 AppArmor MAC,我想说我们这里有一个很好的例子,说明为什么这可能不是 第一个 措施的最佳想法:行政文书工作正确处理的负担很高。

因此,虽然 Canonical 确实为 tcpdump 设置了一些 AppArmor,但它们没有为 ping(而是 SUID = full root power for free)设置,例如dumpcap(过程 运行 捕获 wireshark 的数据包),这将意味着 sudo,这又是完整的 root 权限(但至少有密码)。希望上游开发人员做正确的事:在源代码级别可以删除功能,无论是对于 ping 还是 dumpcap 这样的 iputils,所以这取决于集成商(发行包维护者)。