GID,当前,主要,补充,有效和真实组ID?


22

以下链接在不同的上下文中讨论了这些概念。我已经阅读了它们的定义,但是我仍然无法说出它们之间的关系,或者它们中的某些是否相同。

这是我困惑的一个例子:

根据man id,如果输入id,我应该得到他们所谓的有效真实的组ID。

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

但是,Wikipedia引用的输出id来区分主要 ID 和补充 ID。此外,维基百科区分主要组ID 和补充组ID ,还是有效组ID 与实际组ID。这些概念如何相互关联?

另外,主要组ID = 组ID = 当前组ID是否正确?


问题尚不清楚:您提供的链接会提供很多信息。那你不明白吗?
psusi 2011年

Answers:


24

您在这里混合了两种不同的区别:

  1. 真实有效的组ID之间
  2. 主要补充用户组之间

第一个区别是指流程的运行方式。通常,当您运行命令/程序时,将以您的用户权限运行。它的真实组ID与用户的主要组相同。可以通过一个过程来更改它,以便以另一个特殊组的成员的身份执行某些任务。为此,程序使用setgid更改其有效组ID的功能。

第二种区别是指用户。每个用户都有其主要组。每个用户只有一个,称为gid,在id命令输出中。除此之外,每个用户都可以属于多个补充组 -这些补充组id输出末尾列出。

[编辑]:

我同意id此处的手册页有些误导。可能是因为它是信息文档提供的描述的简化版本。要更清楚地看到它,请运行info coreutils "id invocation"(按照id手册结尾处的建议)。


谢谢@rozcietrzewiacz。那很有帮助。然后可以假定当前组ID = 主要组吗?
阿梅利奥·瓦兹克斯·雷纳

1
一般来说,没有。可以使用newgrp命令更改当前的“真实”组-请在第一个链接中查看手册的第二段!
rozcietrzewiacz 2011年

18

内核视图

从概念上讲,流程是三组成员。每个集合是以下集合的子集。

  1. 单个组是该进程的默认组,该进程创建的文件将属于该组。
  2. 当组需要权限才能打开文件时,将检查的一组组。
  3. 具有额外特权的进程运行的进程可以借鉴的一组组。

由于历史原因,这些集合分别是:

  1. 有效组ID(EGID);
  2. 有效组ID加上补充组ID ;
  3. 以上所有内容以及真实组ID保存的set-group-ID

通常,程序只有一个用户ID。如果可执行文件具有setuid模式位已设置,则该程序具有两个用户ID:其有效用户ID与文件许可权,每个用户的限制,确定进程是否以root用户身份运行等等有关。如果该进程不需要一直拥有额外的特权,或者需要在两个非root用户之间进行切换,则可以在有效用户ID和真实用户ID之间进行切换。

分组存在相同的机制。对于组,设计系统时不存在其他功能:流程可以是任意数量的组的成员;这些是补充组ID。

用户数据库视图

用户通过身份验证后,登录过程将在启动用户的外壳程序(或用户请求的任何程序)之前切换到该用户。就在切换到所需的用户(并失去root特权)之前,登录过程将切换到所需的组。

在早期的unix版本中,一个进程只能在一个组中。该组是用户的主要组ID,存储在用户数据库中(通常为/etc/passwd)。该组成为登录过程启动的shell或其他程序的真实有效组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)登录名对用户名进行身份验证,LuID然后LgID从返回/etc/passwd

2)第一个过程设置有效=真实=登录,即

EuID=RuID=LuID 
EgID=RgID=LgID

3)分叉子女继承RuIDEuIDRgID,和EgID,(可能是保存与供应),然而,

  • 如果在要执行的新程序的文件上设置了s u id位,则从文件将其设置为有效:

    EuID = FuID

  • 如果在要执行的新程序的文件上设置了s g id位,则从文件将其设置为有效:

    EgID = FgID

注意:基础文件系统的suidnosuid挂载选项也适用。

4a)如果使用s u id进行设置EuID,则EuID可以临时更改(例如,从根目录降级),但是首先将其原始值保存在其中,OuID以便以后可以根据需要恢复。

4b)如果使用s g id进行设置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.)*

参考文献:人证书

附加:这是一个用于漂亮打印/ 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 }'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.