我读到了有关在 Linux 中设置 ssh 密钥的信息,并且有一些问题。如我错了请纠正我…
假设主机 tr-lgto 希望使用 ssh 连接到主机 tr-mdm。如果我们想确定它是真正的 tr-mdm,我们会在 tr-mdm 上生成一对密钥,并将公钥添加到known_hosts
tr-lgto 上。如果 tr-mdm 想要检查它是否是真正的 tr-lgto,则 tr-lgto 必须生成密钥对并将公钥添加到authorized_keys
tr-mdm 上。
问题1: 没有用户文件known_hosts中的字段,只是IP地址和主机名。 tr-mdm 可能有很多用户,每个用户都有自己的.ssh
文件夹。我们应该将公钥添加到每个known_hosts
文件中吗?
问题2:我发现ssh-keyscan -t rsa tr-mdm
会返回 tr-mdm 的公钥。我如何知道这个密钥属于哪个用户?此外,输入的公钥/root/.ssh/
与该命令返回的公钥不同。怎么会这样?
答案1
您混淆了服务器计算机对客户端计算机的身份验证以及用户对服务器计算机的身份验证。
服务器认证
建立 SSH 连接时发生的第一件事就是服务器将其公钥发送给客户端,并证明(得益于公钥密码学)向客户端表明它知道关联的私钥。这对服务器进行身份验证:如果协议的这一部分成功,则客户端知道服务器就是它所假装的服务器。
客户端可以检查该服务器是否是已知的服务器,而不是某个试图冒充正确服务器的恶意服务器。 SSH 只提供了一种简单的机制来验证服务器的合法性:它会记住您已经连接到的服务器,在~/.ssh/known_hosts
客户端计算机上的文件中(还有一个系统范围的文件/etc/ssh/known_hosts
)。第一次连接到服务器时,您需要通过其他方式检查服务器提供的公钥是否确实是您要连接的服务器的公钥。如果您拥有要连接的服务器的公钥,则可以将其~/.ssh/known_hosts
手动添加到客户端。
在向服务器发送任何机密数据之前,必须先对服务器进行身份验证。特别是,如果用户认证涉及密码,则不得将密码发送到未经认证的服务器。
用户认证
仅当远程用户能够证明他们有权访问该帐户时,服务器才会允许该用户登录。根据服务器的配置和用户的选择,用户可以提供多种形式的凭证之一(下面的列表并不详尽)。
- 用户可以提供他尝试登录的帐户的密码;然后服务器验证密码是否正确。
- 用户可以提供公钥并证明他拥有与该公钥相关联的私钥。这与用于验证服务器的方法完全相同,但现在用户正在尝试证明其身份,而服务器正在验证他们。如果用户证明他知道私钥并且公钥位于帐户的授权列表(
~/.ssh/authorized_keys
在服务器上)中,则接受登录尝试。 - 另一种方法涉及将验证用户身份的部分工作委托给客户端计算机。这种情况发生在企业等受控环境中,此时许多计算机共享相同的帐户。服务器通过与相反方式使用的相同机制对客户端计算机进行身份验证,然后依赖客户端对用户进行身份验证。
答案2
朋友们给了我答案。默认情况下,密钥标识机器而不是用户。所以密钥存储在/etc/ssh/中。这就是为什么我得到了与 /root/.ssh 中存储的密钥不同的密钥