Как заставить Oracle Java 7 работать с setcap cap_net_bind_service + ep

11

Я пытаюсь предоставить исполняемому файлу Java право открывать порты ниже 1024 в Linux. Вот настройки

  • /home/test/java содержит сервер Oracle 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

Попытка выполнить Java дает следующую ошибку.

[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

Его капут, Хорошо, мы сейчас на одной странице, чтобы исправить это, создайте файл, такой как> this, с путем к libjli.so

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

Это добавит путь к доверенному пути пользователя, который будет использовать ld.so, для создания своего кэша времени выполнения, проверит, видит ли ld.so его, выполнив это, нужно запустить его как root, и может потребоваться перезагрузка ,

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

и вот оно у тебя .....

Ссылки

SLM
источник
1
Этот подход кажется общесистемным изменением, есть способ ограничить доверие для каждого пользователя, чтобы у пользователя foo и bar могли быть свои собственные разные версии java с разными версиями libjli.so без конфликта.
Ams
1
@ams: вы доверяете программе, чтобы дать пользователю возможность, которой у него обычно нет. Это важно: вы доверяете программному коду не злоупотреблять (и не позволяйте другим злоупотреблять) этой возможностью. Вот почему вы должны доверять этим библиотекам на общесистемном уровне.
ниндзя
@ams Вы можете использовать утилиту privbind, чтобы сделать это для каждого процесса, а не для каждого исполняемого файла.
Mighq