APUEから
プロセスの実際のユーザーIDと実際のグループIDは、私たちの真のアイデンティティを識別します。これら2つのフィールドは、ログイン時にパスワードファイルに作成したエントリから取得されます。通常、これらの値はログインセッション中に変更されませんが、いくつかの方法があります。 これを変更するスーパーユーザープロセス
スーパーユーザープロセスが実際のユーザーIDと実際のグループIDの間の関係がパスワードファイルの関係と一致しないように、プロセスの実際のユーザーIDと実際のグループIDを変更できますか?たとえば、ユーザーがパスワードファイルのグループメンバーTim
でない場合、ocean
スーパーユーザープロセスはプロセスの実際のユーザーIDと実際のグループIDをTim
に変更できますかocean
?
答え1
はい、スーパーユーザープロセスは実際のユーザーIDと実際のグループIDを希望の値に変更できます。/etc/passwd
との値は/etc/shadow
値を設定する必要がある設定ですが、可能な値の制限ではありません。
編集#1
つまり、このようなプログラムはlogin
ファイルから値を読み取るため、これらのファイルは構成ファイルまたは入力ファイルです。プログラムが実行できる操作を制限しません。スーパーユーザープロセスは任意の値をカーネルに渡すことができ、カーネルはどのファイルもチェックしません。
プログラムが呼び出すことができる
setgid (54321);
setuid (12345);
これら2つのIDがどの文書にも記載されていない場合でも機能します。
答え2
パスワードファイルとグループファイルは読み込まれず、実際のユーザーIDと実際のグループIDを設定するためにログインプロセスでのみ読み込まれます。
カーネルにはこれらのファイルは記載されていません。ログインはファイルを開いて処理した後、両方のIDを設定する必要があります。これらのIDは、異なる書き込み方式で他の場所から取得できます。たとえば、Webデータベースから。
CAP_SETUID機能を持つすべてのプロセスはこれらのIDを設定でき、ルートにはこの機能があります。
Unixのセキュリティモデルは、部分的にカーネルで実装され、部分的には拡張機能(ルートなど)で実行されるプロセスで実装されています。
ユーザー/グループ名をユーザー/グループIDに変換する必要がある他のプログラムから読み取ることもできます/etc/passwd
。/etc/group
(これらの詳細を保存する他の方法がわからない場合でも、ライブラリを介してこれを行うことができます。)ls
ps
答え3
その目的は、とりわけ/etc/passwd
ユーザーの名前ユーザーへユーザーID。 bobのUIDが何であるか興味がなければ、このファイルは必要ありません。 UID / GIDに変更するには、関連するシステムコールを使用してください。
int setuid(uid_t uid);
int setgid(gid_t gid);
CAP_SETUID
とCAP_SETGID
能力通常、ルートプロセスのルートプロセスは自分のUIDとGIDのみを変更でき、実行中の他のプロセスのUIDとGIDは変更できません。
答え4
私は最近これを行うためにLinuxカーネルモジュールを作成しました(https://github.com/xuancong84/chown-pid)。これまでこれを行うことができるユーザーレベルのプログラムはありません。
カーネルモジュールをビルドしてcd
プロジェクトフォルダに入れて実行する必要がありますmake
。成功すると生成されますchown-pid.ko
。
次に、
insmod chown-pid.ko arg_pid=<PID> arg_gid=<UID> arg_act='set_uid' && rmmod chown-pid
insmod chown-pid.ko arg_pid=<PID> arg_gid=<GID> arg_act='set_gid' && rmmod chown-pid