如何在 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,所以这取决于集成商(发行包维护者)。
我正在浏览 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,所以这取决于集成商(发行包维护者)。