作为特权用户,我尝试将sudo
密码设置为登录时使用的另一个密码。
我做了一些研究,但没有找到答案。sudo
支持这样的配置吗?
如果您丢失了密码,您将失去一切。有人可以root
使用相同的密码登录并提升自己。
sudo
有一个选项要求输入root
密码而不是调用的用户密码(rootpw
),但共享root
密码绝对不是一个选项,这就是我们设置的原因sudo
。
我config 2FA
过去做过,效果很好,但也达不到自动化的目的。例如,如果您想使用脚本在十几台服务器上执行特权命令expect
,则添加2FA
不允许您执行此操作。
sudo
我发现的最接近的解决方案是仅允许 SSH 私钥并使用与(登录)密码不同的密钥设置密码。尽管如此,它还是不太舒服,因为在紧急情况下,你无法使用没有该密钥的电脑登录。
答案1
如果您想询问 root 密码,而不是用户密码,您可以在 中输入一些选项/etc/sudoers
。rootpw
特别是会要求输入 root 密码。有runaspw
,targetpw
也有;有关详细信息,请参阅 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
。 (我不确定您是否希望它具有与 相同的 UIDshau
。) - 使用 NOPASSWD配置
shau2
为具有 sudo 权限。 - 设置别名或 shell 脚本来执行操作
su shau2 -c sudo "$@"
。这应该要求输入shau2
密码。如果输入正确,它将运行sudo
(shau2
不要求输入密码)。 - 删除
shau
的 sudo 权限。
不幸的是,您必须为每个拥有 sudo 权限的用户重复此操作。