在通过用户和根帐户的 SSH 配置来访问一组 VM 和硬件服务器时,我遇到了从公钥/私钥关系的角度来看对我没有多大意义的情况。
推荐的步骤似乎如下:
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
~/.ssh/id_rsa
为登录用户 ('user')和生成本地密钥对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 标记的键。
所以现在让我们为另一个用户设置一个 ssh 登录,比如 root:
仍以用户身份登录,
ssh-copy-id root@vm1
(跳过密码验证步骤...)成功,将 [user] 的公钥复制到authorized_keys
vm1 根~/.ssh/
文件夹中的文件中。密钥仍然用 [user] 的名称和机器标记。
虽然这个操作可能看起来明显有缺陷,或者可能没有......如果你在 MAC 上,这样的东西是唯一的选择,因为 MAC 没有根用户~/.ssh/
文件夹。
在我看来,这样做的结果是任何其他机器上的任何用户都可以为他们拥有 root 密码的任何机器创建一个 ssh root 登录帐户。authorized_keys
他们可以根据存储在目标系统根文件夹文件中的[user] 帐户公钥在该计算机上以 root 身份登录~/.ssh/
。
对我来说,这似乎削弱了目标机器上的 root 访问保护,因为用户的公钥验证了登录权限,但目标 root 对应的私钥没有存储在~/.ssh/
源机器上的受限 root 帐户文件夹中。
我错过了什么吗?
基于 SSH 密钥的身份验证的原理是:如果客户端可以加密证明它拥有与服务器上请求的用户名文件中的公钥对应的私钥,则允许访问。
~/.ssh/authorized_keys
而已。“[用户] 的名称和机器”实际上是一个自由格式的文本字段,它允许人们轻松识别特定的公钥。该字段的内容不以任何方式用于身份验证。默认情况下,SSH 服务器不关心传入连接在客户端声称的用户名,因为:
如果要限制使用 SSH 密钥身份验证,可以通过在
authorized_keys
文件中的 SSH 密钥前加上from="<hostname-or-IP-address-pattern>"
. 正如sshd
手册页所说:只有当源机器总是被保证在与目标机器相同的管理控制之下时,这才是正确的。SSH 不假设这一点,并且认识到,除非有某种方法可以验证该声明,否则基于源计算机用户声称的身份是徒劳的。
如果您的意思是
user@vm1
运行并成功输入了 root 密码,那么您可能会对在这种情况下所做的ssh-copy-id root@vm1
事情感到惊讶。ssh-copy-id
如果没有 SSH 私钥user@vm1:.ssh/id_*
并且 允许 SSH 代理转发,则sshd
使用代理连接从 Mac 客户端主机获取公钥。这就是用名称和机器标记的公钥最终出现在文件中的方式。vm1
ssh-copy-id
[user]
root@vm1:.ssh/authorized_keys
现代 macOS 具有与 macOS 密钥环集成的扩展
ssh-agent
,默认情况下在每个 macOS 用户的会话中可用。如果您期望普通的旧 OpenSSH 行为,这也可能是一个惊喜。