如何在Linux发行版上实现针对非root用户的ping?

Ris*_*sta 3 sockets ubuntu network-programming ping

我正在浏览Linux for ping form iputils package的代码.

我注意到ping使用原始套接字 SOCK_RAW,任何用户空间应用程序都需要root权限才能使用.

Linux发行版的开发人员如何管理为非root用户提供ping命令?

jbm*_*jbm 8

在现代发行版中,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
Run Code Online (Sandbox Code Playgroud)

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

编辑:一些事情.

首先:filecap您可能想要使用而不是getcap.

后者附带"常规" lipcap及其CLI工具,无论发行版如何,您都可以确保在您的系统上使用它们.与前者相对,后者随之而来libcap-ng.

第二:关于Ubuntu.

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

因此,虽然Canonical确实有一些AppArmor设置tcpdump,但它们不适用ping(而不是SUID =免费的完全根功率),也不是例如dumpcap(运行数据包捕获的过程wireshark),这将暗示sudo,再次是完全的根权力(至少有一个密码).但愿上游开发者做正确的事情:能力投放为可在双方对于喜欢的iputils源代码级pingdumpcap,所以它的最高积分(发行版的软件包维护者).

  • 并且上限可以设置为:`sudo setcap cap_net_raw,cap_net_admin,cap_dac_override+eip /bin/ping`,另请参阅:https://unix.stackexchange.com/questions/389879/how-to-set-capability-with- setcap 命令 (2认同)

Chr*_*odd 6

可执行文件ping是 setuid root:

$ ls -l /bin/ping
-rwsr-xr-x 1 root root 35712 Nov  8  2011 /bin/ping
Run Code Online (Sandbox Code Playgroud)