进程的“有效用户/组 ID”是操作系统用来确定进程是否允许某个操作(例如打开文件)的内容。您可以使用以下命令设置当前进程的有效主GIDsetegid
,它只能由超级用户(或者如果有能力的话)用来暂时降低权限。
补充 GID 是附加组,也用于检查进程是否允许某个操作。例如,如果文件位于目录结构下/A/B/C/file.txt
,并且目录A
、B
、 和分别C
对其所有者锁定了读访问权groupA
,groupB
则groupC
进程将需要其补充组或有效 GID 中的所有 3 个组。
有一个setgroups
syscall 类似于setgid
,这意味着它永久地改变进程的环境。是否不需要补充组(即setegroups
)的“有效”系统调用?
答案1
这样的系统调用不存在,因为补充组可以被认为是它们本身有效的组。
真实和有效的 UID 和 GID 之间的区别是为了允许进程放弃权限,但也允许用户提高调用某些进程的权限(通过 setuid/setgid 文件系统位)。在这两种情况下,我们都希望跟踪具有提升/降低权限的进程背后的用户的真实 UID 和 GID(有效 UID 和 GID)。
补充组不需要这种差异,因为它们可以轻松地从groups
文件中恢复。
请注意,当加注或放弃特权,应用程序通常会调用initgroups
重置组以匹配新用户的有效 uid 和 gid(从而失去对先前可能存在的任何其他补充组的访问权限)。
从另一个来源:
“setgroups 的唯一用途通常来自 initgroups 函数,该函数使用 getgrent、setgrent 和 endgrent 函数读取整个组文件(我们之前描述过),并确定用户名的组成员身份。然后它调用 setgroups 来初始化补充组用户的 ID 列表。必须是超级用户才能调用 initgroups,因为它调用 setgroups。