Franck Asked: 2009-07-10 09:07:24 +0800 CST2009-07-10 09:07:24 +0800 CST 2009-07-10 09:07:24 +0800 CST 绑定到端口 < 1024 是否仍然只有 Unix 系统上的 root 权限? 772 在 Unix 系统上,拒绝从没有 root 特权的进程绑定到 tcp 端口 < 1024。 最初的原因是什么,它仍然有效吗? 例如http服务器不需要root权限来服务html页面。 Unix 用户需要什么进程/协议来确保它以 root 特权运行? 谢谢 unix security ip socket 5 个回答 Voted Best Answer nik 2009-07-10T09:17:44+08:002009-07-10T09:17:44+08:00 该端口范围不应该是程序员定义的。 它由 IANA 保留, 众所周知的端口是从 0 到 1023 的端口。 DCCP 众所周知的端口不应该在没有 IANA 注册的情况下使用。注册过程在 [RFC4340] 第 19.9 节中定义。 对于不同的意见检查, 来自linuxquestions 线程(在链接中阅读更多上下文) 端口 1024 限制实际上咬住了自己的尾巴。它强制执行可能会打开安全漏洞的守护程序实践,从而使限制作为安全措施无效。 SANS Top-20漏洞说明 一些核心系统服务通过远程过程调用 (RPC) 为客户端组件提供远程接口。它们主要通过命名管道端点公开,这些端点可通过通用 Internet 文件系统 (CIFS) 协议、众所周知的 TCP/UDP 端口以及在某些情况下临时 TCP/UDP 端口访问。从历史上看,服务中存在许多可以被匿名用户利用的漏洞。当被利用时,这些漏洞为攻击者提供了与服务在主机上相同的权限。 如今,像BitTorrent和Skype这样的协议已经通过临时端口转移到了未保留的空间中,并且不再需要 root 访问。目标不仅仅是绕过这个旧的保留端口安全性;今天的协议甚至想要绕过网络边界(Skype 就是一个很好的例子)。随着网络带宽和可用性的增加,当每个计算机用户都可能自己运行 Web 服务器时,事情会更进一步——并且可能在不知不觉中成为 僵尸网络的一部分。 我们需要这些旧方法所需的安全性, 但现在需要用更新的方法来完成。 Brian Spolarich 2009-07-10T09:26:25+08:002009-07-10T09:26:25+08:00 嗯,我记得在 BSD Unix 时代最初的想法是,小于 1024 的端口应该被保留给“众所周知的服务”,并且仍然假设服务器会相对稀少,拥有 root 权限的人会以某种方式被认为是“信任的”。所以你必须有特权绑定一个套接字来监听一个端口,这个端口代表其他用户可以访问的网络服务。 端口 1024-4999 旨在用作“临时”端口,代表 TCP 连接的客户端。端口 5000+ 用于非根服务器。 显然,所有这些假设很快就消失了。检查 IANA TCP 端口号预留列表,了解事情的进展情况。 这个问题的一个解决方案是 RPC 端口映射器的想法。服务不会为每个服务保留一个 TCP 端口,而是会在一个随机端口上启动并告诉端口映射器守护程序它正在侦听的位置。客户会询问端口映射器“服务 X 在哪里”侦听并从那里继续。我不记得有什么安全机制来保护众所周知的 RPC 服务免受模拟。 我不确定这些天这一切是否有充分的理由,但就像大多数 *nix 世界一样,事情往往会累积而不是完全重新发明。 有人读过 Vernor Vinge 吗?我记得他在他的一部小说中写过关于遥远未来的计算机系统,该系统结合了远古时代的一层又一层的代码,时间仍然用自某个远古日期(1970 年 1 月 1 日)以来的秒数表示准确地说)。他应该不远了。 Adam Brand 2009-07-10T09:18:01+08:002009-07-10T09:18:01+08:00 在过去,普通用户用于登录 Unix 机器。因此,您不希望普通用户设置虚假的 ftp 服务或其他东西。 这些天来,典型的用法是只有管理员和其他几个受信任的人才能登录到服务器,所以如果今天重做模型,< 1024 的限制可能不存在。 benc 2009-08-24T03:59:37+08:002009-08-24T03:59:37+08:00 这是一个历史惯例。 很久以前,系统的数量要少得多。也没有 DNS,FTP 站点要求您提供匿名密码作为您的电子邮件地址,并且没有垃圾邮件。 这本质上是一种默示的“君子协定”。系统管理得很好,如果有人把这件事搞砸了,你知道该和谁说话,或者如果他们脾气暴躁,被踢出网络几乎意味着保持离线。 今天,在一切都使用 TCP/IP 的情况下,这不再提供任何安全性。 MarkR 2009-08-24T04:08:05+08:002009-08-24T04:08:05+08:00 接受系统密码的服务在特权端口上运行是有意义的;这意味着拥有 shell 帐户的用户不能在同一端口上设置“假”服务来获取人们的登录详细信息,或者通过在同一端口上设置非功能性服务来拒绝访问。 如果你有一个多用户机器,并且一个非特权用户能够设置一个流氓 ssh 守护进程,他们可能能够捕获其他用户的密码并访问他们的帐户(当然他们必须这样做,而合法的 ssh 守护进程已关闭,可能是为了维护或在系统启动或关闭期间) 不接受系统密码的东西并不重要,尽管在多用户机器上的用户之间共享诸如 Web 服务器之类的东西存在重大的安全问题(正如共享主机提供商所发现的那样)
该端口范围不应该是程序员定义的。
它由 IANA 保留,
对于不同的意见检查,
来自linuxquestions 线程(在链接中阅读更多上下文)
如今,像BitTorrent和Skype这样的协议已经通过临时端口转移到了未保留的空间中,并且不再需要 root 访问。目标不仅仅是绕过这个旧的保留端口安全性;今天的协议甚至想要绕过网络边界(Skype 就是一个很好的例子)。随着网络带宽和可用性的增加,当每个计算机用户都可能自己运行 Web 服务器时,事情会更进一步——并且可能在不知不觉中成为 僵尸网络的一部分。
我们需要这些旧方法所需的安全性,
但现在需要用更新的方法来完成。
嗯,我记得在 BSD Unix 时代最初的想法是,小于 1024 的端口应该被保留给“众所周知的服务”,并且仍然假设服务器会相对稀少,拥有 root 权限的人会以某种方式被认为是“信任的”。所以你必须有特权绑定一个套接字来监听一个端口,这个端口代表其他用户可以访问的网络服务。
端口 1024-4999 旨在用作“临时”端口,代表 TCP 连接的客户端。端口 5000+ 用于非根服务器。
显然,所有这些假设很快就消失了。检查 IANA TCP 端口号预留列表,了解事情的进展情况。
这个问题的一个解决方案是 RPC 端口映射器的想法。服务不会为每个服务保留一个 TCP 端口,而是会在一个随机端口上启动并告诉端口映射器守护程序它正在侦听的位置。客户会询问端口映射器“服务 X 在哪里”侦听并从那里继续。我不记得有什么安全机制来保护众所周知的 RPC 服务免受模拟。
我不确定这些天这一切是否有充分的理由,但就像大多数 *nix 世界一样,事情往往会累积而不是完全重新发明。
有人读过 Vernor Vinge 吗?我记得他在他的一部小说中写过关于遥远未来的计算机系统,该系统结合了远古时代的一层又一层的代码,时间仍然用自某个远古日期(1970 年 1 月 1 日)以来的秒数表示准确地说)。他应该不远了。
在过去,普通用户用于登录 Unix 机器。因此,您不希望普通用户设置虚假的 ftp 服务或其他东西。
这些天来,典型的用法是只有管理员和其他几个受信任的人才能登录到服务器,所以如果今天重做模型,< 1024 的限制可能不存在。
这是一个历史惯例。
很久以前,系统的数量要少得多。也没有 DNS,FTP 站点要求您提供匿名密码作为您的电子邮件地址,并且没有垃圾邮件。
这本质上是一种默示的“君子协定”。系统管理得很好,如果有人把这件事搞砸了,你知道该和谁说话,或者如果他们脾气暴躁,被踢出网络几乎意味着保持离线。
今天,在一切都使用 TCP/IP 的情况下,这不再提供任何安全性。
接受系统密码的服务在特权端口上运行是有意义的;这意味着拥有 shell 帐户的用户不能在同一端口上设置“假”服务来获取人们的登录详细信息,或者通过在同一端口上设置非功能性服务来拒绝访问。
如果你有一个多用户机器,并且一个非特权用户能够设置一个流氓 ssh 守护进程,他们可能能够捕获其他用户的密码并访问他们的帐户(当然他们必须这样做,而合法的 ssh 守护进程已关闭,可能是为了维护或在系统启动或关闭期间)
不接受系统密码的东西并不重要,尽管在多用户机器上的用户之间共享诸如 Web 服务器之类的东西存在重大的安全问题(正如共享主机提供商所发现的那样)