我正在设置几个ubuntu
盒子,并使用 opscodechef
作为配置工具。在每台服务器上为每个用户安装公钥并禁用密码身份验证将相当容易。
但是,用户也应该拥有sudo
权限,默认情况下需要密码。
如果我想使用用户的公钥作为访问管理的方法并允许用户sudo
特权,这是否意味着我还应该使用NOPASSWD: ALL
invisduo
或如果用户只有公钥身份验证,有没有办法可以更改自己的密码?
答案1
Sudo 在其最常见的配置中要求用户输入密码。通常,用户已经使用密码来验证帐户,再次输入密码是确认合法用户没有放弃控制台并被劫持的一种方法。
在您的设置中,用户的密码将仅用于 sudo 身份验证。特别是,如果用户的 SSH 密钥被泄露,攻击者将无法提升到服务器上的 root 权限。攻击者可以在帐户中植入键盘记录器,但其他用户可以检测到该键盘记录器,甚至可以自动监视该键盘记录器。
用户通常需要知道其当前密码才能将其更改为其他密码。程序passwd
会验证这一点(可以将其配置为不验证,但这在您的场景中没有用或根本不需要)。然而,root 可以在不知道旧密码的情况下更改任何用户的密码;因此,具有 sudo 权限的用户可以passwd
通过运行来更改自己的密码,而无需在提示符下输入密码sudo passwd $USER
。如果sudo
配置为需要用户密码,则用户无论如何都必须输入密码sudo
。
您可以有选择地禁用密码验证。在您的情况下,您将在 ssh 以及可能的其他服务中禁用密码身份验证。大多数现代 unice(包括 Ubuntu)上的大多数服务都使用聚丙烯酰胺配置身份验证方法。在 Ubuntu 上,PAM 配置文件位于/etc/pam.d
.要禁用密码身份验证,请注释掉auth … pam_unix.so
中的行/etc/pam.d/common-auth
。此外,请确保您已PasswordAuthentication no
禁用/etc/ssh/sshd_config
sshd 的内置密码身份验证。
您可能希望允许某些管理用户使用密码登录,或允许在控制台上进行密码身份验证。这可以通过 PAM 实现(它非常灵活),但我无法直接告诉你如何实现;如果您需要帮助,请提出单独的问题。
答案2
是的,它非常不安全,并且还允许用户访问其他用户的密码,但由于他们有 sudo,所以你无能为力。
基本上,您执行以下操作:
$ sudo -i
现在,我们是根了。我们可以访问一切。
# passwd $username
$username 可以是任何人的用户名。
输入新的 UNIX 密码:
重新输入新的 UNIX 密码:passwd:密码更新成功
咚咚,密码变了。再说一遍,非常不安全,因为你可以改变任何人,但它有效,但它有效。我不推荐它,而是提供这个答案作为一个例子不是去做。
答案3
您可以使用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
调用至少都需要一些确认。
答案4
简短回答
是的您应该允许所有用户sudo
无需密码即可使用。如果您不想更改sudo
发行版上的默认组,您可以创建另一个组,例如sudoers_without_password
,并说这个新组并且只有这个组可以在没有密码的情况下进行 sudo。但无论如何,如果您要创建没有密码并且应该能够使用 的用户sudo
,那么他们必须能够在没有密码的情况下使用它。
长答案
创建没有密码的用户,只能使用 Chef、ansible、puppet 等工具使用 SSH 公钥登录...是当今的一种常见做法,并且出于多种原因可以被认为是一种非常好的做法(特别是因为 ssh 密钥是非常安全,管理密码既痛苦又不安全)。
现在您已经创建了所有用户,但遇到了一个小问题:其中一些用户至少应该能够使用 sudo,并且许多发行版建议使用密码才能使用 sudo……但是您的用户没有密码!
在一个完美的世界里应该您的用户可以使用 ssh 密钥安全地登录,然后定义密码(有标准passwd
命令),然后使用 sudo 命令。
不幸的是,我们并不生活在一个完美的世界,如果您的用户尝试使用 设置新密码passwd
,它将不起作用。
其实它是在这种情况下,可以使该passwd
命令起作用,但它的含义使其成为一个非常糟糕的主意。
完全可以创建一个没有任何密码的用户并允许该用户更改自己的密码。答案在这个手册页。 (我不会完全解释它,因为无论如何你都不应该这样做)。
Linux系统有两种类型的“无密码”用户:
- 残疾用户。这些用户的队列中通常会有 a
!
或 a 。由于某种原因,禁用用户*
/etc/shadow
可能仍然通过某种方式登录,例如使用带有私钥身份验证的 SSH(至少对于大多数默认 SSH 服务器配置而言)。残疾用户不允许设置他们的密码。 - 无密码用户。用户的
/etc/shadow
行中没有任何密码。这些用户可以更改自己的密码。
问题是无密码用户非常非常气馁,因为任何人可以以他们的身份登录。通常 OpenSSH 会拒绝以这些用户之一的身份登录(这仍然是一件事),但是:
- 任何其他用户都可以使用该
su
命令切换到该用户即使他们不是 root 或不在 sudo 组中。 - 任何能够物理访问计算机的人都可以以用户身份登录,无需密码(假设计算机有屏幕、键盘和鼠标)。
这就是为什么创建无密码用户帐户是非常不鼓励的,并且通常被大多数自动化工具阻止。这就是为什么在使用 Chef 创建用户时,它会创建禁用用户而不是无密码用户。大多数其他类似的工具(ansible、puppet 等)都会做同样的事情,因为它们的创建者不希望你搬起石头砸自己的脚。
因此,为了允许用户使用公钥使用 SSH 登录,最好的做法仍然是创建残疾人用户,即使这意味着他们以后将无法为自己创建密码。
现在回到你的“sudo 应该使用密码”问题,在这种情况下,有两种相互矛盾的最佳实践:
- 一方面,这些用户应该残疾人用户,因此他们将无法更改密码,因为这就是禁用用户的工作方式。我们可以相反,创建无密码用户,但这会造成严重的安全问题,正如我们之前所看到的。
- 另一方面,大多数人认为允许用户在
sudo
不输入密码的情况下使用是一种不好的做法(根据配置,sudo 可能允许带或不带密码)。这是因为粗心的管理员用户可能会意外地使用 sudo 输入命令,从而产生不良后果。
这两种最佳实践不能同时遵循,所以我们必须做出选择。但这里有一个强有力的赢家:允许无密码用户比允许无密码 sudo 更危险。
因此,在这种情况下,只需将sudo
组配置为允许无密码的命令,无论如何,这是最好的做法,因为据我所知没有其他解决方案。