基于 SSH 密钥的身份验证:known_hosts 与 authorized_keys

dam*_*uar 22 security ssh openssh key-authentication

我阅读了有关在 Linux 中设置 ssh 密钥的信息并有一些问题。如果我错了纠正我…

假设主机 tr-lgto 想要使用 ssh 连接到主机 tr-mdm。如果我们想确定它是真正的 tr-mdm,我们会known_hosts在 tr-mdm 上生成一对密钥,并将公钥添加到tr-lgto 上。如果 tr-mdm 想要检查它是否是真正的 tr-lgto,那么 tr-lgto 必须生成一个密钥对并将公钥添加到 tr-mdmauthorized_keys上。

问题 1:known_hosts 文件中没有用户字段,只有 IP 地址和主机名。tr-mdm 可能有很多用户,每个用户都有自己的.ssh文件夹。我们应该为每个known_hosts文件添加公钥吗?

问题2:我发现ssh-keyscan -t rsa tr-mdm会返回tr-mdm的公钥。我怎么知道这个密钥属于哪个用户?此外,公钥输入/root/.ssh/与该命令返回的不同。怎么会这样?

Gil*_*il' 35

您正在混淆服务器机器对客户端机器的身份验证,以及用户对服务器机器的身份验证。

服务器认证

建立 SSH 连接时发生的第一件事是服务器将其公钥发送给客户端,并向客户端证明(由于公钥加密)它知道关联的私钥。这对服务器进行了身份验证:如果协议的这一部分成功,则客户端知道服务器就是它假装的那个人。

客户端可能会检查服务器是否是已知服务器,而不是某个试图冒充正确服务器的恶意服务器。SSH 仅提供一种简单的机制来验证服务器的合法性:它会~/.ssh/known_hosts在客户端计算机上的文件中记住您已经连接到的服务器(还有一个系统范围的文件/etc/ssh/known_hosts)。第一次连接服务器时,您需要通过其他方式检查服务器提供的公钥是否确实是您要连接的服务器的公钥。如果您拥有要连接的服务器的公钥,则可以~/.ssh/known_hosts手动将其添加到客户端。

在向服务器发送任何机密数据之前,必须先对服务器进行身份验证。特别是,如果用户身份验证涉及密码,则不得将密码发送到未经身份验证的服务器。

用户认证

服务器仅允许远程用户登录,前提是该用户可以证明他们有权访问该帐户。根据服务器的配置和用户的选择,用户可能会提供多种形式的凭据之一(以下列表并非详尽无遗)。

  • 用户可以提供他尝试登录的帐户的密码;然后服务器验证密码是否正确。
  • 用户可以出示公钥并证明他拥有与该公钥相关联的私钥。这与用于验证服务器的方法完全相同,但现在用户正在尝试证明他们的身份,而服务器正在验证他们。如果用户证明他知道私钥并且公钥在帐户的授权列表中(~/.ssh/authorized_keys在服务器上),则接受登录尝试。
  • 另一种方法涉及将验证用户的部分工作委托给客户端机器。这发生在受控环境中,例如企业,当许多机器共享相同的帐户时。服务器通过与其他方式相同的机制对客户端机器进行身份验证,然后依赖客户端对用户进行身份验证。