为什么我应该使用“sudo”和“passwd”命令来更改另一个用户的密码?

为什么我应该使用“sudo”和“passwd”命令来更改另一个用户的密码?

如果您查看passwd命令的权限集,您将看到以下内容:

user@apple:~$ ls -l /bin/passwd
-rwsr-xr-x 1 root root 59976 Nov 24  2022 /bin/passwd

/bin/passwd已设置 SUID 位且其所有者是root用户。这意味着运行该命令passwd将以用户的权限运行该命令root

鉴于passwd已经拥有root用户权限,为什么当我尝试更改另一个用户的密码时会这样说test

user@apple:~$ passwd test
passwd: You may not view or modify password information for test.

运行相同的命令,但使用sudo,让我可以更改密码。这是为什么?

答案1

在此特定实现中,该passwd命令需要以root用户身份运行才能更改任何人的密码。

passwd应用程序有一段代码可以检查您是否是该root用户,如果不是,则它拒绝让您更改其他任何人的密码。如果您是root,那么您可以更改任何人的密码。

例如,如果您以 登录alice,然后运行passwd bob,尽管代码将运行,因为root它将拒绝让您更改bob的密码。但是,如果alice运行sudo passwd bob因为该sudo命令将其参数运行为rootalicepasswd应用程序将允许您更改任何人的密码,而不是 as 。

来自 的行src/passwd.c,通过以下方式获得(在 Debian 上)apt source passwd

static bool amroot;             /* The caller's real UID was 0 */

/*
 * The program behaves differently when executed by root than when
 * executed by a normal user.
 */
amroot = (getuid () == 0);

/*
 * If the UID of the user does not match the current real UID,
 * check if I'm root.
 */
if (!amroot && (pw->pw_uid != getuid ())) {
    (void) fprintf (stderr, _("%s: You may not view or modify password information for %s.\n"), Prog, name);
    SYSLOG ((LOG_WARN, "%s: can't view or modify password information for %s", Prog, name));
    closelog ();
    exit (E_NOPERM);
}

答案2

能够更改其他用户的密码是大量的安全漏洞,因此为什么passwd不允许它,除非你已经是 root 了。

相关内容