Tomcat (Web サーバー) を特権ユーザーとして起動し、起動後に非特権ユーザーに戻したいと考えています。これをプログラムで、または一般的に Linux で行う方法はありますか?
ありがとう。
必要な基本システム コールは ですがsetuid(2)
、どの Java API でも公開されていません。
アクセスを許可する JNI ラッパーを作成することは難しくありませんが、その場合でも、Tomcat スタートアップ コード内で、呼び出しが行われsetuid
た後に呼び出す適切な場所を見つける必要がありますbind(2)
(これらは通常、ルート権限)。
geocarで推奨されているauthbind
ように、Tomcat をルートとして実行する必要がまったくないように使用できます。
または、おそらく問題のサーバーでルートアクセスを取得しているため、非特権ポートでTomcatを実行し、iptables
トリックを使用して、特権ポートからTomcatが実際にリッスンしているポートにインバウンドリクエストを転送します. これを行う方法については、この SO 投稿を参照してください。
私はまさにそれを行うkchuidを知っています、そしてそれは放棄されたように見えますが、それを最新のものにするのは難しいようには見えません。
とは言うものの、私が働いているホスティング会社は、(共有ホスティングパッケージで)ユーザーがポート80でTomcatを含む独自のウェブサーバーを実行することを許可しています。これは、サーバーをルートとして起動する必要のないauthbindと呼ばれるツールを使用して行われます。 -ただし、root以外のユーザーが選択したIPアドレスと選択したポートにバインドできるようにします。
唯一の欠点は、authbindがデフォルトでJavaのネットワーク抽象化レイヤーで機能しないことです。JavaのIPV6サポートを無効にする必要があります。おそらく、アプリケーション内でバインドする特定のIPアドレスを指定する必要があります。前者はJREをで開始することで実行できます-Djava.net.preferIPv4Stack=true
が、後者はアプリケーション固有です。
システムコールseteuid(http://www.opengroup.org/onlinepubs/009695399/functions/seteuid.html)を介して独自のアプリケーションコードで実行できますが、bashスクリプトまたは他の何かを介して実行します。よくわかりません。そもそも通常のユーザーとしてプロセスを開始しないのはなぜですか?
root 権限で (たとえば、バイナリの setuid を使用して) 起動し、権限が必要な作業を行い、setuid を使用して権限を削除し、最後に tomcat を実行する別のプログラムを作成できます。
解決しようとしている問題に応じて、これが解決策になる場合とそうでない場合があります。たとえば、サーバーをより高い優先度で実行する必要がある場合、これは機能します。
プロセスはそれ自体の特権を削除できますが、実行中の別のプロセスのユーザーを変更することはできないと思います。
なぜこれをやりたいのか説明できますか?一般に、必要な特権を持つユーザーを定義し ( 「最小特権の原則」を参照)、そのユーザーとして実行することをお勧めします。