在为用户和根帐户进行 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/_authorizedkeys
vm1的文件中。
成功的结果ssh-copy-id
标识公共文件的(本地)源以及添加到远程 (1) 的密钥计数。
此时PasswordAuthentication
可以设置回no
。
现在,用户的~./ssh/authorized_keys
文件包含一个标有用户名和计算机 ID 的密钥。
现在让我们为另一个用户(例如 root)设置 ssh 登录:
仍以用户身份登录,
ssh-copy-id root@vm1
(跳过密码验证步骤...)成功,将 [用户] 的公钥复制到authorized_keys
vm1 根~/.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 行为,这也可能是一个惊喜。