Como obter o Oracle java 7 para trabalhar com o setcap cap_net_bind_service + ep

9

Estou tentando conceder ao executável java o direito de abrir portas abaixo de 1024 no Linux. Aqui está a configuração

  • /home/test/java contém o Oracle Server JRE 7.0.25
  • CentOS 6.4

Aqui está o que o getcap retorna

[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

Tentar executar o java dá o seguinte erro.

[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

É possível rodar o Java 7_u25 quando o binário recebeu privilégios elevados com o setcap? Se sim, como?

JDK-6919633: O tempo de execução não suporta os recursos de arquivos POSIX (recursos A.K.A. do Linux)  diz que

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.

Como posso confiar nas bibliotecas compartilhadas?

    
por ams 23.08.2013 / 22:46

1 resposta

11

Até que você fez a pergunta, eu nunca ouvi falar desse recurso no Unix (recursos de arquivo). Eu encontrei este link que parece ter a solução de como fazer o ld.so confiar em suas bibliotecas compartilhadas:

trecho desse post

When one is raising the privileges of an executable, the runtime loader (rtld), better know as ld.so will not link with libraries in untrusted paths. This is the way the ld.so(1) has been designed. If one needs to run such an executable, then you have to add that path to the trusted paths of ld.so, the following describes how to do 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

Its kaput, Ok we are on the same page now, to fix this, create a file such as > this, with the path to libjli.so

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

This will add the the pathname to the trusted user path, that ld.so will use, to build its runtime cache, verify if ld.so is seeing it by doing this, need to run it as root, and a reboot may be necessary.

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

Now test 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)

and there you have it.....

Referências

por 24.08.2013 / 01:05