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


22

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

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

によるとman id、私がタイプした場合id、私は彼らが呼んでいる有効実際のグループID を取得する必要があります。

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

ただし、Wikipediaidプライマリ ID と補足 ID を区別するための出力を指します。また、ウィキペディアは区別し、主補足効果的な実際のグループID。これらの概念は互いにどのように関連していますか?

また、プライマリグループID = グループID = 現在のグループID というのは本当ですか?


質問は明確ではありません:あなたが提供するリンクは多くの情報を提供します。それはどうですか?
-psusi

回答:


24

ここでは、2つの異なる区別を組み合わせます。

  1. 実際のグループID と有効なグループIDの間
  2. 間のおよび補助的なユーザーのグループ

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

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

[編集]:

idここのマンページがやや誤解を招くことに同意します。これはおそらく、情報ドキュメントによって提供される説明の簡略化されたバージョンであるためです。より明確に表示するには、info coreutils "id invocation"idマニュアルの最後で提案されているように)実行します。


ありがとう@rozcietrzewiacz。それはとても役に立ちました。次に、現在のグループID = プライマリグループと仮定できますか?
アメリオバスケスレイナ

1
一般的に、いいえ。現在の「実際の」グループは、newgrpコマンドを使用して変更できます-最初のリンクのマニュアルの2番目の段落を参照してください!
rozcietrzewiacz

18

カーネルビュー

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

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

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

  1. 実効グループID(EGID)。
  2. 実効グループIDと補足グループID
  3. 上記のすべてに加えて、実際のグループIDおよび保存されたset-group-ID

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

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

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

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

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

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


ありがとう。あなたの返事を理解するためにいくつか質問があります。unix.stackexchange.com/questions/466742/…–
ティム

1

ここには他の多くの優れた答えがありますが、私がまだ混乱している場合は、別のアプローチがあります。 私はこのものの学生であり、マスターはないことに注意してください。したがって、この答えは進行中の作業であり、少なくともまだまだ堅実な答えとは見なされません。この回答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)ログインはユーザー名を認証しLuIDLgIDからを返します/etc/passwd

2)最初のプロセスは、effective = real = login、つまり

EuID=RuID=LuID 
EgID=RgID=LgID

3)フォーク状の子供たちが継承しRuIDEuIDRgID、とEgID、しかし、)、(&おそらく保存&サップ

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

    EuID = FuID

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

    EgID = FgID

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

4a)s u idが set に使用されたEuID場合、EuID一時的に変更(たとえばルートからダウングレード)できますが、最初に元の値が保存されるOuIDため、必要に応じて後で復元できます。

4b)s g idが set に使用された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.)*

参照:男性の資格情報

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 }'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.