好的,感谢指出能力系统和
CAP_NET_BIND_SERVICE能力的人们。如果您使用的是最新内核,则确实可以使用它以非root用户身份启动服务,但绑定低端口。简短的答案是您这样做:
setcap 'cap_net_bind_service=+ep' /path/to/program
然后任何时间
program执行,此后它将具有此
CAP_NET_BIND_SERVICE功能。
setcap在debian软件包中
libcap2-bin。
现在需要注意的是:
- 您将至少需要2.6.24内核
- 如果您的文件是脚本,则无法使用。(即,使用#!行启动解释器)。据我所知,在这种情况下,您必须将功能应用于解释器可执行文件本身,这当然是安全的噩梦,因为使用该解释器的任何程序都将具有该功能。我找不到解决此问题的任何简单明了的方法。
- Linux将在
program
具有更高特权的任何磁盘上禁用LD_LIBRARY_PATH,例如setcap
或suid
。因此,如果您program
使用自己的.../lib/
,则可能必须考虑其他选项,例如端口转发。
资源:
- 功能(7)手册页。如果要在生产环境中使用功能,请仔细阅读本章。关于如何在exec()调用之间继承功能的方式,确实存在一些非常棘手的细节,在此进行详细介绍。
- setcap手册页
- “绑定低于1024的端口,而在GNU / Linux上没有root”:该文档首先将我指向
setcap
。
注意:RHEL首先在v6中添加了它。



