将Web服务器绑定到端口80而不是root用户

Fra*_*lea 5 c linux

我在C中编写了自己的Web服务器.如何将其绑定到端口80而不是root,这样安全性不会受到影响(缓冲区溢出等)?

我应该简单地转发来自在端口80上运行的另一个"稳定"服务器的任何流量吗?

Thi*_*ter 5

使用转发代理确实是最简单和最推荐的解决方案.它还具有在甚至到达您自己编写的服务器之前过滤可怕无效请求的优点.
如果您的应用程序使用用户的IP地址记住从Web服务器使用的任何标头中检索它(X-Client-IP等).但是,仅对来自您的Web服务器的请求执行此操作,否则用户可以欺骗其IP.您可以通过检查请求是否来自您的IP并在此情况下仅检查标头或仅将应用程序绑定到localhost来执行此操作.

另一种解决方案是授予程序CAP_NET_BIND_SERVICE能力.这需要使用root setcap cap_net_bind_service=ep /path/to/the/executable- 因为标志存储在filesystem属性中,所以当将文件复制到另一个系统或重新编译应用程序时,它将丢失.

当然你也可以让你的程序setuid root,然后在调用后立即切换到非特权用户bind().但是,根据您的程序如何工作以及它的作用,这可能不是一个好主意 - 例如,如果由于某种原因需要关闭并重新打开侦听套接字,则需要完全重新启动该进程.