我听说这是一种安全功能,但它常常似乎成为了一个安全问题。如果我想编写一个使用特权端口的服务器,我不仅要担心我的代码是否安全,还必须特别担心我是否正确地使用了setuid
并且放弃了权限。
没错,但也意味着与你交谈的任何人都知道你必须拥有root权限才能运行该服务器。当你通过端口22(例如)登录到服务器时,你知道你正在与一个由root运行的进程交谈(除了安全问题),所以你会信任它来保护系统密码或其他可能不会信任任何系统用户账户的信息。
参考资料:http://www.w3.org/Daemon/User/Installation/PrivilegedPorts.html。
编辑以详细说明原因:许多最重要的网络服务 - telnet(是的,它仍然经常被使用)、SSH、许多HTTP服务、FTP等等 - 都涉及在网络上传输重要数据(如密码)。在安全设置中,某种类型的加密技术,无论是协议本身包含的(SSH),还是封装在其中的(stunnel、IPSec),都可以保护这些数据免受在线窃听,但所有这些保护措施都在服务器端停止。
www-data
)的身份运行,正如你提到的那样,这是出于安全原因。因此,在特权端口上运行的服务必须由 root 授权,但通常不会以 root 特权身份运行。 - Dreamernginx主进程、smbd、sshd、cupsd、cups-browsed、nmbd、dhclient
。这些进程会降低权限:lighttpd、dnsmasq、exim4、mongod、mysqld、avahi-daemon、dictd ntpd
。所以你们两个都错了,我是说对的。 - joeytwiddle您没有说明使用的平台,但至少在Linux上,您可以使用capabilities(特别是CAP_NET_BIND_SERVICE)允许非root进程监听低于1024的端口。例如,请参见如何在Linux上让非root进程绑定到“特权”端口?
另一种选择是设置iptables规则,将特权端口的流量转发到非特权端口(我在生产环境中使用过这种方法,它相当简单并且效果很好)。它也在上述链接中有所描述。
setuid
。例如,我们可以只说“我的进程将假定在启动时,文件描述符3是您要我侦听的相关套接字”,然后我们可以有一个单一的简单标准的经过验证的程序来降低权限,然后执行命令,然后另一个简单标准的经过验证的程序只需侦听套接字并将该套接字放在给定的文件描述符上。 - mtraceur