ssh-keyscan - 仍然提升为无法确定主机‘[主机名]([IP 地址])’的真实性

ssh-keyscan - 仍然提升为无法确定主机‘[主机名]([IP 地址])’的真实性

我正在编写一个远程 rsync 设置脚本,需要将远程服务器添加到本地 known_hosts 文件,以避免在首次运行脚本时出现以下提示:

无法确认主机“[主机名] ([IP 地址])”的真实性。RSA 密钥指纹为 [密钥指纹]。您确定要继续连接吗(是/否)?

按照我可以自动将新主机添加到known_hosts吗?我已经尝试过(使用新的known_hosts文件):

ssh-keyscan -H [hostname],[ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [hostname] >> ~/.ssh/known_hosts

但这不起作用,总是提示我接受指纹。

当我让 ssh 为我添加此功能时,know_hosts 文件中的密钥哈希值非常不同。

我还应该做什么来解决此问题?

答案1

尝试这个:

ssh-keyscan -t rsa [ip_address]

获取输出并将其粘贴到 .ssh/known_hosts 中。现在,如果您想对 known_hosts 进行哈希处理,请执行以下操作:

ssh-keygen -H

编辑: 这是一条命令的解决方案。它使用主机名和 IP 地址并对二者进行哈希处理。

ssh-keyscan -Ht rsa [hostname],[IP address] >> known_hosts

答案2

kschurig 的答案可行,但不一定是最安全的。它确实会因为让您通过多个 URI(即主机名和 IP 地址)识别服务器而获得加分。也就是说,您可以通过扩展逗号分隔列表来继续添加该主机的有效 URI。

然而,我正在寻找一种平凡的方法来绕过克隆 git repo 的未知主机手动交互,如下所示,它应该有助于解释发生了什么以及如何避免编写一些与 SSH 相关的事情的脚本的这一部分:

brad@computer:~$ git clone [email protected]:viperks/viperks-api.git
Cloning into 'viperks-api'...
The authenticity of host 'bitbucket.org (104.192.143.3)' can't be established.
RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)?

注意 RSA 密钥指纹...

所以,这是一个 SSH 的事情,它将适用于通过 SSH 的 git 以及一般与 SSH 相关的事情......

brad@computer:~$ nmap bitbucket.org --script ssh-hostkey

Starting Nmap 7.01 ( https://nmap.org ) at 2016-10-05 10:21 EDT
Nmap scan report for bitbucket.org (104.192.143.3)
Host is up (0.032s latency).
Other addresses for bitbucket.org (not scanned): 104.192.143.2 104.192.143.1 2401:1d80:1010::150
Not shown: 997 filtered ports
PORT    STATE SERVICE
22/tcp  open  ssh
| ssh-hostkey:
|   1024 35:ee:d7:b8:ef:d7:79:e2:c6:43:9e:ab:40:6f:50:74 (DSA)
|_  2048 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40 (RSA)
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 42.42 seconds

首先,在您的日常驱动器上安装 nmap。nmap 对于某些事情非常有用,例如检测开放端口和手动验证 SSH 指纹。但是,回到我们正在做的事情上。

很好。我检查过的多个地方和机器要么受到了攻击,要么更合理的解释就是一切都很顺利。

那个“指纹”只是为了方便我们而用单向算法缩短的字符串,但存在多个字符串解析为相同指纹的风险。这种情况会发生,这被称为冲突。

无论如何,回到我们可以在下面的上下文中看到的原始字符串。

brad@computer:~$ ssh-keyscan bitbucket.org
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-128
no hostkey alg
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-129
bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-123
no hostkey alg

因此,我们有办法提前向原始宿主索取身份证明。

此时,我们手动操作与自动操作一样容易受到攻击 - 字符串匹配,我们拥有创建指纹的基础数据,并且我们可以在将来请求该基础数据(防止冲突)。

现在以一种防止询问主机真实性的方式使用该字符串......

在这种情况下,known_hosts 文件不使用纯文本条目。当您看到散列条目时,您就会知道它们,它们看起来像带有随机字符的散列,而不是 xyz.com 或 123.45.67.89。

brad@computer:~$ ssh-keyscan -t rsa -H bitbucket.org
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-128
|1|yr6p7i8doyLhDtrrnWDk7m9QVXk=|LuKNg9gypeDhfRo/AvLTAlxnyQw= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==

第一个注释行令人恼火地出现了——但您可以通过“>”或“>>”约定使用简单的重定向来摆脱它。

由于我已尽力获取未受污染的数据以用于识别“主机”和信任,因此我将把此标识添加到我的 ~/.ssh 目录中的 known_hosts 文件中。由于现在它将被识别为已知主机,因此我不会收到上述提示,就像您还是个孩子时一样。

感谢您的支持,现在就开始吧。我正在添加 bitbucket RSA 密钥,以便我可以作为 CI 工作流的一部分以非交互方式与那里的 git 存储库进行交互,但您可以按照自己的意愿进行操作。

#!/bin/bash
cp ~/.ssh/known_hosts ~/.ssh/known_hosts.old && echo "|1|yr6p7i8doyLhDtrrnWDk7m9QVXk=|LuKNg9gypeDhfRo/AvLTAlxnyQw= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==" >> ~/.ssh/known_hosts

所以,这就是你今天保持处女身份的方法。你可以在自己的时间按照类似的指示对 github 做同样的事情。

我看到很多 Stack Overflow 帖子都告诉你,要盲目地以编程方式添加密钥,而无需进行任何检查。你对不同网络上不同机器的密钥检查得越多,你就越能相信主机就是它所说的那个主机——这是你能从这一层安全中获得的最好结果。

错误的 ssh -oStrictHostKeyChecking=no 主机名 [命令]

错误的 ssh-keyscan -t rsa -H 主机名 >> ~/.ssh/known_hosts

请不要做上述任何一件事。您有机会增加避免有人通过中间人攻击窃听您的数据传输的机会——抓住这个机会。区别在于验证您拥有的 RSA 密钥是否是真正的服务器的密钥,现在您知道如何获取该信息来比较它们,以便您可以信任连接。只需记住,从不同的计算机和网络进行更多比较通常会增加您对连接的信任度。

相关内容