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

gra*_*ssy 6 filesystems permissions sudo passwd

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

user@apple:~$ ls -l /bin/passwd
-rwsr-xr-x 1 root root 59976 Nov 24  2022 /bin/passwd
Run Code Online (Sandbox Code Playgroud)

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

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

user@apple:~$ passwd test
passwd: You may not view or modify password information for test.
Run Code Online (Sandbox Code Playgroud)

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

roa*_*ima 16

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

\n

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

\n

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

\n

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

\n
static bool amroot;             /* The caller\'s real UID was 0 */\n\xe2\x80\xa6\n\n/*\n * The program behaves differently when executed by root than when\n * executed by a normal user.\n */\namroot = (getuid () == 0);\n\xe2\x80\xa6\n\n/*\n * If the UID of the user does not match the current real UID,\n * check if I\'m root.\n */\nif (!amroot && (pw->pw_uid != getuid ())) {\n    (void) fprintf (stderr, _("%s: You may not view or modify password information for %s.\\n"), Prog, name);\n    SYSLOG ((LOG_WARN, "%s: can\'t view or modify password information for %s", Prog, name));\n    closelog ();\n    exit (E_NOPERM);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 正如 @ChrisDavies 所指出的,“passwd”是“setuid”的原因并不是要赋予它完整的 root 权限 - 这是必需的,因为否则用户将无法更改自己的密码 - 原因是“/etc” /shadow` 只能由 `root` 访问。 (11认同)
  • @tink nobody — `/etc/shadow` 文件将可由组 `shadow` 写入。 (2认同)
  • @Barmar也许吧。但我理解 `/etc/shadow` 的要点是,与经典的 `/etc/passwd` 不同,它不是每个人都可读的,所以不是每个人都可以获取密码哈希值来破解它们。但如果只有 root 可以读取 `/etc/shadow`,那么只有 root 可以检查密码,这意味着如果代码中存在错误,每次密码检查都将有可能导致 root 泄露(因为每个此类程序都必须 setuid root)。因此,使用“影子”组允许选定的程序执行密码检查,同时对更改密码的权力进行更严格的监管是有意义的。 (2认同)

Jör*_*tag 7

能够更改其他用户的密码是一个巨大的安全漏洞,因此passwd除非您已经是root用户,否则为什么不允许这样做。

  • @grassy 说您“以 root 用户的权限”运行 passwd 有点误导。SUID位表示passwd拥有root用户的权限。但 passwd 也知道谁在实际运行它。它能够使用 root 权限,但当它由非 root 用户运行时,它会根据设计拒绝,因为非 root 用户不应该能够更改彼此的密码。passwd 设置 SUID 位的原因不是为了让任何用户能够更改任何密码;而是为了让任何用户能够更改任何密码。这是出于不相关的技术原因(如其他用户所述。) (7认同)
  • 那没有多大帮助。我已经使用“root”用户的权限运行“passwd”命令。那为什么我不能更改该用户的密码呢?这里还有其他事情在起作用吗? (3认同)
  • 这本来是一个有价值的评论,但并没有解决实际问题;您只是说明了它不起作用的原因,而不是说明了它不起作用的原因。 (3认同)
  • @grassy,如果您想问_“除非我使用`sudo`,否则`passwd`如何知道拒绝我”_,那么您可能应该问这个问题。 (3认同)
  • @tink:“你只是说明为什么它不工作的原因,而不是为什么它不工作”——这不是问题所问的。问题是:“为什么我应该使用 sudo 和 passwd 命令来更改另一个用户的密码?” (因为否则任何用户都可以冒充任何其他用户)和“当我尝试更改另一个用户的密码时为什么会这样说”(同样的原因)和“运行相同的命令,但使用 sudo 让我可以更改密码。这是为什么?” (root 是万能的,所以没有必要禁止它)。 (2认同)
  • @tink,那里指出,它不起作用,因为_“passwd不允许它,除非你已经是root”_。 (2认同)