ada*_*aml 18 permissions service port-443
运行绑定到端口 80 的 Web 服务通常不需要 sudoer 权限。既然80/443端口是系统端口,也就是说只有特权用户才能使用,那么为什么这些服务还能绑定到这些端口呢?
Joe*_*man 29
基本上有两种不同的方法:
最初以 root 身份开始运行,绑定到特权端口,然后下降到非特权用户。
inetd 或 xinetd 以特权运行,并将请求转发到非特权运行的 Web 服务器。
由于端口 80/443 是系统端口,这意味着它们只能由特权用户使用
我认为你错了。任何人都可以使用这些端口。绑定到它们是一种特权操作。
这里的基本原理是,某些用户 Joe 不应该能够编写恶意 Web 服务器,然后创建一些他没有任何管理权限的主机。当然,这是一个非常弱的模型,通常没有什么可以阻止 Joe 将自己的计算机连接到网络上,而且他可以对任何他可以物理访问的机器拥有管理权限。
我会用netcat做一个演示。
作为普通用户,我绑定不了80端口:
$ nc -l -p 80
Can't grab 0.0.0.0:80 with bind : Permission denied
Run Code Online (Sandbox Code Playgroud)
我可以绑定到端口 8080:
$ nc -l -p 8080
Run Code Online (Sandbox Code Playgroud)
同时在另一个终端,我可以连接到80端口并发送一些数据,看到它出现在我刚刚启动的服务器端:
$ nc 127.0.0.1 8080 <<<"Hello world"
Run Code Online (Sandbox Code Playgroud)
如果我想绑定到端口 80,我需要是 root:
$ sudo nc -l -p 80
Run Code Online (Sandbox Code Playgroud)
或者我可以将CAP_NET_BIND_SERVICE功能分配给nc二进制文件:
$ cp `which nc` .
$ sudo setcap 'cap_net_bind_service=+ep' ./nc
$ ./nc -l -p 80
Run Code Online (Sandbox Code Playgroud)
另一种选择是编写服务器程序,以便在调用listen()它后删除 root 权限。这是一个非常常见的解决方案,您将在大多数守护程序中看到它。例如,Apache 以 root 身份从 init 启动,然后在www-data绑定到端口 80后放弃 root 权限并成为用户或类似的东西。尝试/etc/init.d/apache start以非 root 身份运行,Apache 可能无法启动。
| 归档时间: |
|
| 查看次数: |
6824 次 |
| 最近记录: |