在Linux上,有没有办法让非根进程绑定到“特权”端口?

当除了我之外再也没有其他用户的时候,在我的开发框上有这样的限制是非常烦人的

我知道标准的解决办法,但没有一个能完全满足我的要求:

  1. authbind(Debian测试中的版本,1.0,仅支持IPv4)
  2. 使用iptables重定向目标将低端口重定向到高端口(尚未为ip6tables(iptables的IPv6版本)实现“nat”表)
  3. sudo(以root身份运行是我试图避免的)
  4. SELinux(或类似产品)。(这只是我的开发工具,我不想引入太多额外的复杂性。)

是否有一些简单的sysctl变量允许非根进程绑定到Linux上的“特权”端口(小于1024个端口),或者我只是运气不好

编辑:在某些情况下,您可以使用功能来执行此操作

好的,感谢那些指出能力系统和CAP\u NET\u BIND\u服务能力的人。如果您有一个最近的内核,那么确实可以使用它以非根端口但绑定低端口的形式启动服务。简单的回答是,你做到了:

setcap'cap\u net\u bind\u service=+ep'/path/to/program

然后,无论何时执行程序,它都将具有CAP\u NET\u BIND\u服务功能setcap位于debian包libcap2-bin

现在要注意的是:

  1. 您至少需要一个2.6.24内核
  2. 如果您的文件是脚本,则此操作无效。(即,使用#!行启动解释器)。在这种情况下,据我所知,您必须将该功能应用于解释器可执行文件本身,这当然是一个安全噩梦,因为任何使用该解释器的程序都将具有该功能。我找不到任何干净、简单的方法来解决这个问题
  3. Linux将在任何具有提升权限(如setcapsuid)的程序上禁用LD_LIBRARY_路径。因此,如果您的程序使用自己的../lib/,您可能需要研究另一种选项,如端口转发

资源:

  • 功能(7)手册页。如果要在生产环境中使用功能,请仔细阅读本文。关于如何在exec()调用中继承功能,这里有一些非常棘手的细节
  • setcap手册页
  • “在GNU/Linux上绑定1024以下但不带根的端口”:该文档首先向我指出了setcap

注意:RHEL首先在v6中添加了此功能

发表评论