APUEから
プロセスの実際のユーザーIDと実際のグループIDは、実際のユーザーを識別します。これら2つのフィールドは、ログイン時にパスワードファイルのエントリから取得されます。通常、これらの値はログインセッション中に変更されませんが、スーパーユーザープロセスが変更する方法
スーパーユーザープロセスがプロセスの実際のユーザーIDと実際のグループIDを変更して、実際のユーザーIDと実際のグループIDの関係がパスワードファイル内のそれらと一致しないようにすることはできますか?たとえば、ユーザーTim
がパスワードファイルごとにグループocean
のメンバーでない場合、スーパーユーザープロセスは、プロセスの実際のユーザーIDと実際のグループIDをTim
とocean
それぞれ?
はい、スーパーユーザープロセスは、実際のユーザーIDと実際のグループIDを任意の値に変更できます。 /etc/passwd
および/etc/shadow
の値は、設定する必要がある値の構成ですが、可能な値の制限ではありません。
つまり、login
のようなプログラムはファイルから値を読み取るため、ファイルは構成ファイルまたは入力ファイルです。これらは、プログラムが実行できることに対する制約ではありません。スーパーユーザープロセスはカーネルに任意の値を渡すことができ、カーネルはファイルをチェックしません。
プログラムは
setgid (54321);
setuid (12345);
これは、IDがいずれのファイルにも記載されていない場合でも機能します。
パスワードファイルとグループファイルは読み取られません。実際のユーザーIDと実際のグループIDを設定するために、ログインプロセスによってのみ読み取られます。
これらのファイルについて言及しているカーネルには何もありません。ログインでは、ファイルを開いて処理し、2つのIDを設定する必要があります。別の場所からこれらのIDを取得するように別の方法で記述できます。例えば。ネットワーク化されたデータベースから。
機能CAP_SETUIDを持つプロセスは、これらのIDを設定できます。ルートにはこの機能があります。
Unixのセキュリティモデルは、一部はカーネルに実装され、一部は昇格された機能で実行されるプロセスで実装されます(例:rootとして)。
ご了承ください /etc/passwd
および/etc/group
は、ls
、ps
、およびユーザー/グループ名をユーザー/グループIDとの間で変換する必要があるその他のプログラムによっても読み取られます。 (彼らは、これらの詳細を保存する別の方法について知っているよりも、ライブラリを通じてこれを行うかもしれません。)
とりわけ、/etc/passwd
の目的は、ユーザーのnameをユーザーの[〜に変換することです#〜] uid [〜#〜]。 bobのUIDが気にならない場合は、そのファイルは必要ありません。任意のUID/GIDに変更するだけの場合は、関連するsyscallsを使用します。
int setuid(uid_t uid);
int setgid(gid_t gid);
CAP_SETUID
とCAP_SETGID
capabilities (ルートプロセスが通常持っている)を持つ特権プロセスは、自身のUIDとGIDのみを変更でき、別の実行中のプロセスのUIDとGIDは変更できないことに注意してください。