วิธีรับ Oracle Java 7 ให้ทำงานกับ setcap cap_net_bind_service + ep


11

ฉันพยายามให้สิทธิในการเรียกใช้จาวาเพื่อเปิดพอร์ตต่ำกว่า 1024 บน Linux นี่คือการตั้งค่า

  • /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

การพยายามเรียกใช้งานจาวาให้ข้อผิดพลาดดังต่อไปนี้

[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

เป็นไปได้หรือไม่ที่จะรัน Java 7_u25 เมื่อไบนารีได้รับสิทธิ์ยกระดับกับ setcap ถ้าเป็นเช่นนั้น

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.

ฉันจะทำให้ไลบรารีที่ใช้ร่วมกันเชื่อถือได้อย่างไร

คำตอบ:


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, โอเคเราอยู่ในหน้าเดียวกันตอนนี้, เพื่อแก้ไขสิ่งนี้, สร้างไฟล์เช่น> นี้, โดยมีพา ธ ไปยัง libjli.so

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

สิ่งนี้จะเพิ่มชื่อพา ธ ไปยังเส้นทางผู้ใช้ที่เชื่อถือได้ซึ่ง ld.so จะใช้เพื่อสร้างแคชรันไทม์ของตนตรวจสอบว่า ld.so เห็นมันด้วยการทำเช่นนี้จำเป็นต้องเรียกใช้ในฐานะรูทและอาจจำเป็นต้องรีบูต .

% 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 และแถบสามารถมีจาวารุ่นต่าง ๆ ของพวกเขาเองด้วย libjli.so เวอร์ชันที่แตกต่างกัน
ams

1
@ams: คุณไว้วางใจโปรแกรมเพื่อให้ความสามารถแก่ผู้ใช้ที่พวกเขาไม่มี สิ่งนี้มีความสำคัญ: คุณกำลังไว้วางใจรหัสโปรแกรมเพื่อไม่ให้ใช้งานในทางที่ผิด นั่นคือเหตุผลที่คุณต้องเชื่อถือไลบรารีเหล่านั้นในระดับระบบ
ninjalj

@ams คุณสามารถใช้ยูทิลิตีprivbindเพื่อให้สามารถดำเนินการได้ตามกระบวนการต่อกระบวนการไม่ใช่สำหรับแต่ละกระบวนการ
mighq
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.