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