Ris*_*sta 3 sockets ubuntu network-programming ping
我正在浏览Linux for ping form iputils package的代码.
我注意到ping使用原始套接字 SOCK_RAW,任何用户空间应用程序都需要root权限才能使用.
Linux发行版的开发人员如何管理为非root用户提供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
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源代码级ping或dumpcap,所以它的最高积分(发行版的软件包维护者).
可执行文件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)