Linux 在哪里通过 gpasswd 命令跟踪谁是组管理员?

Linux 在哪里通过 gpasswd 命令跟踪谁是组管理员?

如果我使用命令修改组成员身份和管理员gpasswd并将用户添加为组管理员,Linux 将允许该用户执行 root 保留的任务。

前任。

[test1@centos ~]$ gpasswd -a test6 test
Adding user test6 to group test

如果我尝试与尚未添加为管理员的用户执行相同的任务,则不允许:

[test2@centos ~]$ gpasswd -a test7 test
gpasswd: Permission denied.

这必须在某个地方进行跟踪。该gpasswd命令设置了 SUID 位,但没有指示仅限于谁。

这是在哪里跟踪的?命令如何gpasswd知道谁被授予了提升的权限?

答案1

这是在哪里跟踪的? gpasswd 命令如何知道谁被授予了提升的权限?

它本身并不是真正的“跟踪”。 gpasswd具有用户有权以各种方式使用该命令的规则,并且这些规则/权限在每次运行该命令时都会进行测试。这些测试的结果不会被缓存或存储。

一般来说,要运行,gpasswd您必须是 root,或者您必须被定义为目标组的管理成员,或者您必须是第一的您所定位的群体的成员。


如果您想了解具体细节,我们可以检查gpasswd以下内容的来源和其他部分影子实用程序项目

根据gpasswd 的来源GitHub镜像),根据#ifdef SHADOWGRP和的结果#ifdef FIRST_MEMBER_IS_ADMIN,在函数中运行三个检查之一,以检查不使用或标志的check_perms调用(下面的评论是我的):gpasswd-A-M

/* Check 1 */
if (!amroot && !is_on_list (sg->sg_adm, myname)) {
        failure ();
}

/* Check 2 */
if (!amroot) {
        if (gr->gr_mem[0] == (char *) 0) {
            failure ();
        }

        if (strcmp (gr->gr_mem[0], myname) != 0) {
            failure ();
        }
}

/* Check 3 */
if (!amroot) {
        failure ();
}

amroot是一个布尔值,如果 root 用户调用了 则为 true gpasswd。它被定义为这里:

/* The UID of the caller */
static uid_t bywho;
/* Indicate if gpasswd was called by root */
#define amroot  (0 == bywho)

作为 root 将“通过”(跳过)检查 1、检查 2 和检查 3(amrootwill be true,这意味着!amrootwill be false,因此将跳过 if 语句)。

如果非 root 用户是目标组的管理成员,则他们可以通过检查 1。这是通过将目标组的管理成员 (sg->sg_adm) 列表和调用gpasswd(myname) 的用户的用户名传递给函数来测试的is_on_list,定义这里。如果调用用户在组管理员列表中,则is_on_list返回true,它会反转为false,从而允许用户通过检查 1。

非 root 用户可以通过检查 2(如果他们是他们试图改变的团体的第一个列出的成员。这是通过验证目标组中的第一个用户是否等于呼叫的用户来测试的gpasswd

非 root 用户无法通过检查 3。


注意:我提供的所有源链接都链接到源存储库中的“debian/4.2-3”标签。这是为了提供一致的参考。

相关内容