使用SSH免密登录服务器

使用SSH密钥登录服务器可以提高安全性并且便于管理:

  • SSH密钥对登录认证更为安全可靠,密钥对的安全强度远高于常规用户口令,可以杜绝暴力破解威胁,并且不可能通过公钥推导出私钥。使用密钥登录可以大大提高SSH的安全性,防止恶意用户通过猜测密码等方式进行入侵。

  • 如果将公钥配置在Linux实例中,那么在本地或另外一台实例中可以使用私钥通过SSH命令或相关工具登录目标实例,而不需要输入密码。这对于批量维护多台Linux实例非常方便,可以简化管理过程,提高工作效率。

配置ssh免密登录

  1. 在客户端中,创建一个 SSH 密钥对(如果你还没有密钥对),可以使用ssh-keygen -t rsa命令生成;此命令将生成一个新的 SSH 密钥对,默认将其存储在 ~/.ssh 中,私钥id_rsa和公钥id_rsa.pub
  2. 将 SSH 公钥推送到服务器:ssh-copy-id 服务器用户@服务器IP地址, 这个命令会在服务器上的生成一个文件:~/.ssh/authorized_keys,文件内容就是我们推送的客户端SSH 公钥。
  3. 服务端权限设置:
    • Windows服务端权限设置,将 .ssh\authorized_keys 文件右键属性 – 安全 – 高级 – 点击“禁用继承”–当出现提示时,选择“将继承的权限转换为此对象的显式权限”。然后将权限条目删除至只剩“SYSTEM”、自己的账户、“Administrators”。
    • linux或者Mac服务端这设置权限为600 ,即只有所有者才能读写
  4. (非Windows服务端可以跳过此步骤)打开Windows服务端sshd配置文件 C:\ProgramData\ssh\sshd.config
1
2
3
4
5
6
7
# 确保以下2条没有被注释
PubkeyAuthentication yes # 使用公钥
AuthorizedKeysFile .ssh/authorized_keys # 公钥位置

# 确保以下2条有被注释掉
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
  1. 重启服务端sshd服务:
1
2
3
4
5
# Windows服务端
net stop sshd
net start sshd
# Ubuntu
systemctl restart sshd
  1. 连接过程中使用的配置文件,创建文件: ~/.ssh/config,文件内容如下:
1
2
3
4
Host windows
HostName <windows_host>
User <windows_username>
IdentityFile ~/.ssh/id_rsa
  1. 测试 SSH 连接:ssh windows

远程主机密钥发生了变化的情况

如果远程主机重装或者密钥更改了情况下到导致在客户端连接是出现一下错误:

Text
1
2
3
4
5
6
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.

这里会提醒你更新known_hosts文件,首先介绍下known_hosts 文件作用:

known_hosts 是一个SSH客户端用于存储已知主机公钥的文件。当你第一次连接到一个SSH服务器时,服务器的公钥会被存储在 known_hosts 文件中,以便将来的连接时进行验证。这有助于确保你连接到的服务器确实是你所期望的服务器,而不是一个潜在的恶意服务器。

known_hosts 文件通常存储在用户的home目录下的.ssh子目录中,文件名为 known_hosts。每行都包含一个主机的公钥信息,以及主机的标识信息。当你尝试连接到一个SSH服务器时,SSH客户端会检查目标主机的公钥是否与 known_hosts 文件中存储的公钥匹配。如果不匹配,你将收到与你最初提到的错误消息类似的警告,因为主机密钥似乎已更改或存在中间人攻击的风险。

你可以编辑 known_hosts 文件,手动删除或更新其中的公钥信息,以适应你的需要。通常,当你信任一个新的主机或你知道主机的公钥已更改时,你需要更新 known_hosts 文件以便顺利建立连接。不过,务必小心操作,确保你只将信任的主机公钥添加到该文件中,以维护连接的安全性。

如果你确定主机密钥已更改,你可以编辑你的SSH客户端的.ssh/known_hosts文件,删除与该主机相关的行,然后重新连接。

如果你仍希望保留原来主机信息的同时继续连接到新主机,你可以采取以下步骤:

  1. 查找原主机的行:在 known_hosts 文件中,找到包含原主机信息的行。这一行通常包括主机名和公钥信息。
  2. 复制原主机行:复制原主机信息行并粘贴在文件的末尾,或者在新行中进行修改。
  3. 更新公钥信息:在复制的行中,将原主机的公钥信息替换为新主机的公钥信息。这将更新已知主机的密钥信息。
  4. 使用命令查看公钥信息:
1
2
3
4
cat /etc/ssh/ssh_host_rsa_key.pub  # 查看RSA公钥
cat /etc/ssh/ssh_host_dsa_key.pub # 查看DSA公钥
cat /etc/ssh/ssh_host_ecdsa_key.pub # 查看ECDSA公钥
cat /etc/ssh/ssh_host_ed25519_key.pub # 查看ED25519公钥
  1. 保存文件:保存 known_hosts 文件。
  2. 连接新主机:现在你可以使用SSH客户端连接到新主机,它将使用更新后的 known_hosts 文件。