web-dev-qa-db-ja.com

スーパーユーザープロセスは、プロセスの実際のユーザーIDとグループIDを変更できますが、パスワードファイル内のものと一致しませんか?

APUEから

プロセスの実際のユーザーIDと実際のグループIDは、実際のユーザーを識別します。これら2つのフィールドは、ログイン時にパスワードファイルのエントリから取得されます。通常、これらの値はログインセッション中に変更されませんが、スーパーユーザープロセスが変更する方法

スーパーユーザープロセスがプロセスの実際のユーザーIDと実際のグループIDを変更して、実際のユーザーIDと実際のグループIDの関係がパスワードファイル内のそれらと一致しないようにすることはできますか?たとえば、ユーザーTimがパスワードファイルごとにグループoceanのメンバーでない場合、スーパーユーザープロセスは、プロセスの実際のユーザーIDと実際のグループIDをTimoceanそれぞれ?

11
Tim

はい、スーパーユーザープロセスは、実際のユーザーIDと実際のグループIDを任意の値に変更できます。 /etc/passwdおよび/etc/shadowの値は、設定する必要がある値の構成ですが、可能な値の制限ではありません。

#1を編集

つまり、loginのようなプログラムはファイルから値を読み取るため、ファイルは構成ファイルまたは入力ファイルです。これらは、プログラムが実行できることに対する制約ではありません。スーパーユーザープロセスはカーネルに任意の値を渡すことができ、カーネルはファイルをチェックしません。

プログラムは

setgid (54321);
setuid (12345);

これは、IDがいずれのファイルにも記載されていない場合でも機能します。

15
RalfFriedl

パスワードファイルとグループファイルは読み取られません。実際のユーザーIDと実際のグループIDを設定するために、ログインプロセスによってのみ読み取られます。

これらのファイルについて言及しているカーネルには何もありません。ログインでは、ファイルを開いて処理し、2つのIDを設定する必要があります。別の場所からこれらのIDを取得するように別の方法で記述できます。例えば。ネットワーク化されたデータベースから。

機能CAP_SETUIDを持つプロセスは、これらのIDを設定できます。ルートにはこの機能があります。

Unixのセキュリティモデルは、一部はカーネルに実装され、一部は昇格された機能で実行されるプロセスで実装されます(例:rootとして)。


ご了承ください /etc/passwdおよび/etc/groupは、lsps、およびユーザー/グループ名をユーザー/グループIDとの間で変換する必要があるその他のプログラムによっても読み取られます。 (彼らは、これらの詳細を保存する別の方法について知っているよりも、ライブラリを通じてこれを行うかもしれません。)

9
ctrl-alt-delor

とりわけ、/etc/passwdの目的は、ユーザーのnameをユーザーの[〜に変換することです#〜] uid [〜#〜]。 bobのUIDが気にならない場合は、そのファイルは必要ありません。任意のUID/GIDに変更するだけの場合は、関連するsyscallsを使用します。

int setuid(uid_t uid);
int setgid(gid_t gid);

CAP_SETUIDCAP_SETGIDcapabilities (ルートプロセスが通常持っている)を持つ特権プロセスは、自身のUIDとGIDのみを変更でき、別の実行中のプロセスのUIDとGIDは変更できないことに注意してください。

3
forest