他のユーザーのパスワードを変更するために「sudo」および「passwd」コマンドを使用するのはなぜですか?

他のユーザーのパスワードを変更するために「sudo」および「passwd」コマンドを使用するのはなぜですか?

コマンドの権限セットを表示すると、passwd次のようになります。

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

/bin/passwdSUID ビットがセットされ、所有者は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コードが実行されます。しかし、実行するとrootbobalicesudo passwd bobsudoコマンドは引数を次のように実行するためrootaliceこのpasswdアプリを使用すると、他人のパスワードを変更できます。

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既にルートでない限り許可しないことをお勧めします。

関連情報