为什么需要sudo在给定的ip:port上启动Web服务器?


9

我正在Debian机器上设置基于Python的网络服务器。

设定:

  • Debian操作系统基于VM,但是我已经将VirtualBox从NAT切换为Bridged。
  • VM设置的IP = 192.168.1.7(通过我的路由器的管理屏幕或ifconfig)。
  • 我已经成功地为ssh和HTTP设置了路由器的端口转发。
  • 我已经使用dyndns.com成功设置了路由器的动态dns。

无论我使用的是哪种特定的Python网络服务器(Django,CherryPy,标准库),我都必须使用来启动网络服务器@ 192.168.1.7:80 sudo。否则,我会收到有关没有权限访问该端口的错误。sudo在指定ip:port时,没有任何Web服务器教程提到需要使用。

问题:为什么我需要sudo用来启动这些Web服务器?是否表明我不应该使用192.168.1.7?还是我没有在某个地方正确设置配置文件?

Answers:


11

只有具有root权限的进程才能在特权端口上侦听。这是标准的Unix安全约定。


在80上使用sudo启动网络服务器是否常见?还是有其他使用端口大于1024的策略(例如8000、8080)?
2011年

@ Begbie00是的,在更高的端口上运行Web服务器是很普遍的。但是,它主要用于无法在Internet上公开访问或在用户没有root权限的计算机上运行的Web服务器。用于开发和测试的Web服务器几乎只在非特权端口上运行。
西蒙·托斯

2
不幸的是,对于现代的unix系统,此声明并不完全正确。有关详细信息,请参见我的答案,但是例如,现代Linux允许使用CAPABILITIES进行更细化的权限控制。Solaris还具有称为RBAC的细粒度安全系统。这些机制允许将权限(例如绑定特权端口)分配给特定用户或程序。
SkyBeam

14

这是标准行为,不允许非特权用户绑定到特权端口(端口号低于1024)。因此,例如想绑定到端口80的应用程序必须特权运行(通常是指以root身份运行)才能绑定到该端口。

一种常见的方法是与特权用户一起运行一个小的“侦听器”进程,该进程接受连接,然后生成一个非特权进程来处理请求。出于安全原因,已经完成了丢弃请求处理的特权。如果有人能够利用处理请求的进程,那么通常它允许入侵者使用与处理进程相同的特权来执行命令。因此,使用特权进程处理整个请求将很糟糕。

但是,对于许多应用程序而言,如今通常以非root用户身份运行。但是这样的过程当然无法在标准配置中绑定到特权端口。因此,像Tomcat或JBoss这样的服务器曾经绑定到诸如8080这样的高端口,因此它们不需要特权侦听器。

当然,如果将这样的过程暴露给Internet,则很可能会在端口80上提供访问权限,因为使用HTTP协议时,每个浏览器都会首先尝试连接到端口80。提供此功能的常用解决方法是在应用程序和公共Internet之间使用防火墙或端口转换器。因此,请求会到达请求端口80的防火墙,但防火墙会将请求转发到端口8080上的某个内部主机。这样,真正的Web服务器就可以在高端口上运行,而在端口80上则是公共可用的。

- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]

有时,仅使用iptablesNAT规则即可完成此重定向:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

这允许运行非特权应用程序在端口8080上侦听,而对端口80的所有传入请求都仅重定向到端口8080。

但是,使用现代Linux内核还有另一种可能性:使用功能。

setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary

binary即使从非root用户启动时,这也将允许绑定到特权端口。请参阅man capabilities以获取更多详细信息。


功能是POSIX的一部分,还是Linux特定的?
西蒙·托斯

@Let_Me_Be据我从en.wikipedia.org/wiki/Capability-based_security的了解,POSIX定义了基于能力的概念,但这与Linux中实现的概念不同。因此,我认为CAP_NET_BIND_SERVICE之类的Linux功能仅特定于Linux。
SkyBeam
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.