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

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

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

这是我困惑的根源的一个例子:

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

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

然而,维基百科指的是输出来id区分基本的补充身份证。此外,维基百科还区分了基本的补充有效的真实的组 ID。这些概念如何相互关联?

另外,这是真的吗?基本的群组 ID =组ID=当前的组ID?

答案1

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

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

第一个区别是指进程如何运行。通常,当您运行命令/程序时,它会以您的用户的权限运行。它有真实的组 ID 与您用户的主要组相同。这可以由进程更改,以便作为另一个特殊组的成员执行某些任务。为此,程序使用setgid改变它们的函数有效的组 ID。

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

[编辑] :

我同意id这里的联机帮助页有些误导。这可能是因为它是信息文档提供的描述的精简版本。为了更清楚地看到它,请运行info coreutils "id invocation"(按照手册末尾的建议id)。

答案2

内核视图

从概念上讲,进程属于三组组。每组都是下一组的子集。

  1. 作为进程默认组的单个组,该进程创建的文件将属于该组。
  2. 当组需要打开文件的权限时检查的一组组。
  3. 以额外权限运行的进程可以利用的一组组。

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

  1. 有效组ID(如);
  2. 有效组 ID 加上补充组 ID;
  3. 以上所有加上真实组ID已保存的集合组 ID

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

团体也存在同样的机制。对于组来说,还有一个在系统设计时不存在的附加功能:一个进程可以是任意数量的组的成员;这些是补充组 ID。

用户数据库视图

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

在早期的 UNIX 版本中,一个进程只能位于一个组中。该组是用户的主要组 ID,存储在用户数据库中(通常为/etc/passwd)。该组成为登录进程启动的shell或其他程序真实有效的组ID。

如今,一个进程可以属于多个组,因此用户也可以属于多个组。组数据库(通常/etc/group)包含每个组的用户列表。这些组成为登录过程启动的程序的补充组 ID。

答案3

这里有许多其他优秀的答案,但如果您仍然像我一样感到困惑,这里有另一种方法。 请注意,我只是这个东西的学生,不是大师,所以这个答案是一个正在进行的工作,并且不被认为是一个可靠的答案,至少现在还不是。考虑这个答案 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)登录验证用户名并返回LuIDLgIDfrom /etc/passwd

2)第一道工序设置 effective=real=login,即

EuID=RuID=LuID 
EgID=RgID=LgID

3)分叉的孩子继承RuID, EuID, RgID, 和EgID, (&可能保存&支持),但是,

  • 如果在要执行的新程序的文件上设置 id 位,然后从文件中设置有效:

    EuID=FuID

  • 如果G在要执行的新程序的文件上设置 id 位,然后从文件中设置有效:

    EgID=FgID

注意:底层文件系统的苏伊德诺苏伊德安装选项也适用。

4a)如果是id已被使用设置EuID,然后EuID可以临时更改(例如从根降级),但首先保存其原始值,OuID以便以后可以在需要时恢复。

4b)如果是Gid已被使用设置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 }'

相关内容