
顧客は、ポート512(1024未満)をバインドするWebシステムを実行するために非ルートユーザーを作成するように依頼しています。Webサーバー(桟橋) を実行すると、例外が発生します。
2013-10-16 14:49:51.406:WARN::failed Server@2c2893ce: java.net.SocketException: Permission denied
2013-10-16 14:49:51.406:WARN::EXCEPTION
java.net.SocketException: Permission denied
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:444)
at sun.nio.ch.Net.bind(Net.java:436)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)
そこで、非ルート ユーザーが 1024 未満のポートをバインドする方法についていくつかの解決策を見つけました。最終的に使用した解決策は、Capabilities を設定して "cap_net_bind_service" を java に設定することでした。コマンドは次のとおりです。
sudo setcap cap_net_bind_service+eip /usr/lib/jvm/jdk1.7.0_25/bin/java
しかし、Jetty を再度起動すると、別のエラーが発生します。
[admin@VPRCEMSUSOFC04 bin]$ ./jetty.sh start
Starting Jetty: /usr/lib/jvm/jdk1.7.0_25/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
を実行してもjava -version
、例外が発生します。
[admin@VPRCEMSUSOFC04 bin]$ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
しかし、root でログインすると問題ありません。
[root@VPRCEMSUSOFC04 etc]# java -version
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
なぜこのようなことが起こるのか理解できません。なぜルート ユーザーと非ルート ユーザーで異なる結果が 2 つあるのでしょうか。Capabilities の設定がこれに影響しているようです。
Linux カーネルは 2.6.32-220.el6.x86_64 です。OS は Red Hat Enterprise Linux Server リリース 6.2 (Santiago) です。
答え1
Java実行ファイルは、実行ファイルが追加の権限や機能を取得するとカーネルによって無効になる安全対策として、 を使用します。この実行ファイルを非ルート ユーザーとして使用する場合は、 にある libjli.so の場所をローダー構成に追加する必要があります/etc/ld.so.conf*
。