通过我构建的分析程序,我遇到了一个错误,其中用户将主要组设置为此后删除的组(不再位于 /etc/group 文件中)。为了确定影响范围,我进行了一些测试,并遇到了一些奇怪的行为:
- 即使组被删除,如果它是用户的主要组,并且 sudoers 文件中存在与其 ID 关联的权限,则用户仍将获得这些权限。
- 如果之后创建组,则它可能会获得与之前删除的组相同的组 ID,并且用户的主 ID 将成为该组。
看起来,对于 sudoers 中的权限检查,/etc/group 文件和用户的主要组都是单独搜索的,因此主要组不必是实际的组?
问题: 它是否正确?我缺少什么?我不确定为什么客户端删除了主要组,但这似乎不对。
设备规格:
Linux Ubuntu 20.04.1
5.13.0-1017-天蓝色 x86_64
重现步骤:
创建新用户:
sudo useradd testuser
这创建了用户和具有相同名称的单独新组,该组成为其主要组。检查新用户组:
groups testuser
结果:'testuser : testuser'通过命令删除新组:
sudo groupdel testuser
收到以下错误消息:groupdel:无法删除用户“testuser”的主要组通过手动文件调整删除新组:
sudo nano /etc/group
这确实有效,因为我可以简单地删除相关组的最后一行并保存文件再次检查新用户的组:
groups testuser
结果:“testuser:组:找不到组 ID 1003 1003 的名称”尝试以新用户登录,删除组成功后仍然可以登录
尝试使用新用户执行 sudo 命令按预期失败:'testuser 不在 sudoers 文件中。此事件将被报告”
以特权帐户重新登录(具有 sudo 权限)
在 sudoers 文件中为步骤 4 中删除的组名赋予 sudoer 权限:
sudo nano /etc/sudoers
然后将其添加到文件中:%testuser ALL=(ALL:ALL) ALL
以新用户身份登录并再次执行 sudo 命令仍然失败:'testuser 不在 sudoers 文件中。此事件将被报告”
在 sudoers 文件中为步骤 4 中删除的组 ID 赋予 sudoer 权限:
sudo nano /etc/sudoers
然后将其添加到文件中:%#1003 ALL=(ALL:ALL) ALL
以新用户身份登录并再次执行 sudo 命令成功,用户现在拥有 SUDO 权限(我真的希望情况并非如此)
创建新组:
sudo groupadd testforid
使用 ID 1003 创建新组再次检查新用户组:
groups testuser
结果:'testuser : testforid'
答案1
是的,“删除”的组仍然作为主要组使用;事实上,从未创建过的团体作为主要团体工作。
这是因为对于用户和组来说最终最重要的是他们的标识符。用户与其主要组之间的映射,例如在 中/etc/passwd
,关联标识符。在您的示例中,testuser
分配了主要组 1003;该组是否有名称(在/etc/group
您的情况下)是无关紧要的。当您授予组 1003sudo
权限时,testuser
这些权限是通过该组授予的。
用户名和标识符遵循相同的规则:最终重要的是用户标识符。给定用户拥有的文件通过标识符(而不是名称)与该用户绑定,并且当用户被删除时,该关联仍然存在。还可以使用系统上没有匹配用户的用户标识符创建文件。
多个用户名和组名也可以分别与同一个用户和组id关联;映射不要求是双射的。因此,权限等可以根据用户/组标识符来定义,并且这些标识符可以具有0个或多个与其关联的名称。