setcap cap_net_bind_service+epで動作するようにOracle Java 7を取得する方法

setcap cap_net_bind_service+epで動作するようにOracle Java 7を取得する方法

Linuxで1024未満のポートを開く権限をJava実行可能ファイルに付与しようとしています。これが設定です

  • /home/test/javaOracle Server JRE 7.0.25を含む
  • セントOS 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

setcapでバイナリに高い権限が与えられたら、Java 7_u25を実行できますか?では、どのように実行できますか?

JDK-6919633:POSIXファイル機能(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.

共有ライブラリを信頼できるものにする方法は?

答え1

この質問をする前に、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

さて、私たちは今同じページにいます。この問題を解決するには、libjli.soパスを使用して> thisのようなファイルを生成します。

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

それだけです……

引用する

答え2

ポート80(または1024の下のすべてのポート)でJavaリスニングを有効にするプロセス全体を紹介します。

  • JAVA_HOMEの場合:
    $> export JAVA_HOME=/usr/local/java/graalvm-ce-java8-20.2.0
    
  • Javaバイナリの機能を有効にする必要があります。
    $> sudo /sbin/setcap 'cap_net_bind_service=ep' /usr/local/java/graalvm-ce-java8-20.2.0/bin/java
    
  • これにより、Javaを実行するといくつかのエラーが発生し始めます。
    $> java -version
    ./bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
    
  • この問題を解決するには、ファイルをldconfig生成するだけですjava.conf
    $> cat /etc/ld.so.conf.d/java.conf 
    /usr/local/java/graalvm-ce-java8-20.2.0/lib/amd64/jli
    /usr/local/java/graalvm-ce-java8-20.2.0/jre/lib/amd64/jli
    
    $> java -version
    
  • これでJavaが機能するようになりました。
    $> java -version
    openjdk version "1.8.0_262"
    ...
    

関連情報