プロセスGIDとは何ですか?どのような用途に使用されますか?

プロセスGIDとは何ですか?どのような用途に使用されますか?

mod_wsgiに関するドキュメントを読みながら、ワーカープロセスが実行されるグループを選択できることがわかりました。

ファイルのグループ所有権とそのグループに属するユーザーだけがそのファイルに対するグループ権限を取得する方法を理解できますが、これが実行中のプロセスにどのように適用されるかはわかりません。

それでは、プロセスGIDとは何ですか?どのような用途に使用されますか?

答え1

これは実際にはUnixプロセスのコンポーネントによって異なります。プロセスは2つの方法のうちの1つで構成できます。この関数またはCの関数fork()のいずれかを介して。exec()

fork()

fork()デフォルトでは、現在のプロセスを複製し、新しいプロセスID(PID)を割り当てます。元のプロセスの子プロセスです。次の出力でこの関係を見ることができますps

$ ps axjf
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1  5255  1964  1964 ?           -1 Sl     500   0:39 gnome-terminal
 5255  5259  1964  1964 ?           -1 S      500   0:00  \_ gnome-pty-helper
 5255 18422 18422 18422 pts/1    18422 Ss+    500   0:01  \_ bash
 5255 30473 30473 30473 pts/4    30473 Ss+    500   0:00  \_ bash
30473   782   782 30473 pts/4    30473 Sl     500   1:14  |   \_ evince s.pdf

gnome-terminalここでは、これが親プロセス(PID = 5255)であり、子bashプロセス(PID = 18422、PPID = 5255)であることがわかります。

メモ:PPID=親プロセスID。

プロセスが親プロセスから分岐すると、親プロセスが現在持っている開いているファイルのすべてのファイル記述子のコピー、および親プロセスのユーザーとグループIDなどの特定の項目が「継承」されます。

メモ:最後の2つは、ファイルシステムにアクセスするときにプロセスが持つファイルとグループの権限を決定することです。

もしそうなら、プロセスが親プロセスからユーザーとグループIDを継承する場合、rootまたは単一のユーザーがすべてを所有していないのはなぜですか?これが入ってくるところですexec()

exec()パート1

特に、このexec()機能シリーズは、execve()現在のプロセスイメージを新しいプロセスイメージに「置き換え」ます。 「プロセスイメージ」という用語は、実際にはディスクの実行可能ファイルであるファイルにすぎません。これがbashスクリプトがすることです/usr/bin/time

ユーザーIDとグループIDはどうですか?まず、「ペルソナ」の概念を見てみましょう。

ペルソナ

いつでも、各プロセスには有効ユーザーID、有効グループID、および補足グループIDのセットがあります。これらのIDはプロセスの権限を決定します。これらを通称してプロセスの役割これは、「誰」がアクセス制御の目的であるかを判断するためです。

exec()パート2

したがって、「プロセスイメージ」を置き換えることができるだけでなく、exec()ユーザーとグループIDを元の「実際の」IDから「有効な」IDに変更することもできます。

一例

このデモでは、デフォルトのUID / GIDを使用してシェルから起動し、補足GIDの1つを使用してサブシェルを作成して、サブシェルに有効なGIDを作成したときに何が起こるかを説明します。

このために私はUnixコマンドを使用しますnewgrpnewgrp新しいシェルを作成し、それを有効なGIDとして必要な補助グループに渡すことができます。

初心者の場合:

$ id -a
uid=500(saml) gid=501(saml) groups=501(saml),502(vboxusers),503(jupiter)

このシェルが現在デフォルトのUID / GID saml&で構成されていることがわかりますsaml。一部のファイルに触れると、次のような場合があります。

$ touch afile1
$ touch afile2
$ ls -l
total 0
-rw-rw-r-- 1 saml saml 0 May 21 23:47 afile1
-rw-rw-r-- 1 saml saml 0 May 21 23:47 afile2

jupiterこれで、補足グループを有効なGIDにします。

$ newgrp jupiter
$ id -a
uid=500(saml) gid=503(jupiter) groups=501(saml),502(vboxusers),503(jupiter)

今、いくつかのファイルをタッチすると、次のようになります。

$ touch afile3
$ touch afile4
$ ls -l
total 0
-rw-rw-r-- 1 saml saml    0 May 21 23:47 afile1
-rw-rw-r-- 1 saml saml    0 May 21 23:47 afile2
-rw-r--r-- 1 saml jupiter 0 May 21 23:49 afile3
-rw-r--r-- 1 saml jupiter 0 May 21 23:49 afile4

シェルの有効なGIDはjupiterそのため、ディスクとのやり取りによってjupiter通常の基本グループの代わりにファイルが作成されますsaml

引用する

答え2

ユーザーはファイルにアクセスしません。入力して移動してマウスをクリックするだけです。プロセスのみがファイルにアクセスできます。ユーザーはプロセスを開始し、プロセスはユーザー(プライマリグループとセカンダリグループを含む)に関連する権限を持ちます。

答え3

プロセスの権限は、プロセスの属性に基づいています。これは/etc/passwd合計項目に直接基づいていません/etc/group。このファイルは、ユーザーがログインしている場合にのみ読み取られ、セッション初期化プロセスが実行されるuidとgidを決定します。同じセッションの後続のプロセス(この初期プロセスのサブプロセス、または通常はサブプロセス)は、これらのuidとgidを継承します(例外setuid/setgidプログラム)。

ほとんどの場合、プロセスのGIDは、プロセスがアクセスできるファイルを決定します。プロセスのuidがファイルの所有者である場合、所有者権限が適用されます。それ以外の場合は、プロセスのgid(有効または補足)の1つがファイルのグループ所有者である場合はグループ権限が適用され、そうでない場合は「その他」権限が適用されます。

関連情報