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


29

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

我已经进行了一些研究,但没有找到答案。是否sudo支持这种配置?

如果您丢失了密码,则将丢失所有内容。有人可以登录并root使用相同的密码升级为自己。

sudo可以选择询问root密码而不是调用用户密码(rootpw),但是root绝对不可以选择共享密码,这就是我们进行设置的原因sudo

config 2FA过去做过,效果很好,但也违反了自动化的目的。例如,如果要使用expect脚本在十几台服务器上执行特权命令,则添加2FA不允许这样做。

我找到的最接近的解决方案是仅允许SSH私钥和设置密码短语的密钥不同于sudo(登录)密码。尽管如此,它还是不舒服,因为在紧急情况下,您无法在没有该密钥的PC上登录。


1
您为什么需要这个呢?也许问题出在别的地方。具有特权帐户登录系统并具有“ NOPASSWD”的双重身份验证会更好,这样sudo不会要求输入密码吗?然后,您当然应该拥有一个单独的紧急本地帐户,该帐户具有强密码,以便能够在网络中断(无ssh访问)时登录。
jirib

Answers:


30

如果您想要输入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

您可以使用例如pam_userdb.so而不是pam_unix.so,并将您的备用密码存储在Berkeley DB数据库中。

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

#umask 0027
#db5.1_load -h / var / local / sudopass -t哈希-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

dannysauer评论,你可能需要作出同样的编辑/etc/pam.d/sudo-i为好。

现在,要使用sudo,我必须使用password真实的登录密码代替:

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

有效

确保还配置“ sudo-i”,较新版本的sudo经常用于“ sudo -i”(如果供应商未做任何更改)。
dannysauer

您能详细说明一下PAM配置吗?
2013年

@ShâuShắc我添加了一个示例,包括PAM配置更改。
derobert

谢谢。但是我在Redhat / centos或源代码中的任何地方都找不到db51-utils,它仅在Debian变体中可用吗?
2013年

3
crypt(3)现代版本的glibc上的“古代哈希”支持sha-512。mkpasswd -m sha-512。pam_userdb.so可以很好地处理这些问题。
Andrew Domaszek '17

6

对于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

我仍在寻找配置方式,以便仅某个特定用户/组必须通过此自定义方法进行身份验证,而其他用户/组仍可以通过常规的system-auth方法进行身份验证。谁能给我一些建议?


您应该能够使用PAM中的完整操作语法来执行此操作。例如,[user_unknown=ignore,success=ok,default=bad]...但是您必须使用它(并阅读PAM文档)才能正确处理
derobert

这也可以使用完成pam_succeed_if跳过一个模块,如果用户是在组的列表中选择,或如果不跳过两个模块。
dannysauer 2015年

因此,通常是这样的:/// danny中的用户auth [success = ignore default = 1] pam_succeed_if.so用户:// frank //足够的danny_frank_module.so ///足够的auth not_danny_frank.so
dannysauer

3

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

换句话说,sudo密码提示的目的不是建立授权,而是建立身份。基于建立的身份和sudo配置,可以确定所讨论的用户是否具有必要的权限或访问权限。


3
Sudo不需要(除非您想询问root密码,特定用户或目标用户的密码),但是PAM不需要。sudo使用PAM。
derobert

1

您担心的是您的帐户密码可能会被泄露。解决方案是不要以可能被泄露的方式使用登录密码。使用ssh可以在线路上对密码进行加密,因此很好。人们使用ssh关闭密码身份验证,以防止密码猜测攻击,而不是保护密码机密性。如果您使用相同的帐户密码进行其他操作,请确保使用安全的加密通道来提供密码。如果您担心键盘记录器之类的问题,请停止使用不受信任的计算机登录。

如果某人可以获取您的ssh密码,那么他们也可能也可以获取备用sudo密码,因此,与花时间将事情变得更复杂,只是为了提高安全性的幻想相比,您最好花些时间使连接更安全。


0

我没有立即访问可以测试它并确定细节的系统的信息,但是我有一个主意:

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

不幸的是,您将不得不为每个具有sudo特权的用户重复此操作。


0

谢谢@ShâuShắc回答!该解决方案也适用于LinuxMint 17.1 Cinnamon 32位(我只安装了db-util软件包才能运行db_load)。

但是我对结果passwd.db文件非常困惑。我所做的与您的回答相同(但是使用davidjones,它们看起来更引人注目):

# db_load -t hash -T /usr/local/etc/passwd.db
david
jones
^d

但是输入的凭据以纯文本形式存储在哈希文件中:

# grep 'jones.*david'  /usr/local/etc/passwd.db
Binary file /usr/local/etc/passwd.db matches

您还可以通过mcedit查看大卫琼斯

在此处输入图片说明

是的,可以限制的权限/usr/local/etc/passwd.db。但是无论如何,以纯文本形式存储的用户名和密码都是不好的。


即使使用单独的sudo密码,也存在一些潜在的安全漏洞(默认情况下是发行版安装)。因此,单独的密码不适用于su(因此可以使用su和登录密码启动root会话)。此外,Policy Kit不使用单独的密码(可以使用和登录密码来启动Synapticsynaptic-pkexec。然后删除软件包...)。这些问题可以通过配置文件的其他调整来消除。

一般而言,只有通过自定义PAM模块(也许该模块将比较密码和从文件读取的SHA-512哈希值)才能实现安全的单独sudo密码。

PS:对不起,应该发表评论。但是由于文本格式,它可以作为答案。感谢您的理解。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.