Cách để Oracle java 7 hoạt động với setcap cap_net_bind_service + ep


11

Tôi đang cố gắng cấp cho java thực thi quyền mở các cổng dưới 1024 trên Linux. Đây là thiết lập

  • /home/test/java chứa máy chủ Oracle JRE 7.0.25
  • CentOS 6.4

Đây là những gì getcap trả về

[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

Cố gắng thực hiện java cho lỗi sau.

[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

Có thể chạy Java 7_u25 khi tệp nhị phân đã được cấp đặc quyền nâng cao với setcap, nếu vậy thì thế nào?

JDK-6919633: Thời gian chạy không hỗ trợ Khả năng tệp POSIX (Khả năng của AKA Linux) nói rằng

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.

Làm thế nào để tôi làm cho các thư viện chia sẻ đáng tin cậy?

Câu trả lời:


14

Cho đến khi bạn hỏi câu hỏi tôi thậm chí chưa bao giờ nghe nói về cơ sở này trong Unix (khả năng tập tin). Tôi tìm thấy liên kết này có vẻ như có giải pháp về cách làm cho ld.so tin tưởng các thư viện chia sẻ của bạn:

trích từ bài đó

Khi một người đang nâng cao các đặc quyền của một tệp thực thi, trình tải thời gian chạy (rtld), được biết rõ hơn là ld.so sẽ không liên kết với các thư viện trong các đường dẫn không tin cậy. Đây là cách mà ld.so (1) đã được thiết kế. Nếu một người cần chạy một tệp thực thi như vậy, thì bạn phải thêm đường dẫn đó vào các đường dẫn đáng tin cậy của ld.so, sau đây mô tả cách thực hiện:

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

Bây giờ, chúng ta đang ở trên cùng một trang, để sửa lỗi này, tạo một tệp như> này, với đường dẫn đến libjli.so

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

Điều này sẽ thêm tên đường dẫn vào đường dẫn người dùng đáng tin cậy, mà ld.so sẽ sử dụng, để xây dựng bộ đệm thời gian chạy của nó, xác minh nếu ld.so đang nhìn thấy nó bằng cách thực hiện điều này, cần chạy nó dưới quyền root và có thể cần khởi động lại .

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

Bây giờ hãy kiểm tra 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)

Và bạn có nó rồi đấy.....

Người giới thiệu


1
Cách tiếp cận này dường như là một sự thay đổi toàn hệ thống, có cách để hạn chế sự tin tưởng trên cơ sở mỗi người dùng để người dùng foo và bar có thể có các phiên bản java khác nhau của riêng họ với phiên bản libjli.so khác nhau mà không gặp phải xung đột.
AMS

1
@ams: bạn đang tin tưởng một chương trình để cung cấp cho người dùng khả năng mà họ thường không có. Điều này rất quan trọng: bạn đang tin tưởng mã chương trình để không lạm dụng (cũng không để người khác lạm dụng) khả năng đó. Đó là lý do tại sao bạn phải tin tưởng các thư viện đó ở cấp độ toàn hệ thống.
ninjalj

@ams Bạn có thể sử dụng tiện ích privatebind để có thể làm điều đó trên cơ sở từng quy trình, không phải trên cơ sở thực thi.
mighq
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.