70

我听说它是​​一个安全功能,但它通常看起来像是一个安全问题。如果我想编写一个使用特权端口的服务器,我不仅要担心我的代码有多安全,我还要特别担心我是否使用了setuid正确的权限和删除权限。

4

2 回答 2

74

真的。但这也意味着任何与您交谈的人都知道您必须拥有 root 权限才能运行该服务器。当您在端口 22(例如)上登录服务器时,您知道您正在与由 root 运行的进程通信(安全问题除外),因此您使用该系统的密码或您可能使用的其他信息来信任它不要信任在该系统上拥有用户帐户的任何人。

参考:http ://www.w3.org/Daemon/User/Installation/PrivilegedPorts.html 。

编辑以详细说明原因:许多最重要的网络服务 - telnet(是的,它仍在使用 - 令人惊讶地经常使用)、SSH、许多 HTTP 服务、FTP 等 - 涉及通过网络发送密码等重要数据。在安全设置中,某种类型的加密,无论是协议固有的 (SSH) 还是围绕协议 (stunnel、IPSec) 的加密,都可以保护数据不被在线窥探,但所有这些保护都在服务器端结束。

为了正确保护您的数据,您需要确保您正在与“真实”服务器通信。今天,安全证书是在网络(和其他地方)上执行此操作的最重要方式:您假设只有“真实”服务器才能访问证书,因此如果您验证您正在与之交谈的服务器具有该证书,您会相信它。

特权端口以非常相似的方式工作:只有 root 可以访问特权端口,所以如果您正在与特权端口通信,您就知道您正在与 root 通信。这在现代网络上不是很有用:重要的是服务器的身份,而不是它的 IP。在其他类型的网络中,情况并非如此:例如,在学术网络中,服务器通常由安全房间中受信任的工作人员物理控制,但学生和工作人员作为用户可以自由访问。在这种情况下,通常可以安全地假设您始终可以信任 root,因此您可以安全地登录并将私有数据发送到特权端口。如果普通用户可以监听所有端口,则您需要一个额外的层来验证特定程序是否受某些数据的信任。

于 2012-04-16T22:52:43.457 回答
12

您没有说您使用的是什么平台,但至少在 Linux 上您可以使用功能(特别是 CAP_NET_BIND_SERVICE)来允许非 root 进程在小于 1024 的端口上侦听。例如,请参阅Is there a way for非root进程绑定到Linux上的“特权”端口?

另一种选择是设置 iptables 规则以将流量从特权端口转发到非特权端口(我在生产中使用过它,它相当简单并且效果很好)。它也在上面的链接中描述。

于 2012-04-17T07:36:44.640 回答