如何让 Oracle java 7 与 setcap cap_net_bind_service+ep 一起使用

ams*_*ams 11 linux security administration java setcap

我试图授予 java 可执行文件在 Linux 上打开 1024 以下端口的权利。这是设置

  • /home/test/java 包含 Oracle Server JRE 7.0.25
  • CentOS 6.4

这是 getcap 返回的内容

[test@centos6 java]$ pwd
/home/test/java

[test@centos6 java]$ getcap bin/java
bin/java = cap_net_bind_service+ep

[test@centos6 java]$ getcap jre/bin/java
jre/bin/java = cap_net_bind_service+ep
Run Code Online (Sandbox Code Playgroud)

尝试执行 java 会出现以下错误。

[test@centos6 java]$ bin/java
bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
[test@centos6 java]$ jre/bin/java
jre/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

当二进制文件被 setcap 授予提升的权限时,是否可以运行 Java 7_u25,如果可以,如何运行?

JDK-6919633:运行时不支持 POSIX 文件功能(AKA Linux 功能)

Note: when using the setcap the libraries needed by the java launcher
should be present in /usr/lib or any other "trusted" location that the
runtime loader (rtld) uses to find shared libraries.
Run Code Online (Sandbox Code Playgroud)

如何使共享库受信任?

slm*_*slm 14

在你问这个问题之前,我什至从未听说过 Unix 中的这个功能(文件功能)。我发现这个链接看起来有关于如何让 ld.so 信任你的共享库的解决方案:

摘自那个帖子

当提高可执行文件的权限时,运行时加载程序 (rtld),更好地称为 ld.so 不会与不受信任路径中的库链接。这就是 ld.so(1) 的设计方式。如果需要运行这样的可执行文件,则必须将该路径添加到 ld.so 的受信任路径中,下面介绍如何执行此操作:

Fedora 11:
% uname -a
Linux localhost.localdomain 2.6.29.4-167.fc11.i686.PAE #1 SMP Wed May 27 17:28:22 EDT 2009 i686 i686 i386 GNU/Linux

% sudo setcap cap_net_raw+epi ./jdk1.7.0_04/bin/java

% ./jdk1.7.0_04/bin/java -version
./jdk1.7.0_04/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

它的 kaput,好吧,我们现在在同一页面上,要解决此问题,请创建一个文件,例如 > this,其中包含 libjli.so 的路径

% cat /etc/ld.so.conf.d/java.conf
/home/someuser/jdk1.7.0_04/jre/lib/i386/jli
Run Code Online (Sandbox Code Playgroud)

这会将路径名添加到 ld.so 将使用的受信任用户路径,以构建其运行时缓存,通过执行此操作验证 ld.so 是否看到它,需要以 root 身份运行它,并且可能需要重新启动.

% ldconfig | grep libjli
libjli.so -> libjli.so
.......
Run Code Online (Sandbox Code Playgroud)

现在测试java:

% ./jdk1.7.0_04/bin/java -version
java version "1.7.0_04-ea"
Java(TM) SE Runtime Environment (build 1.7.0_04-ea-b18)
Run Code Online (Sandbox Code Playgroud)

你有它.....

参考