我正在浏览用于Linux的ping形式iputils软件包的代码。
我注意到,ping uses raw socketsSOCK_RAW
,其中任何用户空间应用程序需要使用root权限。
如何在Linux发行版上实现非root用户的ping?
Linux发行版如何管理为非root用户提供ping命令?
我正在浏览用于Linux的ping形式iputils软件包的代码。
我注意到,ping uses raw socketsSOCK_RAW
,其中任何用户空间应用程序需要使用root权限。
如何在Linux发行版上实现非root用户的ping?
Linux发行版如何管理为非root用户提供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的测试:
[email protected]:~$ ls -l /bin/ping
-rwxr-xr-x 1 root root 57048 Mar 1 15:49 /bin/ping
[email protected]:~$ filecap /bin/ping
file capabilities
/bin/ping net_raw
...这是比SUID更好,安全明智的:只有一个能力在这里,而不是完整的根集(37种能力,我的4.5内核) 。
编辑:几件事情。
第一:而不是filecap
,你可能想要使用getcap
。
后者随附了“常规”lipcap
及其CLI工具,无论发行版如何,您都可以在系统上确信它们。与前者相反,这与libcap-ng
自带。
第二:关于Ubuntu。事实上,现在我在办公室,在我的Debian测试主机上安装了几个Ubuntu LTS VM(14.04和16.04)guest,我可以看到Canonical确实使用了SUID位而不是扩展文件属性。他们似乎依赖于AppArmor MAC,我想说我们在这里有一个很好的例子,为什么这可能不是最好的想法,作为第一个措施:行政文书工作负载很高。
其结果是,尽管规范的确有发言权tcpdump
一些AppArmor的设置,也不用为ping
(这是免费的,而不是SUID =全根电源),也没有例如用于dumpcap
(进程中运行数据包捕获的wireshark
),这将意味着sudo
,这也是完全的根权力(但至少有一个密码)。希望上游的开发者能够正确地做到这一点:在源代码级别上,iputils可以提供性能下降,例如ping
或dumpcap
,所以它取决于集成商(distro软件包维护者)。