Linux用户可以在不知道当前密码的情况下更改密码吗?


25

我正在设置几个ubuntu框,并使用opscode chef作为配置工具。在这些服务器中的每台服务器上为每个用户安装公用密钥,并禁用密码身份验证将是相当容易的。

但是,用户还应该具有sudo特权,默认情况下,该特权需要密码。

如果我想使用用户的公共密钥作为访问管理的方法并允许用户sudo特权,那是否意味着我也应该使用NOPASSWD: ALLin来设置用户visduo,或者是否存在一种方法,如果用户可以更改自己的密码,只有公钥认证?



@sr-看来这不是主流的做法...
cwd 2012年

为什么要让您的用户拥有sudo特权?希望您知道您为此放弃了根访问权限。这里可能有机会花费一些时间,并且仅允许将命令的子集与sudo结合使用(这可能会不太安全)。Go man sudoers将产生有关某些命令能够以sudo运行而无需用户密码的信息。您甚至可以在/ etc / sudoers中添加一个shellscript,该脚本将允许每个用户“自我密码”设置,而无需使用先前的密码。
humanityANDpeace

@humanityANDpeace-我意识到了这一点。我们的团队成员都需要对我们维护的云服务器具有root访问权限。现在,我们正在使用Chef来管理用户的公共密钥,并且我们有一个sysadmin组NOPASSWD: ALL,团队成员也参与其中。如果您可以提出更好的解决方案,请发布它作为答案。
cwd

Answers:


21

在最常见的配置中,Sudo要求用户键入密码。通常,用户已经使用他的密码对帐户进行身份验证,再次输入密码是确认合法用户没有放弃其控制台并被劫持的一种方式。

在您的设置中,用户密码仅用于sudo身份验证。特别是,如果用户的SSH密钥受到破坏,攻击者将无法提升服务器上的root特权。攻击者可以将密钥记录器植入该帐户,但是其他用户可以检测到该密钥记录器,甚至可以对其进行自动监视。

用户通常需要知道其当前密码才能将其更改为其他密码。该passwd验证这个程序(可以配置成不,但这是没有用的或在您的方案中所有期望的)。但是,root用户可以在不知道旧密码的情况下更改任何用户的密码。因此具有sudo权限的用户可以更改自己的密码而无需passwd通过运行在提示符下输入密码sudo passwd $USER。如果sudo配置为要求用户密码,则用户sudo无论如何都必须输入密码。

您可以有选择地禁用密码身份验证。在您的情况下,您将在ssh以及其他服务中禁用密码身份验证。大多数现代unice(包括Ubuntu)上的大多数服务都使用PAM来配置身份验证方法。在Ubuntu上,PAM配置文件位于中/etc/pam.d。要禁用密码身份验证,请在中注释掉该auth … pam_unix.so/etc/pam.d/common-auth。此外,请确保您有PasswordAuthentication no/etc/ssh/sshd_config对禁用的sshd的内置密码认证。

您可能希望允许某些管理用户使用密码登录,或者允许在控制台上进行密码验证。PAM可以做到这一点(它非常灵活),但是我无法告诉您如何摆脱困境。如果需要帮助,请询问另一个问题。


将PAM与SSH密钥身份验证结合使用的一种便捷方法是通过pam_ssh_agent_auth,它具有用(理论上更安全)密钥身份验证代替密码提示的优点SSH仍然可以使用
Tobias Kienzler 2014年

所以您是说sudo passwd要更改当前用户的密码,而不是sudo用户的密码?
still_dreaming_1

1
@ still_dreaming_1不,我是说可以运行命令的用户sudo可以更改自己的密码。确切的命令并不重要,但是要更详细地讲,它应该是用户名在sudo passwd bob哪里bob,或等价的东西。不带任何参数,sudo passwd确实会更改root的密码。
吉尔(Gilles)'所以

7

您可以使用pam_ssh_agent_auth模块。编译非常简单,然后添加条目

auth       sufficient pam_ssh_agent_auth.so file=~/.ssh/authorized_keys

其他auth(或include)条目之前/etc/pam.d/sudo

Defaults    env_keep += "SSH_AUTH_SOCK"

/etc/sudoers(通过visudo)。

现在,每个用户都可以sudo通过(转发或本地)SSH代理密码进行身份验证。最好要求您的用户使用ssh-add -c,以便每个sudo呼叫至少需要一些确认。


与此相关的是,有pam_ssh,它允许使用您的SSH密码而不是Unix密码登录,自动启动代理并添加密钥-这样就为您提供了单点登录的可能性。
Tobias Kienzler 2013年

1

是的,这是非常不安全的,并且还允许用户访问其他用户的密码,但是由于他们具有sudo,因此您无能为力。

基本上,您可以执行以下操作:

$ sudo -i

现在,我们是根。我们拥有一切。

# passwd $username

$ username可以是任何人的用户名。

输入新的UNIX密码:

重新输入新的UNIX密码:passwd:密码更新成功

动臂,密码已更改。同样,由于您可以更改任何人,因此非常不安全,但这确实可行,但确实可行。我不建议这样做,而是提供此答案作为执行操作的示例。


看起来不错,但是您能详细说明一下这里发生的事情吗?
2012年

4
sudo -i没有当前用户密码是不可能的。
克拉韦米尔,2012年

@Miro。正如你所说。sudo bash考虑到/etc/sudoers文件中的设置,仍然可能没有密码。我认为@jrg是说更侧重于使用sudo不安全问题在这里
humanityANDpeace

1
老实说,您不必做sudo -i,您可以直接跳到sudo passwd $username@Miro,您不需要知道当前的用户密码。您只需要知道root密码即可使用sudo
Antony 2014年

0

密码的目的是确保获得用户密钥或找到无人值守终端的黑客无法获得root用户访问权限。因此,我不建议任何涉及无密码sudo的解决方案。

我建议您保持简单:可能会通过电子邮件向用户发送带有严格说明的默认密码,以尽快对其进行更改,或者在其.profile或中插入脚本,或者.login在首次登录时要求输入新密码。完成后,它可能会自行禁用,您可以使用它expect来输入现有密码,这样他们就不必知道它了。


0
#% useradd -g somegroup someuser
#% usermod -p "" someuser
#% chage -d 0 someuser
#% sed -i "s/^.*PasswordAuthentication .*/PasswordAuthentication no/" /etc/sshd/sshd_config
#% /sbin/service sshd restart
#% cp -r ~/.ssh `echo ~someuser`
#% chown -R someuser `echo ~someuser`/.ssh
#% chgrp -R somegroup `echo ~someuser`/.ssh
#% echo "%somegroup  ALL=(ALL)   ALL" >> /etc/sudoers

>这应该允许您拥有只能使用公共密钥登录而不能使用密码登录的用户。但是,他将在首次登录时被迫更改密码...,而不必事先告诉他一些伪造的密码...只需简单地要求用户重置密码,然后他们只能将其用于sudo。但将无法使用该密码登录(ssh)。请注意,这里的技巧是不要告诉用户一些虚拟密码,一旦要求他们更改密码,他们将需要在登录时输入这些密码。到实际用户是必需的。

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.