为什么我的 SSH 已知主机具有哈希值而不是主机名或 IP?

为什么我的 SSH 已知主机具有哈希值而不是主机名或 IP?

我有一个动态 IP 后面的主机,所以我曾经有一个脚本将其地址添加到我的 .ssh/known_hosts 文件中,但最近似乎有些东西发生了变化。我的文件看起来像是受到了哈希怪物的攻击:

|1|Du0QWjqCUrdRK/pnE0PTww2O2Zk=|O31W+SPPLr9+sj1m1K7MfEb+xUQ= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILUT1234567Xu2vvCE1likgUSOXLzEV123456783asaA
|1|K3vgE86MLJTHx8W2sPv1cgP4DI0=|Jattsr5sEW443bnyMKT6W0Noc+k= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILUT1234567Xu2vvCE1likgUSOXLzEV123456783asaA
|1|UlAukzqGavXZvRtMzjvXmHoVeAQ=|0JVjq7YSFulCHmkF46VFwMV/ZBY= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILUT1234567Xu2vvCE1likgUSOXLzEV123456783asaA
  1. 有没有办法回到旧的、不太安全的方法?
  2. 如何轻松创建这种散列格式的条目? (我想编写一个脚本来告诉 ssh 10.0.0.0/24 范围内的任何 IP 都应该与给定的指纹匹配。)

答案1

您可以通过将 SSH 客户端选项设置为“no”来禁用主机名哈希HashKnownHosts:每次在命令行 ( ssh -o HashKnownHosts=no ...) 上或在用户配置文件中,~/.ssh/config如下所示:

Host *
  HashKnownHosts no

不确定如何自己对主机名进行哈希处理,但您可以在文件中混合使用known_hosts哈希条目和非哈希条目,因此您的脚本可以创建非哈希条目。

您可以使用ssh-keygen -H将文件中的所有条目转换known_hosts为其散列形式。

答案2

如何轻松创建这种散列格式的条目?

您没有说明当前如何将密钥添加到已知的主机文件中,但我假设您正在使用ssh-keyscan,因为这是专门为此用例设计的工具:

ssh-keyscan是一个用于收集多个主机的公共 SSH 主机密钥的实用程序。它旨在帮助构建和验证ssh_已知主机文件,其格式记录在SSHD(8)ssh-keyscan提供适合 shell 和 perl 脚本使用的最小接口。

所以,我假设您的脚本当前包含这样的行:

# Delete the entry for the old IP
ssh-keygen -R $OLD_IP

# Add entry for the new IP
ssh-keyscan $NEW_IP >> ~/.ssh/known_hosts

您需要做的就是添加-H旗帜生成散列格式的输出:

ssh-keyscan -H $NEW_IP >> ~/.ssh/known_hosts

(我想编写一个脚本来告诉 ssh 10.0.0.0/24 范围内的任何 IP 都应该与给定的指纹匹配。)

我相信这可以通过更简单的方式实现。

SSH 有一个KnownHostsCommand配置参数,它允许您指定一个命令,以与已知主机文件相同的格式输出主机密钥行。该命令将在 SSH 读取已知主机文件后调用,并允许您根据当前连接尝试的信息动态添加其他条目。

因此,您可以在 SSH 配置文件中添加如下内容:

Host 10.0.0.*
  KnownHostsCommand /usr/bin/env printf "%H ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILUT1234567Xu2vvCE1likgUSOXLzEV123456783asaA"

[我在这里使用这个/usr/bin/env技巧是因为 SSH 要求 的路径是KnownHostsCommand绝对的,而 的路径printf不是标准化的。printf如果需要,您可以使用系统上的绝对路径。]

所以,这意味着:如果您尝试连接的主机与图案 10.0.0.*,然后将调用以下命令的结果添加到主机密钥列表中。该命令依次使用代币 %H(意思是“我们正在尝试查找的主机名”)和您问题中的字符串,为您当前尝试连接的任何 IP 地址构建有效的已知主机密钥行。

无需在已知的主机文件中乱扔 254 个相同的条目。

相关内容