使用 SSH 处理无密码帐户的一致且安全的方法

Pav*_*rda 13 security password login ssh key-authentication

我必须承认,在某些情况下,我喜欢没有密码的服务器。一个典型的服务器容易受到任何物理访问它的人的攻击。因此,在某些情况下,物理锁定它是可行的,然后信任任何物理访问。

基本概念

从理论上讲,当我实际到达这样的服务器时,我应该能够通过简单地输入root登录名来执行没有密码的管理任务,并且不应该要求我输入密码。这同样适用于用户帐户,但人们不会真正以物理方式访问它们。因此(偶尔)本地访问不需要系统密码。

在远程访问服务器时,无论是出于管理目的还是用户帐户,我都希望始终使用 SSH 私钥。为刚创建的帐户设置 SSH 密钥非常容易,因此(常规)远程访问不需要系统密码。

# user=...
# 
# useradd -m "$user"
# sudo -i -u "$user"

$ keyurl=...
$
$ mkdir -p .ssh
$ curl -o .ssh/authorized_keys "$keyurl"
Run Code Online (Sandbox Code Playgroud)

结论是,理论上,对于这样的用例,我们不需要任何系统密码。所以问题是,我们如何配置系统和用户帐户以使其以一致且安全的方式发生。

本地访问详情

我们如何确保无需密码即可在本地访问 root 帐户?我不认为我们可以使用,passwd -d因为这会使 root 访问过于宽松,非特权用户可以免费切换到 root,这是错误的。我们无法使用,passwd -l因为它会阻止我们登录。

请注意,本地访问仅与使用本地键盘的访问有关。因此,有效的解决方案必须不允许任何用户切换(无论是使用susudo)。

远程访问详情

直到最近,上述解决方案还可以使用,但现在 SSH 开始检查锁定的用户帐户。passwd -d出于同样的原因,我们可能无法使用。我们不能使用,passwd -u因为它只是抱怨它会导致什么passwd -d

这部分有一个使用虚拟密码的解决方法。

user=...

echo -ne "$user:`pwgen 16`\n" | chpasswd
Run Code Online (Sandbox Code Playgroud)

也可以完全关闭 SSH 中的锁定帐户检查,但最好保留对锁定帐户的支持并且能够解锁它们。

最后的笔记

我感兴趣的是一种解决方案,它允许您在本地登录 root 帐户以及远程登录所有帐户,包括 root,而无需任何密码。另一方面,解决方案不得以明确描述的方式影响安全性,尤其是不允许远程用户访问 root 帐户或其他用户的帐户。解决方案应该足够健壮,以免间接导致安全问题。

被接受和授予的答案可能会也可能不会描述单个工具的详细配置,但必须包含实现既定目标的关键点。请注意,这可能无法通过常规使用的一样的工具来解决passwdsshsusudo等。

阅读第一个答案后的更多想法

只是一个想法 - 可以通过启动 root shell 而不是登录进程来实现本地 root 访问。但是仍然需要只锁定密码验证,而不是公钥验证。

roa*_*ima 5

我将提供解决方案的要求,作为要点:

  1. 无密码 root 控制台登录
  2. 来自预授权用户的无密码 root 远程登录
  3. 来自预先授权用户的指定帐户的无密码远程登录
  4. 来自预授权用户的任何帐户的无密码远程登录

以下示例基于 Debian,因为这是我在这里进行测试的内容。但是,我看不出为什么这些原则不能应用于任何发行版(或实际上任何基于 PAM 的 *ix 派生类)。

无密码 root 控制台登录

我认为我会采用的方法是利用 PAM 和/etc/securetty配置文件。

作为先决条件,必须设置“足够安全”的 root 密码。这不是控制台登录所必需的,但存在以使蛮力破解尝试不切实际。否则,该帐户是一个完全正常的 root 帐户。

/etc/pam.d/login我有以下用于身份验证的标准行集(以关键字开头的那些行auth):

auth       optional   pam_faildelay.so  delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
auth       requisite  pam_nologin.so

@include common-auth
auth       optional   pam_group.so
Run Code Online (Sandbox Code Playgroud)

引用的common-auth包含文件包含以下相关行:

auth    [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so
auth    optional                        pam_cap.so
Run Code Online (Sandbox Code Playgroud)

common-auth如果“UNIX 登录”成功,该文件会指示 PAM 跳过一个规则(拒绝)。通常这意味着匹配/etc/shadow.

auth ... pam_securetty.so行被配置为阻止 root 登录,除非在 中指定的 tty 设备上/etc/securetty。(此文件已包含所有控制台设备。)

通过auth稍微修改这一行,可以定义一个规则,允许在没有密码的情况下从 中指定的 tty 设备登录/etc/securettysuccess=ok需要修改该参数,以便在成功匹配的情况下将其ok替换auth为要跳过的行数。在此处显示的情况下,该数字是3,它跳到该auth ... pam_permit.so行:

auth [success=3 new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
Run Code Online (Sandbox Code Playgroud)

来自预授权用户的无密码 root 远程登录

这是为那些被添加到根authorized_keys文件的授权用户直接包含的 ssh 密钥。

来自预先授权用户的指定帐户的无密码远程登录

这也是将授权用户添加到适当和相应用户.ssh/authorized_keys文件的 ssh 密钥的直接包含。(典型的远程用户 chris 需要无密码登录到本地用户 chris场景。)

请注意,帐户在创建后可以保持默认锁定状态(即仅!在 的密码字段中/etc/shadow),但允许基于 SSH 密钥的登录。这需要 root 将密钥放在新用户的.ssh/authorized_keys文件中。什么是不那么明显的是,当这种方法仅适用UsePAM Yes于设置/etc/ssh/sshd_config。PAM 区!分为“帐户锁定密码但可能允许其他访问方法”和!...“帐户锁定。期间”。(如果UsePAM No已设置,则 OpenSSH 会考虑任何存在的!起始密码字段来表示锁定的帐户。)

来自预授权用户的任何帐户的无密码远程登录

我并不完全清楚你是否想要这个设施。也就是说,某些授权用户无需密码即可通过 ssh 登录任何本地帐户。

我无法测试这种情况,但我相信这可以通过 OpenSSH 5.9 或更高版本来实现,它允许authorized_keys/etc/ssh/sshd_config. 编辑配置文件以包含名为/etc/ssh/authorized_keys. 将您选择的授权用户的公钥添加到此文件中,确保权限为 root 所有,并且只有 root (0644) 具有写访问权限。