web-dev-qa-db-ja.com

GID、現在、プライマリ、補足、有効、および実際のグループID?

次のリンクは、これらの概念をさまざまなコンテキストで説明しています。私はそれらの定義を読みましたが、それらがどのように関連しているか、またはそれらのいくつかがまったく同じであるかどうかはまだわかりません。

これが私の混乱の原因の1つの例です。

による - man ididと入力すると、effectiveおよびrealグループID。

id uid=501(joe) gid=501(joe) groups=501(joe), 100(users)

ただし、 Wikipediaidの出力を参照して、primary補足ID。さらに、ウィキペディアはprimarysupplementary実効vs実数グループID。これらの概念はどのように相互に関連していますか?

また、primarygroup ID =group ID=currentグループID?

22

ここでは2つの異なる区別を混ぜます。

  1. realeffectiveグループIDの間
  2. primarysupplementaryユーザーのグループ間

最初の違いは、プロセスの実行方法を示します。通常、コマンド/プログラムを実行すると、ユーザーの権限で実行されます。これには、ユーザーのプライマリグループと同じrealグループIDがあります。これは、別の特別なグループのメンバーとしていくつかのタスクを実行するために、プロセスによって変更できます。これを行うために、プログラムは実効グループIDを変更するsetgid関数を使用します。

2番目の区別はusersを指します。各ユーザーは自分のプライマリグループを持っています。ユーザーごとに1つだけあり、idコマンドの出力ではgidと呼ばれます。それとは別に、各ユーザーはいくつかの補足グループに属することができ、これらはid出力の最後にリストされます。

[編集]:

idのマンページがここでは誤解を招く可能性があることに同意します。それはおそらくそれがinfoドキュメントによって提供された説明の簡略版であるからです。より明確に表示するには、info coreutils "id invocation"を実行します(idマニュアルの最後で推奨されています)。

25
rozcietrzewiacz

カーネルビュー

概念的には、プロセスがメンバーであるグループの3つのセットがあります。各セットは、次のセットのサブセットです。

  1. このプロセスによって作成されたファイルが属するプロセスのデフォルトグループである単一のグループ。
  2. グループがファイルを開くための許可を必要とするときにチェックされるグループのセット。
  3. 追加の特権プロセスで実行されているプロセスが利用できるグループのセット。

歴史的な理由により、これらのセットはそれぞれ次のとおりです。

  1. 実効グループID (egid);
  2. 実効グループIDと 補足グループID ;
  3. 上記すべてに加えて 実際のグループID および 保存されたセットグループID

通常、プログラムには単一のユーザーIDがあります。実行可能ファイルに setuid モードビットが設定されている場合、プログラムには2つのユーザーIDがあります。その実効ユーザーIDは、ファイルのアクセス許可、ユーザーごとの制限に関係するもので、プロセスが次のように実行されているかどうかを判断しますルートなど。プロセスは、常に追加の特権を必要としない場合、または2人の非rootユーザーを切り替える必要がある場合、実効ユーザーIDと実際のユーザーIDを切り替えることができます。

同じメカニズムがグループにも存在します。グループの場合、システムの設計時に存在しなかった追加機能があります。プロセスは、任意の数のグループのメンバーになることができます。これらは補足グループIDです。

ユーザーデータベースビュー

ユーザーが認証されると、ユーザーのシェル(またはユーザーが要求したプログラム)を起動する直前に、ログインプロセスがそのユーザーに切り替わります。目的のユーザーに切り替える(およびroot権限を失う)直前に、ログインプロセスが目的のグループに切り替わります。

UNIXの初期のバージョンでは、プロセスは単一のグループにしか存在できませんでした。このグループは、ユーザーのプライマリグループIDであり、ユーザーデータベースに保存されます(通常は/etc/passwd)。このグループは、ログインプロセスによって起動されるシェルまたは他のプログラムの実際の有効なグループIDになります。

現在、プロセスは複数のグループに属することができるため、ユーザーも複数のグループに属することができます。グループデータベース(通常は/etc/group)には、各グループのユーザーのリストが含まれています。これらのグループは、ログインプロセスによって起動されたプログラムの補足グループIDになります。

他にも多くの優れた答えがありますが、私と同じようにまだ混乱している場合は、ここに別の方法があります。 私はこのものの学生であり、マスターではないことに注意してくださいので、この回答は進行中の作業であり、しっかりしたものとは見なされません答えは、少なくともまだです。この回答v0.2を検討してください。

グループは同時にシンプルで複雑です。

以下で使用されるIDのキー:

KEY  Full name --------  Description---------------------------------------------

 u   User                 uID = User  ID (a unique # associated with each user)
 g   Group                gID = Group ID (a unique # associated with each group)
                            While each /etc/passwd entry has one uID and one gID,
                            additional gIDs can be associated with a users via
                            /etc/group.


 L   Login          IDs - uID and gID produced from the Login process.  
                            ('L' is not exactly standard Linux terminology, but
                            useful for explanations below.)

 F   File           IDs - uID and gID retrieved from a file's ownership.
                            ('F' is not exactly standard Linux terminology, but
                            useful for explanations below.)


 R   Real           IDs - Who actually                      runs a process 
 E   Effective      IDs - Who spoofed via setuid or setgid, runs a process
 O   Original Eff.  IDs - Place to save the original Effective ID when changing 
                          it (e.g. temporarily downgrading it) so can later 
                          restore it.  Also called "Saved ID"; (but 'S' was not 
                          used for here to help avoid confusion with the 'S' in  
                          'SetUserID' & SetGroupID.)
 +   Supplimentary gIDs - Optional, additional groups (none or more) running 
                          this process which can be used to test for permissions.

ユーザーおよびグループID名:

Category          USER  GROUP  Notes  
----------------- ----  -----  -------------------------------------------  
 From login:      LuID  LgID   From /etc/passwd lookup

 From files:      FuID  FgID   Each file has these. Set by creator process.


 For each running process:

            Real  RuID  RgID   Actual   user starting the program
       Effective  EuID  EgID   Assigned user starting the program*
           Saved  OuID  OgID   Saves original effective ID.
   Supplementary        +gID1  (optional, additional groups)
                        +gID2     
                         ...  

プロセスがIDを取得する方法:

1)Loginはユーザー名を認証し、/etc/passwdからLuIDおよびLgIDを返します。

2)最初のプロセスはeffective = real = loginを設定します。

EuID=RuID=LuID 
EgID=RgID=LgID

3)フォークされた子は、RuIDEuIDRgID、およびEgIDを継承します(ただし、おそらく保存され、サポートされます)。

  • 実行する新しいプログラムのファイルにsuidビットが設定されている場合は、ファイルから有効に設定します。

    EuID = FuID

  • 実行する新しいプログラムのファイルにsgidビット(s)が設定されている場合は、ファイルから有効に設定します。

    EgID = FgID

注:基礎となるファイルシステムのsuidおよびnosuidマウントオプションも適用されます。

4a)suidを使用した場合EuIDを設定し、次にEuID一時的に変更できます(ルートからダウングレードするなど)が、最初に元の値がOuIDに保存されるため、必要に応じて後で復元できます。

4b)sgidを使用した場合EgIDを設定し、次にEgID一時的に変更できます(ルートからダウングレードするなど)が、最初に元の値がOgIDに保存されるため、必要に応じて後で復元できます。


ファイルを作成する場合:

File's new id's are set from effective id's: FuID=EuID and FgID=EgID
(Permissions are set from umask.)

読み取り用に開くには:

If FuID = EuID  and  user-read bit is set, or  
If FgID = EgID  and group-read bit is set, or  
If FgID = +gID1 and group-read bit is set, or  
If FgID = +gID2 and group-read bit is set, ...  
then allow reading.

書き込み用に開くには:

(Same as above but write bit set to allow writing.)

実行のために開くには:

(Same as above but execute bit set to allow execution.)

メッセージを送信する必要がある場合:

Use RuID and RgID.  (Not EuID or EgID). *(Not sure where I read this.)*

参考資料: man credentials

Extra:/ etc/groupファイルをきれいに印刷するためのユーティリティを次に示します。

cat /etc/group | sort -t: -k3n | awk  -F ':' \
  'BEGIN{printf "\n%-20s %-3s %-8s %s", \
           "Group name","pw", "Group ID ", "User list"}\
   BEGIN{printf "\n%-20s %-3s %-8s %s\n", \
           "----------","--", "---------", "---------"} \
        { printf "%-20s %-3s %8d %s\n", $1, $2, $3, $4 }'
1
Elliptical view