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


11

我正在尝试授予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

尝试执行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

如果使用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.

如何使共享库受信任?

Answers:


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

它的kaput,好吧,我们现在在同一页面上,要修复此问题,请创建一个文件>> this,并提供libjli.so的路径。

% cat /etc/ld.so.conf.d/java.conf
/home/someuser/jdk1.7.0_04/jre/lib/i386/jli

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

% ldconfig | grep libjli
libjli.so -> libjli.so
.......

现在测试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)

然后你有它.....

参考文献


1
这种方法似乎是系统范围的更改,有没有一种方法可以限制每个用户的信任,以便用户foo和bar可以拥有自己的不同版本的Java和不同版本的libjli.so,而不会发生冲突。
AMS

1
@ams:您信任的程序可以为用户提供通常没有的功能。这很重要:您信任程序代码不要滥用(也不要让其他人滥用)该功能。这就是为什么您必须在系统范围内信任那些库。
ninjalj

@ams您可以使用privbind实用程序来按进程而不是按可执行程序来执行此操作。
mighq 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.