一个非 root 用户通过端口 512 运行 jetty,该端口小于端口 1024

一个非 root 用户通过端口 512 运行 jetty,该端口小于端口 1024

客户要求我们创建一个非root用户来运行我们的Web系统,该用户绑定端口512,小于1024。当Web服务器(码头) 运行,这是例外:

2013-10-16 14:49:51.406:WARN::failed Server@2c2893ce: java.net.SocketException: Permission denied
2013-10-16 14:49:51.406:WARN::EXCEPTION
java.net.SocketException: Permission denied
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:444)
        at sun.nio.ch.Net.bind(Net.java:436)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)

所以我找到了一些关于非root用户如何绑定小于1024端口的解决方案,最后我使用的解决方案是将“cap_net_bind_service”设置为java,通过set Capability,命令是:

sudo setcap cap_net_bind_service+eip /usr/lib/jvm/jdk1.7.0_25/bin/java

但是当我再次启动jetty时,又发生了另一个错误:

[admin@VPRCEMSUSOFC04 bin]$ ./jetty.sh start
Starting Jetty: /usr/lib/jvm/jdk1.7.0_25/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

即使我执行时java -version,它也会引发异常:

[admin@VPRCEMSUSOFC04 bin]$ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

但是当我用 root 登录时,就没有问题了:

[root@VPRCEMSUSOFC04 etc]# java -version
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

我不明白为什么会发生这种情况。为什么root和非root用户下有两种不同的结果。看来设置的能力会影响这一点。

Linux内核是2.6.32-220.el6.x86_64。操作系统是 Red Hat Enterprise Linux Server 版本 6.2(圣地亚哥)。

答案1

Java 可执行文件依赖于以下功能:当可执行文件获得额外的权限或功能时被内核禁用,作为一项安全措施。如果您想以非 root 身份使用此可执行文件,那么您需要将 libjli.so 的位置添加到您的加载器配置中,位于/etc/ld.so.conf*.

相关内容