每个进程有三个用户ID:
- 真实用户ID (
ruid
)。 - 有效用户ID (
euid
)。 - 已保存的用户 ID (
suid
)。
同样,一个进程也有三个组ID:
- 真实组ID (
rgid
)。 - 有效组ID (
egid
)。 - 已保存的组 ID (
sgid
)。
根据我的理解,euid
在访问文件时使用 来将其与文件的所有者进行匹配。
但我不确定egid
.egid
访问文件时是否也使用 来将其与文件的组相匹配?如果是这样,那么每个进程不应该有许多有效的组ID,因为每个用户可以属于许多组?
答案1
有一个egid
。然而!至少在 BSDlandia 中(并被 Linux 复制;不确定 SysV 在这里做什么)有setgroups(2)
称呼
DESCRIPTION
setgroups() sets the group access list of the current user process
according to the array gidset. The parameter ngroups indicates the
number of entries in the array and must be no more than {NGROUPS_MAX}.
Only the superuser may set new groups.
并getgroups(2)
检索该列表。
一些程序值得注意降低补充组列表,例如httpd
OpenBSD 上的src/usr.sbin/httpd/proc.c
if (setgroups(1, &pw->pw_gid) ||
setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) ||
setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid))
fatal("%s: cannot drop privileges", __func__);
如果您预计会有这些补充小组,这可能会令人惊讶。
NGROUPS_MAX
是另一个有趣的限制,特别是涉及 NFS 和许多组中的人员,尽管现在有一些方法可以解决这个问题(除了不将用户添加到超过典型的 16 个组的旧方法之外)。