Linuxで1024未満のポートを開く権利をJava実行可能ファイルに付与しようとしています。これがセットアップです
-
/home/test/java
Oracle ServerJRE7.0.25が含まれています - CentOS 6.4
getcapが返すものは次のとおりです
[[email protected] java]$ pwd
/home/test/java
[[email protected] java]$ getcap bin/java
bin/java = cap_net_bind_service+ep
[[email protected] java]$ getcap jre/bin/java
jre/bin/java = cap_net_bind_service+ep
javaを実行しようとすると、次のエラーが発生します。
[[email protected] java]$ bin/java
bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
[[email protected] 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ファイル機能(A.K.A. 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.
共有ライブラリを信頼できるようにするにはどうすればよいですか?
承認された回答:
あなたが質問をするまで、私はUnixのこの機能(ファイル機能)について聞いたことがありませんでした。 ld.soに共有ライブラリを信頼させる方法に関する解決策があるように見えるこのリンクを見つけました:
- JDK-7157699:posix機能を付与した後はJavaを実行できません
その投稿からの抜粋
実行可能ファイルの特権を上げる場合、
ld.soとしてよく知られているランタイムローダー(rtld)は、
信頼できないパスのライブラリとリンクしません。これは、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へのパスを使用して>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)
そして、あなたはそれを持っています…..
参考資料
- POSIXファイル機能:rootの力をパーセルする
- これはLinuxカーネル機能に関するFAQです
- 機能のマニュアルページ
- 機能ベースのセキュリティ–ウィキペディア
- Setuidの代わりにファイル機能を使用する