6

Tomcat (Web サーバー) を特権ユーザーとして起動し、起動後に非特権ユーザーに戻したいと考えています。これをプログラムで、または一般的に Linux で行う方法はありますか?

ありがとう。

4

6 に答える 6

4

必要な基本システム コールは ですがsetuid(2)、どの Java API でも公開されていません。

アクセスを許可する JNI ラッパーを作成することは難しくありませんが、その場合でも、Tomcat スタートアップ コード内で、呼び出しが行われsetuidた後に呼び出す適切な場所を見つける必要がありますbind(2)(これらは通常、ルート権限)。

geocarで推奨されているauthbindように、Tomcat をルートとして実行する必要がまったくないように使用できます。

または、おそらく問題のサーバーでルートアクセスを取得しているため、非特権ポートでTomcatを実行し、iptablesトリックを使用して、特権ポートからTomcatが実際にリッスンしているポートにインバウンドリクエストを転送します. これを行う方法については、この SO 投稿を参照してください。

于 2009-01-09T19:11:38.937 に答える
2

私はまさにそれを行うkchuidを知っています、そしてそれは放棄されたように見えますが、それを最新のものにするのは難しいようには見えません。

とは言うものの、私が働いているホスティング会社は、(共有ホスティングパッケージで)ユーザーがポート80でTomcatを含む独自のウェブサーバーを実行することを許可しています。これは、サーバーをルートとして起動する必要のないauthbindと呼ばれるツールを使用して行われます。 -ただし、root以外のユーザーが選択したIPアドレスと選択したポートにバインドできるようにします。

唯一の欠点は、authbindがデフォルトでJavaのネットワーク抽象化レイヤーで機能しないことです。JavaのIPV6サポートを無効にする必要があります。おそらく、アプリケーション内でバインドする特定のIPアドレスを指定する必要があります。前者はJREをで開始することで実行できます-Djava.net.preferIPv4Stack=trueが、後者はアプリケーション固有です。

于 2009-01-09T18:20:45.280 に答える
1

システムコールseteuid(http://www.opengroup.org/onlinepubs/009695399/functions/seteuid.html)を介して独自のアプリケーションコードで実行できますが、bashスクリプトまたは他の何かを介して実行します。よくわかりません。そもそも通常のユーザーとしてプロセスを開始しないのはなぜですか?

于 2009-01-09T17:25:21.647 に答える
0

root 権限で (たとえば、バイナリの setuid を使用して) 起動し、権限が必要な作業を行い、setuid を使用して権限を削除し、最後に tomcat を実行する別のプログラムを作成できます。

解決しようとしている問題に応じて、これが解決策になる場合とそうでない場合があります。たとえば、サーバーをより高い優先度で実行する必要がある場合、これは機能します。

于 2009-01-09T18:49:59.603 に答える
0

プロセスはそれ自体の特権を削除できますが、実行中の別のプロセスのユーザーを変更することはできないと思います。

于 2009-01-09T17:23:38.093 に答える
0

なぜこれをやりたいのか説明できますか?一般に、必要な特権を持つユーザーを定義し ( 「最小特権の原則」を参照)、そのユーザーとして実行することをお勧めします。

于 2009-01-09T18:01:40.623 に答える