设置 sudo 密码与登录密码不同

设置 sudo 密码与登录密码不同

作为特权用户,我尝试将sudo密码设置为登录时使用的另一个密码。

我做了一些研究,但没有找到答案。sudo支持这样的配置吗?

如果您丢失了密码,您将失去一切。有人可以root使用相同的密码登录并提升自己。

sudo有一个选项要求输入root密码而不是调用的用户密码(rootpw),但共享root密码绝对不是一个选项,这就是我们设置的原因sudo

config 2FA过去做过,效果很好,但也达不到自动化的目的。例如,如果您想使用脚本在十几台服务器上执行特权命令expect,则添加2FA不允许您执行此操作。

sudo我发现的最接近的解决方案是仅允许 SSH 私钥并使用与(登录)密码不同的密钥设置密码。尽管如此,它还是不太舒服,因为在紧急情况下,你无法使用没有该密钥的电脑登录。

答案1

如果您想询问 root 密码,而不是用户密码,您可以在 中输入一些选项/etc/sudoersrootpw特别是会要求输入 root 密码。有runaspwtargetpw也有;有关详细信息,请参阅 sudoers(5) 联机帮助页。

除此之外,sudo 通过 PAM 进行身份验证(与其他所有操作一样)。 PAM 支持每个应用程序配置。 Sudo 的配置位于(至少在我的 Debian 系统上)/etc/pam.d/sudo,如下所示:

$ cat sudo 
#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive

换句话说,默认情况下,它会像系统上的其他所有内容一样进行身份验证。您可以更改该@include common-auth行,并让 PAM(以及 sudo)使用备用密码源。 common-auth 中未注释掉的行看起来像这样(默认情况下,如果您使用例如 LDAP,这将有所不同):

auth    [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so

您可以使用egpam_userdb.so代替pam_unix.so,并将备用密码存储在Berkeley DB 数据库中。

例子

我创建了目录/var/local/sudopass、所有者/组root:shadow、模式2750。在其中,我继续创建了一个密码数据库文件db5.1_load(这是 Debian Wheezy 上使用的 Berkeley DB 版本):

# umask 0027
# db5.1_load -h /var/local/sudopass -t hash -T passwd.db
安东尼
WMaEFvCFEFplI
^D

该哈希值是mkpasswd -m des使用密码“password”生成的。非常安全! (不幸的是,pam_userdb 似乎不支持比古老的crypt(3)哈希更好的东西)。

现在,编辑/etc/pam.d/sudo并删除该@include common-auth行,然后将其放置到位:

auth    [success=1 default=ignore]      pam_userdb.so crypt=crypt db=/var/local/sudopass/passwd
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so

请注意,pam_userdb 会.db向传递的数据库添加扩展名,因此您必须将其关闭.db

根据丹尼绍尔一条评论/etc/pam.d/sudo-i,您可能也需要进行相同的编辑。

现在,对于 sudo,我必须使用password而不是我的真实登录密码:

安东尼@sudotest:~$ sudo -K
anthony@sudotest:~$ sudo echo -e '\nit 工作'
[sudo] 安东尼的密码:passwordRETURN

有效

答案2

对于Redhat/Centos,可以通过以下步骤实现该要求:

创建自定义用户并传递:

# db_load -t hash -T /usr/local/etc/passwd.db
user
pass
^d

编辑 sudo pam.d 文件,使其看起来像:

$ cat /etc/pam.d/sudo

auth            required        pam_userdb.so db=/usr/local/etc/passwd
account         required        pam_userdb.so db=/usr/local/etc/passwd
password        include         system-auth

session         optional        pam_keyinit.so revoke
session         required        pam_limits.so

我仍在寻找配置方法,以便只有某个用户/组必须通过此自定义方法进行身份验证,其他用户/组仍然可以通过正常的系统身份验证方法进行身份验证。有人能给我一些建议吗?

答案3

我认为 sudo 不支持这样的设置。 sudo 密码提示的目的是确保发出 sudo 命令的人与登录的人是同一个人,最简单的方法是要求当前登录的用户重新进行身份验证。

换句话说,sudo密码提示的目的是不是建立权威,就是要建立身份。根据已建立的身份和 sudo 配置,可以决定相关用户是否具有必要的权限或访问权限。

答案4

我无法立即访问可以测试它并计算出细节的系统,但我有一个想法:

  • (假设您的正常登录账号是shau。)
  • 创建第二个帐户:shau2。 (我不确定您是否希望它具有与 相同的 UID shau。)
  • 使用 NOPASSWD配置shau2为具有 sudo 权限。
  • 设置别名或 shell 脚本来执行操作su shau2 -c sudo "$@"。这应该要求输入shau2密码。如果输入正确,它将运行sudoshau2 不要求输入密码)。
  • 删除shau的 sudo 权限。

不幸的是,您必须为每个拥有 sudo 权限的用户重复此操作。

相关内容