Linux ~/.ssh目录详解和密钥对使用

服务器 0

.ssh目录内容

Linux中,每个用户的根目录下都有一个.ssh目录,保存了ssh相关的key和一些记录文件。例如:

root@ubuntu:~/.ssh# lsauthorized_keys  id_rsa  id_rsa.pub  known_hosts  known_hosts.old

使用ssh-keygen生成key

ssh-keygen可以生成ssh协议所需要的公钥和私钥,例如:

ssh-keygen -t rsa

此命令将生成一个私钥文件(默认为id_rsa)和一个公钥文件(默认为id_rsa.pub)。
其中私钥是必须保存在.ssh目录中的,只有该主机的该用户可以使用。而公钥是给需要使用ssh验证的服务器,使用密钥对可以免密码验证,比如ssh,scp,rsync等。

known_hosts 和 known_hosts.old

known_hostsknown_hosts.old是SSH客户端中的文件,用于存储已知主机的公钥信息。以下是它们的作用和功能:

  1. known_hosts文件:这个文件包含了您曾经连接过的远程主机的公钥信息。当您首次连接一个远程主机时,SSH客户端会将该主机的公钥保存在known_hosts文件中。下次再次连接该主机时,客户端会验证主机的公钥是否与之前保存的一致,以防止中间人攻击。如果主机的公钥发生变化,客户端会发出警告,以提醒您进行确认。

  2. known_hosts.old文件:当SSH客户端检测到known_hosts文件发生了变化(比如主机公钥发生了更改)时,它会将原始的known_hosts文件备份为known_hosts.old。这样,您可以在需要时恢复到旧的已知主机配置。

这些文件通常位于SSH客户端用户的~/.ssh/目录下,每个用户都有自己的独立副本。

请注意,known_hosts文件不包含任何敏感信息,它只存储了公钥信息以供身份验证使用。但是,如果您的系统存在安全问题,有人可能会通过欺骗您来窃取您的密钥,因此当发现known_hosts文件发生变化时,务必审查和验证公钥的有效性。

authorized_keys文件

authorized_keys文件位于SSH服务器上,用于存储允许访问该服务器的客户端的公钥。当您希望使用密钥进行SSH身份验证时,您需要将您的公钥添加到目标服务器的authorized_keys文件中。只有在authorized_keys文件中列出的公钥才能成功进行身份验证并获得访问权限。

authorized_keys文件的作用是配置服务器允许哪些客户端使用密钥进行身份验证。每个客户端的公钥都需要在该文件中有相应的条目才能成功进行身份验证。

known_hosts和authorized_keys的区别

虽然known_hosts和authorized_keys两个文件都涉及到存储其他主机的公钥信息,但它们在SSH身份验证过程中的角色和功能是不同的。
known_hosts文件用于SSH客户端验证远程主机的身份,而authorized_keys文件用于SSH服务器验证客户端的身份。它们在SSH连接过程中扮演了不同的角色,并且存储的公钥信息也有不同的来源和目的。
你可能在.ssh目录中同时看到known_hosts和authorized_keys文件,因为这个主机即可以作为ssh客户端去连接其他主机,也可以作为ssh服务器被其他主机连接,因此这两个文件就都存在。

公钥使用举例:rsync免密同步文件

使用rsync同步文件时,我们可以在目标主机用户上保存当前主机用户的公钥,以实现免密同步文件。

  • 首先,保证我们的客户端主机的当前用户已经有密钥对,如果没有就使用ssh-keygen生成一对。
  • 如果我们知道目标主机用户的authorized_keys文件是空的,可以使用以下方法将客户端的公钥复制到目标主机上的~/.ssh/authorized_keys文件中:
  • ssh-copy-id -i ~/.ssh/id_rsa.pub user@target_host
    替换user为目标主机上的用户名,target_host为目标主机的IP地址或主机名。执行此命令后,系统会要求您输入目标主机的密码。
    如果ssh-copy-id命令不可用,请手动将公钥内容复制到目标主机的~/.ssh/authorized_keys文件中。
  • 但很有可能,目标主机用户的authorized_keys文件已经保存了其他客户端的公钥信息,所以我们大概率不能覆盖这个文件。但我们可以将自己的公钥信息添加到这个文件末尾。
    1. 首先,将我们的公钥文件上传到目标主机上:
      scp -P 22 ~/.ssh/id_rsa.pub user@target_host:/tmp/id_rsa.pub
      替换user为目标主机上的用户名,target_host为目标主机的IP地址或主机名。-P选项可以设置ssh服务的端口,如果目标主机的ssh服务是其他端口,请在这儿替换。
    2. 追加公钥到现有文件:登录到目标主机,并将公钥追加到~/.ssh/authorized_keys文件的末尾。在目标主机上运行以下命令:
      cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
    3. 清理临时文件(可选):可以在目标主机上删除临时公钥文件。运行以下命令:
      rm /tmp/id_rsa.pub
      现在,您已成功将公钥添加到目标主机上现有的~/.ssh/authorized_keys文件的末尾,而不会覆盖它。
  • 使用ssh登录验证
    向目标主机的user用户的.ssh/authorized_keys中添加源主机用户的公钥信息后,就可以直接使用ssh免密登录了:
    ssh user@target_host
    如果一切顺利,您应该能够在不输入密码的情况下成功登录到目标主机。
  • 使用rsync同步文件
    rsync -avz -e "ssh -p 22" /path/to/source user@target_host:/path/to/destination
    替换/path/to/source为源文件或目录的路径,user为目标主机上的用户名,target_host为目标主机的IP地址或主机名,/path/to/destination为目标文件或目录的路径。
    在使用rsync命令时,指定了-e "ssh -p 22"选项,它告诉rsync使用22端口进行SSH连接。由于您已经设置了密钥身份验证,rsync将使用密钥进行身份验证,而不需要输入密码。

也许您对下面的内容还感兴趣: