4

ユーザーwwwとして実行するWebアプリケーションがあります。ただし、ある時点で、ユーザー Alice と Bob に代わって Linux ファイルシステムからファイルを読み取る必要があります。

これを行う 1 つの方法は、シェル (Runtime.exec()) を起動し、C の setuid 実行可能ファイルを呼び出してユーザー ID を変更し、ファイルを読み取ることです。

JNI でこれを達成する方法はありますか (Web アプリは root ではなく www として実行する必要があります)。Linux でネイティブ メソッドを呼び出す Java JNI プログラムを作成しようとしました (ルートがこれらのネイティブ メソッドを所有し、setuid ビットを設定しました)。しかし、Java プログラムを root として実行しない限り、ユーザー ID を切り替えることはできません。私が見逃しているものはありますか?これを達成する方法はありますか?

ありがとう!

4

2 に答える 2

4

いいえ、ありません。setuid2 つのケースでsetgidのみ使用できます (通常の Linux):

  1. プロセスはルートです。
  2. プロセスは、モードにsetuidまたはビットを含むファイルから起動されました。setgid

前者の場合、プロセスはこれらの関数を勝手に呼び出して、任意の ID を採用する可能性があります。後者の場合、プロセスは、親の uid/gid と、それが起動されたファイルの uid/gid の間を行き来するだけです。

つまり、setuid の場合はファイルの uid を採用し、setgid の場合は gid を採用します。

あなたはJavaにいるので、exec-edプログラムはJava自体であり、巨大なセキュリティの露出を作成したくない場合を除いて、それをsetuidまたはsetgidにしたくありません。

JNI 呼び出しインターフェースを介して JVM を開始する C または C++ プログラムを作成し、そのプログラムを setuid または setgid に設定すると、そこで呼び出された JNI コードが switch への適切な呼び出しを行うことができます。

于 2011-05-16T18:21:02.627 に答える