GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿cómo hacer que Oracle Java 7 funcione con Setcap Cap_net_bind_service+ep?

Estoy tratando de otorgar al ejecutable Java el derecho de abrir puertos por debajo de 1024 en Linux. Aquí está la configuración

  • /home/test/java contiene Oracle Server JRE 7.0.25
  • Cent OS 6.4

Esto es lo que devuelve getcap

[[email protected] java]$ pwd
/home/test/java

[[email protected] java]$ getcap bin/java
bin/java = cap_net_bind_service+ep

[[email protected] java]$ getcap jre/bin/java
jre/bin/java = cap_net_bind_service+ep

Intentar ejecutar Java da el siguiente error.

[[email protected] java]$ bin/java
bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
[[email protected] java]$ jre/bin/java
jre/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

¿Es posible ejecutar Java 7_u25 cuando el binario tiene privilegios elevados con setcap? Si es así, ¿cómo?

JDK-6919633:El tiempo de ejecución no es compatible con las capacidades de archivos POSIX (también conocidas como capacidades de Linux)
dice 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.

¿Cómo puedo hacer que las bibliotecas compartidas sean de confianza?

Respuesta aceptada:

Hasta que hizo la pregunta, nunca había oído hablar de esta función en Unix (capacidades de archivo). Encontré este enlace que parece tener la solución sobre cómo hacer que ld.so confíe en sus bibliotecas compartidas:

  • JDK-7157699:no se puede ejecutar java después de otorgar capacidades posix

extracto de esa publicación

Cuando uno aumenta los privilegios de un ejecutable, el cargador de tiempo de ejecución
(rtld), mejor conocido como ld.so, no se vinculará con bibliotecas en
rutas no confiables. Esta es la forma en que se ha diseñado ld.so(1). Si
uno necesita ejecutar un ejecutable de este tipo, entonces debe agregar esa ruta a
las rutas confiables de ld.so, a continuación se describe cómo hacerlo:

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

Es kaput, Ok, ahora estamos en la misma página, para arreglar esto, cree un archivo como> this, con la ruta a libjli.so

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

Esto agregará el nombre de la ruta a la ruta del usuario de confianza, que ld.so
usará, para construir su caché de tiempo de ejecución, verifique si ld.so lo está viendo al
hacer esto, necesita ejecutarlo como raíz, y puede ser necesario reiniciar.

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

Ahora prueba 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)

y ahí lo tienes…..

Referencias

  • Capacidades de archivo POSIX:Parceling the power of root
  • Estas son las preguntas frecuentes sobre las capacidades del kernel de Linux
  • página del manual de capacidades
  • Seguridad basada en capacidades:wikipedia
  • Uso de funciones de archivo en lugar de Setuid
Relacionado:Linux – ¿Cómo crear /dev/null?
Linux
  1. ¿Cómo empezaste con Linux?

  2. Cómo instalar Oracle Java JDK 17 en Linux

  3. ¿Cómo hacer que Vim funcione correctamente con Tmux?

  4. ¿Cómo escribir un archivo con C en Linux?

  5. ¿Cómo obtener solo el nombre del archivo con Linux 'buscar'?

Cómo instalar Oracle Java JDK 18 en Linux

Cómo administrar varias versiones de Java con jEnv en Linux

Cómo trabajar con enlaces duros y suaves en Linux

Cómo abordar los nombres de archivo con espacios en Linux

Cómo comenzar con Arch Linux

¿Cómo obtener el tamaño de archivo/carpeta con SSH en Linux?