我正在尝试使用Linux 功能允许程序(httpd)以非特权用户身份绑定到特权端口(443)。
我使用以下命令设置程序的功能:
setcap CAP_NET_BIND_SERVICE+eip httpd
然后我验证了该功能是否已成功设置......
getcap httpd
打印...
httpd = cap_net_bind_service+eip
当我尝试启动该程序时,它退出,因为它无法绑定到所需的端口。我发现这是使用strace
:
strace -f httpd
显示“权限被拒绝,无法绑定,正在关闭”:
...
write(2, "(13)Permission denied: AH00072: "..., 85(13)Permission denied: AH00072: make_sock: could not bind to address [redacted X.X.X.X]:443) = 85
close(3) = 0
write(2, "no listening sockets available, "..., 46no listening sockets available, shutting down
...
我应该怎么做才能使 Linux 功能正常工作并允许程序绑定到特权端口?
快速搜索表明,带有nosuid
标志的挂载可能会阻止功能运行,并且我验证了它在这种情况下不会干扰。
答案1
您需要将功能设置为 httpd 应用程序的绝对路径。
setcap CAP_NET_BIND_SERVICE+eip <path/to/executable>
示例:这里我将使用 java,tomcat 使用它来运行我们的应用程序。
Java位置:
/opt/java/bin/java
设置功能:
setcap CAP_NET_BIND_SERVICE+eip /opt/java/bin/java