Press "Enter" to skip to content

如何防止ssh中间人攻击

在登录 SSH 服务器时,验证 fingerprint 的有效性至关重要,这有助于防止中间人攻击。以下是几种常见的验证方法和步骤:

理解 SSH Fingerprint

SSH fingerprint 是一个用于唯一标识 SSH 服务器公钥的简短哈希值。它通常以十六进制字符串的形式呈现。在首次连接到服务器时,SSH 客户端会显示服务器的 fingerprint,并询问你是否信任该服务器。如果你选择“yes”,客户端会将该 fingerprint 保存在本地 known_hosts 文件中。

验证 Fingerprint 的方法

  1. 首次连接时比对 Fingerprint:
    • 步骤:
      1. 使用 SSH 客户端连接服务器,例如:ssh user@server_ip 或 ssh user@server_hostname在首次连接时,SSH 客户端会显示服务器的 fingerprint,例如:
The authenticity of host 'server_ip (192.168.1.100)' can't be established. ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])?
  1. 关键步骤: 在你输入 yes 之前,必须验证这个 fingerprint 的有效性。
  1. 验证方法:
    • 向服务器管理员索取: 最可靠的方法是联系服务器管理员,通过安全的方式(例如电话、加密消息)索取服务器的 fingerprint。
    • 通过服务器控制面板/管理界面获取: 某些云服务提供商或主机管理面板会提供服务器的 fingerprint。
    • 通过其他信任的渠道获取: 如果有其他信任的渠道(例如安全的内部文档或共享密钥库),也可以尝试从这些渠道获取 fingerprint。
  2. 比对: 将 SSH 客户端显示的 fingerprint 与你从上述安全渠道获取的 fingerprint 进行比对。如果它们完全一致,那么可以确信服务器的身份是真实的,输入 yes 继续连接。
  3. 已存在 known_hosts 条目时的验证:
    • 场景: 当你已经连接过该服务器,并且其 fingerprint 保存在本地 known_hosts 文件中时。
    • 步骤:
      1. 连接服务器,如果服务器的 fingerprint 与 known_hosts 中的不一致,SSH 客户端会发出警告:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ 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 the host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. Please contact your system administrator. Add correct host key in /Users/your_user/.ssh/known_hosts to get rid of this message. Offending key for IP in /Users/your_user/.ssh/known_hosts:2 Host key for IP has changed and you have requested strict checking. Host key verification failed.
  1. 验证:
    • 排查原因: 出现警告时,要仔细检查。可能的解释有:
      • 服务器管理员更新了密钥: 这是最常见的情况,需要联系管理员确认并更新本地 known_hosts 文件。
      • 中间人攻击: 这是一种潜在的严重安全问题,请务必高度警惕,并联系服务器管理员进行核实。
    • 更新 known_hosts 文件: 如果确认是服务器密钥更新,可以通过以下方法更新 known_hosts 文件:
      • 删除旧条目: 根据提示中的行号(例如,Offending key for IP in /Users/your_user/.ssh/known_hosts:2),找到并删除 known_hosts 中相应的条目,然后重新连接,验证新的 fingerprint。
      • 使用 ssh-keygen 命令: 可以使用 ssh-keygen -R server_ip 或 ssh-keygen -R server_hostname 删除旧条目,然后重新连接。
      • 手动编辑: 如果熟悉 known_hosts 文件格式,也可以手动编辑删除旧条目。
  2. 重新连接: 更新 known_hosts 文件后,重新连接服务器,会再次显示新的 fingerprint,按照首次连接时的步骤进行比对和验证。

一些额外的注意事项:

  • known_hosts 文件:
    • 该文件位于用户的 .ssh 目录下(例如:~/.ssh/known_hosts)。
    • 它用于存储已信任的服务器的 fingerprint。
    • 避免手动编辑 known_hosts 文件,除非你非常了解其格式。推荐使用 ssh-keygen 命令进行操作。
  • SSH 客户端配置:
    • StrictHostKeyChecking 配置项控制 SSH 客户端在遇到未知或更改的 fingerprint 时的行为。
      • yes(默认值):如果 fingerprint 不匹配,拒绝连接。
      • no:不进行 fingerprint 检查,风险较高。
      • ask:询问用户是否继续连接,不推荐。
    • 你可以通过 ~/.ssh/config 文件或命令行选项配置 StrictHostKeyChecking。
  • 信任机制: 信任服务器 fingerprint 的关键在于你如何获取它。确保通过安全的渠道获取,避免通过不安全的渠道(如不加密的邮件或即时消息)。
  • 持续监控: 定期检查 known_hosts 文件中是否存在异常条目。

总结

验证 SSH fingerprint 是一个重要的安全步骤,可以有效防止中间人攻击。首次连接时务必小心比对 fingerprint,对于 known_hosts 文件中 fingerprint 变更要认真对待,确认原因并及时更新。通过以上步骤和注意事项,你可以更安全地使用 SSH 连接到你的服务器。

作为管理员如何获取服务器的fingerprint ?

作为服务器管理员,获取服务器的 SSH fingerprint 有多种方法,具体取决于你的服务器环境和操作系统。下面是一些常用的方法:

1. 通过 SSH 服务本身获取:

这是最常见且推荐的方式,因为它直接从 SSH 服务读取公钥并生成 fingerprint。

  • Linux/macOS (终端):
ssh-keygen -E md5 -lf /etc/ssh/ssh_host_ecdsa_key.pub
ssh-keygen -E md5 -lf /etc/ssh/ssh_host_rsa_key.pub
ssh-keygen -E md5 -lf /etc/ssh/ssh_host_ed25519_key.pub

解释:

  • ssh-keygen 是 SSH 密钥管理工具。
  • -E md5 指定使用 MD5 哈希算法生成 fingerprint (也可以使用 SHA256,例如 -E sha256). SHA256 更安全,但为了兼容性,通常也需要提供 MD5。
  • -lf 用于指定要读取的密钥文件,l 为显示,f为文件
  • /etc/ssh/ssh_host_ecdsa_key.pub、/etc/ssh/ssh_host_rsa_key.pub、/etc/ssh/ssh_host_ed25519_key.pub 是 SSH 服务器公钥文件的常见路径。

输出示例 (MD5):

2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx root@hostname (RSA)
256  MD5:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy root@hostname (ECDSA)
256  MD5:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz root@hostname (ED25519)

输出示例 (SHA256):

2048 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx root@hostname (RSA)
 256  SHA256:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy root@hostname (ECDSA)
 256 SHA256:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz root@hostname (ED25519)

Windows (PowerShell):
Windows 系统自带的 OpenSSH 工具也可以使用 ssh-keygen 命令,前提是你已经安装了 Windows OpenSSH 组件。 你需要找到你的服务器公钥文件所在位置。通常默认的目录是 C:\ProgramData\ssh\ssh_host_rsa_key.pub, C:\ProgramData\ssh\ssh_host_ecdsa_key.pub, C:\ProgramData\ssh\ssh_host_ed25519_key.pub,如果不一样,请替换。

 ssh-keygen -E md5 -lf "C:\ProgramData\ssh\ssh_host_rsa_key.pub"
 ssh-keygen -E md5 -lf "C:\ProgramData\ssh\ssh_host_ecdsa_key.pub"
 ssh-keygen -E md5 -lf "C:\ProgramData\ssh\ssh_host_ed25519_key.pub"

 #  SHA256
 ssh-keygen -E sha256 -lf "C:\ProgramData\ssh\ssh_host_rsa_key.pub"
 ssh-keygen -E sha256 -lf "C:\ProgramData\ssh\ssh_host_ecdsa_key.pub"
 ssh-keygen -E sha256 -lf "C:\ProgramData\ssh\ssh_host_ed25519_key.pub"
  • 注意: 确保使用管理员权限运行 PowerShell。

重要: 请注意你的服务器可能不使用所有三种密钥类型 (RSA, ECDSA, ED25519)。 输出中可能会缺少某些密钥类型,这是正常的。你应该提供服务器使用的所有密钥类型的指纹。

2. 通过服务器控制面板/管理界面:

许多云服务提供商、虚拟主机面板(如 cPanel、Plesk)都会在其管理界面中提供服务器的 SSH fingerprint。通常在“服务器信息”、“SSH设置”或“安全”等相关部分查找。

3. 通过 sshd 配置文件:

sshd 的配置文件(通常是 /etc/ssh/sshd_config)中会配置 SSH 服务使用的密钥文件路径。你可以根据这些路径找到密钥文件,然后使用 ssh-keygen 命令生成 fingerprint。

  • 查看 sshd_config 配置文件:
grep -E 'HostKey|Hostkey' /etc/ssh/sshd_config

这会列出 HostKey 或 Hostkey 相关的配置行,例如:

HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
  • 后根据找到的路径,使用 ssh-keygen 命令。

4. 通过客户端连接获取:

你可以使用一个没有配置对应服务器指纹的客户端连接服务器,这样在连接时会打印出服务器的指纹,将打印出的指纹记录即可。

最佳实践:

  • 提供多种 fingerprint: 尽量提供服务器使用的所有密钥类型的 fingerprint (RSA, ECDSA, ED25519),以便不同的客户端都能验证。
  • 使用安全通道传输: 将 fingerprint 通过安全的方式传递给用户,如:
    • 电话或面对面: 适合小范围的用户。
    • 加密通信工具: 例如 Signal, Wire 等。
    • 安全邮件: 使用 PGP 或 S/MIME 加密。
    • 安全的内部文档系统: 保证文档的访问控制。
  • 定期更新指纹: 在更新服务器密钥后,务必更新指纹并通知用户。
  • 文档记录: 将服务器 fingerprint 保存在安全的地方,以备不时之需。

总结:

作为服务器管理员,通过 ssh-keygen 工具从服务器本地获取 fingerprint 是最可靠的方式。确保安全传输 fingerprint 并及时更新,这有助于确保客户端和服务器之间 SSH 连接的安全性。同时,也要注意通过多种方式获取指纹,确保指纹的正确性。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注