So funktioniert Oracle Java 7 mit setcap cap_net_bind_service + ep

11

Ich versuche, der ausführbaren Java-Datei das Recht zu gewähren, Ports unter 1024 unter Linux zu öffnen. Hier ist das Setup

  • /home/test/java enthält die Oracle Server JRE 7.0.25
  • CentOS 6.4

Hier ist, was getcap zurückgibt

[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

Der Versuch, Java auszuführen, führt zu folgendem Fehler.

[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

Ist es möglich, Java 7_u25 auszuführen, wenn die Binärdatei mit setcap erhöhte Berechtigungen erhalten hat, wenn ja, wie?

JDK-6919633: Runtime bietet keine Unterstützung für POSIX - Dateifunktionen (AKA Linux Capabilities) sagt , dass

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.

Wie mache ich die gemeinsam genutzten Bibliotheken vertrauenswürdig?

ams
quelle

Antworten:

14

Bis Sie die Frage gestellt haben, habe ich unter Unix (Dateifunktionen) noch nie von dieser Funktion gehört. Ich habe diesen Link gefunden, der die Lösung zu finden scheint, wie ld.so Ihren gemeinsam genutzten Bibliotheken vertrauen kann:

Auszug aus diesem Beitrag

Wenn man die Berechtigungen einer ausführbaren Datei erhöht, wird der Laufzeit-Loader (rtld), besser bekannt als ld.so, nicht mit Bibliotheken in nicht vertrauenswürdigen Pfaden verknüpft. Auf diese Weise wurde der ld.so (1) entworfen. Wenn eine solche ausführbare Datei ausgeführt werden muss, müssen Sie diesen Pfad zu den vertrauenswürdigen Pfaden von ld.so hinzufügen. Im Folgenden wird beschrieben, wie dies getan wird:

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 ist kaput, Ok, wir sind jetzt auf derselben Seite. Um dies zu beheben, erstellen Sie eine Datei wie> this mit dem Pfad zu libjli.so

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

Dadurch wird der Pfadname zum vertrauenswürdigen Benutzerpfad hinzugefügt, den ld.so verwendet, um seinen Laufzeitcache zu erstellen, um zu überprüfen, ob ld.so ihn auf diese Weise sieht, um ihn als root auszuführen, und möglicherweise ist ein Neustart erforderlich .

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

Testen Sie jetzt 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)

und da hast du es .....

Verweise

slm
quelle
1
Dieser Ansatz scheint eine systemweite Änderung zu sein. Es gibt eine Möglichkeit, das Vertrauen auf Benutzerbasis einzuschränken, sodass Benutzer foo und bar ihre eigenen unterschiedlichen Versionen von Java mit unterschiedlichen Versionen von libjli.so haben können, ohne in Konflikte zu geraten.
Ams
1
@ams: Sie vertrauen einem Programm, um dem Benutzer eine Funktion zu geben, über die er normalerweise nicht verfügt. Dies ist wichtig: Sie vertrauen darauf, dass der Programmcode diese Funktion nicht missbraucht (oder von anderen missbrauchen lässt). Deshalb müssen Sie diesen Bibliotheken systemweit vertrauen.
Ninjalj
@ams Sie können das Dienstprogramm privbind verwenden , um dies pro Prozess und nicht pro ausführbarer Basis zu tun.
Mighq