Oracle Java 7'nin setcap cap_net_bind_service + ep ile çalışmasını sağlama


11

Java çalıştırılabilirine Linux'ta 1024'ün altındaki bağlantı noktalarını açma hakkını vermeye çalışıyorum. İşte kurulum

  • /home/test/java Oracle Server JRE 7.0.25 içerir
  • CentOS 6.4

İşte getcap'ın dönüşü

[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 yürütmeye çalışmak aşağıdaki hatayı verir.

[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

İkili dosyaya setcap ile yükseltilmiş ayrıcalıklar verildiğinde Java 7_u25'i çalıştırmak mümkün mü?

JDK-6919633: Çalışma zamanı POSIX Dosya Özelliklerini (AKA Linux Özellikleri) desteklemiyor

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.

Paylaşılan kitaplıkları nasıl güvenilir hale getirebilirim?

Yanıtlar:


14

Siz soruyu sorana kadar Unix'teki bu tesisi hiç duymadım (dosya yetenekleri). Ben ld.so paylaşılan kitaplıklarına güvenmek nasıl bir çözüm var gibi görünüyor bu bağlantı bulundu:

bu yazıdan alıntı

Biri bir yürütülebilir dosyanın ayrıcalıklarını yükseltirken, çalışma zamanı yükleyicisi (rtld), ld.so olarak bilinirse, güvenilmeyen yollardaki kütüphanelerle bağlantı oluşturmaz. Ld.so (1) bu şekilde tasarlanmıştır. Birinin böyle bir yürütülebilir dosyayı çalıştırması gerekiyorsa, ld.so'nun güvenilir yollarına bu yolu eklemeniz gerekir, aşağıdakiler nasıl yapılacağını açıklar:

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

Onun kaput, Tamam biz şimdi aynı sayfada, bunu düzeltmek için,> böyle bir dosya oluşturmak, libjli.so yolu ile

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

Bu, ld.so'nun çalışma zamanı önbelleğini oluşturmak için kullanacağı yol adını yol adını ekler, ld.so'nun bunu yaparak görüp görmediğini doğrular, kök olarak çalıştırması gerekir ve yeniden başlatma gerekebilir .

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

Şimdi java'yı test edin:

% ./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)

İşte buyur.....

Referanslar


1
Bu yaklaşım sistem çapında bir değişiklik gibi görünüyor, böylece kullanıcı foo ve bar kendi farklı java sürümleri ile farklı libjli.so sürümü çakışma olmadan çalıştırmadan güvenini sınırlamak için bir yol var mı.
ams

1
@ams: kullanıcıya genellikle sahip olmadığı bir yetenek vermek için bir programa güveniyorsunuz. Bu önemlidir: program kodunun bu özelliği kötüye kullanmamasına (veya başkalarının kötüye kullanmasına izin vermemesine) güveniyorsunuz. Bu yüzden bu kütüphanelere sistem çapında güvenmelisiniz.
ninjalj

@ams privbind yardımcı programını, yürütülebilir dosya başına değil, işlem başına temelinde yapabilmek için kullanabilirsiniz.
mighq
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.