多用户 SSH 安装中的密钥之间的精确关系是什么?

多用户 SSH 安装中的密钥之间的精确关系是什么?

在为用户和根帐户进行 SSH 配置以访问一组虚拟机和硬件服务器时,我遇到了从公钥/私钥关系的角度来看对我来说没有多大意义的情况。

推荐的步骤似乎如下:

ssh user@vm1产生The authenticity of host 10.1.10.9 can't be established. Are you sure you want to connect?

选择yes将 vm1 机器密钥的指纹放入您的~/.ssh/known_hosts文件中。

ssh user@vm1返回Permission denied(公钥,gssapi,...)

ssh-keygen为登录用户('user')在~/.ssh/id_rsa和中生成本地密钥对id_rsa.pub。这两个都标有用户的计算机身份:[email protected]

下一步的一个版本是:ssh-copy-id [-i ~/.ssh/id_rsa.pub] user@vm1

这通常会失败,因为 已PasswordAuthentication设置为并且必须进行no带外修改。/etc/ssh/sshd_config然后ssh-copy-id可以将'用户的公钥复制到~/.ssh/_authorizedkeysvm1的文件中。

成功的结果ssh-copy-id标识公共文件的(本地)源以及添加到远程 (1) 的密钥计数。

此时PasswordAuthentication可以设置回no

现在,用户的~./ssh/authorized_keys文件包含一个标有用户名和计算机 ID 的密钥。

现在让我们为另一个用户(例如 root)设置 ssh 登录:

仍以用户身份登录,

ssh-copy-id root@vm1(跳过密码验证步骤...)成功,将 [用户] 的公钥复制到authorized_keysvm1 根~/.ssh/文件夹中的文件。该密钥仍然标有[用户]的名称和机器。

虽然此操作可能看起来明显有缺陷,或者可能没有……如果您使用的是 MAC,则类似的操作是唯一的选择,因为 MAC 没有根用户~/.ssh/文件夹。

在我看来,这样做的结果是任何其他机器上的任何用户都可以在他们拥有 root 密码的任何机器上创建 ssh root 登录帐户。他们可以根据其[用户]帐户公钥以 root 身份登录该计算机,该公钥存储在authorized_keys目标系统根~/.ssh/文件夹的文件中。

对我来说,这似乎削弱了目标计算机上的 root 访问保护,因为用户的公钥验证了登录权限,但目标 root 相应的私钥并未存储在~/.ssh/源计算机上受限制的 root 帐户文件夹中。

我错过了什么吗?

答案1

仍然以用户身份登录, ssh-copy-id root@vm1 (跳过密码身份验证步骤...)成功,将 [用户] 的公钥复制到 vm1 的 root ~/.ssh/ 文件夹中的authorized_keys 文件。该密钥仍然标有[用户]的名称和机器。

SSH基于密钥的认证原理是:如果客户端可以通过密码证明其拥有与服务器上请求的用户名文件中的公钥相对应的私钥~/.ssh/authorized_keys,则允许访问。就是这样。 “[用户]的名称和机器”实际上是一个自由格式的文本字段,它允许人们轻松识别特定的公钥。该字段的内容不会以任何方式用于身份验证。

默认情况下,SSH 服务器不关心传入连接在客户端声称的用户名,因为:

  • 客户端可能不希望向服务器透露这一点
  • 服务器无法以任何方式验证客户端用户名
  • 即使有,密钥被盗的恶意客户端也可以配置任何对客户端有利的客户端用户名。

如果要限制使用 SSH 密钥身份验证,可以通过在文件中的 SSH 密钥前面authorized_keys加上from="<hostname-or-IP-address-pattern>".正如sshd手册页所说:

此选项的目的是选择性地提高安全性:公钥身份验证本身不信任网络或名称服务器或任何东西(除了密钥);但是,如果有人以某种方式窃取了密钥,则该密钥将允许入侵者从世界任何地方登录。这个附加选项使得使用被盗密钥变得更加困难(除了密钥之外,名称服务器和/或路由器也必须受到损害)。


对我来说,这似乎削弱了目标计算机上的 root 访问保护,因为用户的公钥验证了登录权限,但目标 root 相应的私钥并未存储在源计算机上受限制的 root 帐户 ~/.ssh/ 文件夹中。

仅当源计算机始终保证与目标计算机处于相同的管理控制之下时,这才是正确的。 SSH 不假设这一点,并且认识到基于源计算机的用户是谁是徒劳的声称是除非有某种方法可以验证该说法。


如果您的意思是user@vm1运行并成功输入 root 密码,那么您可能会对本例中的操作ssh-copy-id root@vm1感到惊讶。ssh-copy-id如果没有 SSH 私钥user@vm1:.ssh/id_*sshd 允许vm1 SSH 代理转发,则ssh-copy-id使用代理连接从 Mac 客户端主机获取公钥。这就是用名称和机器标记的公钥最终[user]出现在root@vm1:.ssh/authorized_keys文件中的方式。

现代 macOS 有一个ssh-agent与 macOS 密钥环集成的扩展,默认情况下可在每个 macOS 用户的会话中使用。如果您期望普通的 OpenSSH 行为,这也可能是一个惊喜。

相关内容