我听说它应该是一个安全特性,但它通常看起来像一个安全问题。如果我想编写一个使用特权端口的服务器,我不仅要担心代码的安全性,还要特别担心是否正确使用了 setuid和删除特权。
setuid
没错。但这也意味着与您交谈的任何人都知道,您必须拥有 root 权限才能运行该服务器。当您在端口22上登录到服务器时(比如说) ,您知道您正在与一个由 root 运行的进程进行通话(安全问题除外) ,因此您可以将该系统的密码或其他您可能不信任的信息托付给该系统上有用户帐户的任何人。
参考资料: http://www.w3.org/Daemon/User/Installation/PrivilegedPorts.html。
编辑以详细阐述其理由: 许多最重要的网络服务—— telnet (是的,它仍然被使用——令人惊讶地经常使用)、 SSH、许多 HTTP 服务、 FTP 等等——都涉及通过网络发送密码等重要数据。在一个安全的设置中,某种加密,无论是协议(SSH)中固有的还是包装在协议周围的(stunnel,IPSec) ,都可以保护数据不被窃听,但是所有这些保护都在服务器端结束。
为了正确地保护您的数据,您需要确保您正在与“真正的”服务器通话。今天,安全证书是在网络(和其他地方)上实现这一点的最重要的方式: 你假设只有“真正的”服务器才能访问证书,所以如果你验证你正在交谈的服务器有这个证书,你就会信任它。
特权端口的工作方式非常类似: 只有 root 才能访问特权端口,所以如果您正在与特权端口通信,那么您就知道您正在与 root 通信。这在现代网络上没有多大用处: 重要的是服务器的 身份,而不是它的 IP。在其他类型的网络中,情况并非如此: 例如,在学术网络中,服务器通常由安全房间中的可信任员工进行物理控制,但学生和员工作为用户可以相当自由地访问。在这种情况下,假设您总是可以信任 root 用户是安全的,这样您就可以安全地登录并将私有数据发送到特权端口。如果普通用户可以监听所有端口,那么您就需要一个完整的额外层来验证某个特定程序是否可信任某些数据。
您没有说明您使用的是什么平台,但是在 Linux 上,您至少可以使用功能(特别是 CAP _ NET _ BIND _ SERVICE)来允许非根进程侦听小于1024的端口。比如说 有没有一种方法可以让非根进程绑定到 Linux 上的“特权”端口?
另一种方法是设置 iptables 规则,将特权端口的通信转发到非特权端口(我在生产中使用过这种方法,它相当简单,而且工作得很好)。在上面的链接中也有描述。