运行绑定到端口80的Web服务通常不需要sudoer权限。 由于端口80/443是系统端口,意味着它们只能被特权用户使用,那么这些服务又是如何能够绑定到这些端口?
基本上有两种不同的方法:
最初开始以root身份运行,绑定到特权端口,然后下拉到非特权用户。
inetd或xinetd运行特权,并将请求转发到运行非特权的Web服务器。
由于端口80/443是系统端口,这意味着它们只能被特权用户使用
我想你错了。 任何人都可以使用这些端口 绑定到他们是一个特权的操作。
这里的基本原理是,一些用户Joe不应该能够编写恶意的Web服务器,然后让一些他没有任何pipe理权限的主机。 当然,这是一个非常薄弱的模型,通常没有什么能够阻止Joe把他自己的计算机放在networking上,他可以拥有对他有物理访问权限的任何机器的pipe理权限。
我会用netcat做一个演示。
作为普通用户,我无法绑定到端口80:
$ nc -l -p 80 Can't grab 0.0.0.0:80 with bind : Permission denied
我可以绑定到端口8080:
$ nc -l -p 8080
同时在另一个terminal上,我可以连接到80端口并发送一些数据,看到它出现在我刚刚开始的服务器端:
$ nc 127.0.0.1 8080 <<<"Hello world"
如果我想绑定到80端口,我需要成为根:
$ sudo nc -l -p 80
或者我可以将CAP_NET_BIND_SERVICE
function分配给nc
二进制:
$ cp `which nc` . $ sudo setcap 'cap_net_bind_service=+ep' ./nc $ ./nc -l -p 80
另一个select是编写服务器程序,使其在调用listen()
,会丢弃root权限。 这是一个很常见的解决scheme,你会看到它与大多数守护进程。 例如,Apache以root用户身份从init启动,然后删除root权限,一旦绑定到端口80,就成为用户www-data
或类似的东西。尝试运行/etc/init.d/apache start
作为不是root和Apache可能无法启动。