newgrp 和通过 pam_group.so 分配的组

newgrp 和通过 pam_group.so 分配的组

出于方便原因,我倾向于通过 /etc/security/group.conf (pam_group.so) 机制分配特殊的组成员身份,如软盘、音频、plugdev、视频等,而不是将所有用户添加到目录服务器上的该组中。

这对于设备访问来说效果很好,但是当外部程序尝试通过 getgrent 检查特定组的用户成员身份时,它往往会引起麻烦。

现在我尝试 newgrp 到这个组之一,并认识到这是不可能的(系统是 Debian squeeze)。这是 newgrp 中的错误还是只是我网站上的配置问题?

newgrp 在 Unix API 端实际上做了什么?看起来 setgid 是一个仅限 root 的系统调用。我本以为如果特定用户是 setgit 目标组的成员,那么也将被允许。

我实际上偶然发现了这个问题,因为 mount.davfs 不断告诉我我不是 davfs2 组的成员,这当然是事实,但这也是 pam_group.so 分配的组。

答案1

newgrp只允许您访问您已经有权访问的组。听起来没什么用?基本上,是的。这主要是一个进程不能成为多个组的成员的时代遗留下来的。您还可以访问受密码保护的组,但这极不常用。

从内核的角度来看,每个进程都属于一个或多个组。setgid只能在以 root 身份运行或在 setgid 程序中使用(在真实(运行)组和有效(运行为)组之间交换)。内核不知道用户和组数据库。

用户和组数据库(/etc/passwd/etc/group/etc/security/group.conf、 LDAP 等)由 和其他管理登录和权限提升的程序(通常通过 PAM)进行login管理su。当您登录时,您将被分配到/etc/passwd/etc/group和其他文件中列出的组pam_groups;该过程如下所示:

gid_t groups[…] = /*extra GIDs computed from /etc/group and so on*/;
setgroups(sizeof(groups)/sizeof(gid_t), groups);
setgid(gid); /*main GID read from /etc/passwd*/
setuid(uid);
execve(shell, "-sh"); /*shell read from /etc/passwd*/

换句话说:放弃 root 权限(即更改为目标用户)是在所有其他权限管理之后、调用用户的 shell 之前完成的。当进程不再以 root 身份运行后,它就无法获得任何额外的组。

如果您刚刚将用户添加到组中,这将在用户下次登录时生效。如果您通过登录另一个终端或通过 ssh 启动另一个会话,则该会话中的进程将具有您的用户的任何组您登录时所在的组。您可以使用groupsid命令查看您(即您从中启动的特定进程groups)所属的组。

所以,我已经回答了你明确的问题(newgrp正在做它的工作,这不是你所想的)。我可能解决了你的问题,也可能没有解决你的问题。对于不让您登录来查找用户和组数据库的应用程序来说,这是不寻常的。通常,访问权限是通过检查请求进程是否是相关组的成员来决定的。如果您对某个特定应用程序有疑问,请告诉我们。

答案2

原因新组在您的情况下无法更改组,因为它使用 格特伦特确定您是否是所请求团体的成员;请参阅源文件find_matching_group中的函数 newgrp.c

为什么新组需要进行此项检查吗?因为进程所属的组集(所谓的“组向量”)是一个任意列表:内核不知道/etc/group或任何其他组数据库,并且 集合组可以采用任意组列表。因此,决定哪些组应该位于进程的组向量中是一个问题政策:[newgrp] 和大多数其他用户空间工具实施的策略是通过读取组向量格特伦特。 (吉尔斯的回答提供了这方面的详细信息。)

另一方面,pam_组实现不同的策略:它可以用用户不属于的组来扩充组向量(根据/etc/groupLDAP)。

因此,最终存在两种不同的政策,并且mount.davfs2会抱怨,因为它假设只有第一个政策有效。您可能可以将此报告为针对 的错误mount.davfs2,或者只需将所有 DAV 用户添加到 LDAP 或 中的相应组/etc/group,或者使用基于 FUSE 的 DAV 文件系统反而。

相关内容