ssh-keyscan - 仍然用主机'[主机名]([IP地址])'的真实性无法建立

mor*_*eyc 9 linux ssh ssh-keys

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

无法确定主机 '[hostname] ([IP address])' 的真实性。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
Run Code Online (Sandbox Code Playgroud)

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

当我让 ssh 为我添加这个时,know_hosts 文件中的密钥散列非常不同。

我还应该做些什么来解决这个问题?

ksc*_*rig 6

尝试这个:

ssh-keyscan -t rsa [ip_address]
Run Code Online (Sandbox Code Playgroud)

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

ssh-keygen -H
Run Code Online (Sandbox Code Playgroud)

编辑: 这是一个命令解决方案。它使用主机名和 IP 地址以及两者的哈希值。

ssh-keyscan -Ht rsa [hostname],[IP address] >> known_hosts
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

brad@computer:~$ git clone git@bitbucket.org: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)?
Run Code Online (Sandbox Code Playgroud)

请注意 RSA 密钥指纹...

所以,这是一个 SSH 的东西,这将适用于 git over SSH 和一般的 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
Run Code Online (Sandbox Code Playgroud)

首先,在您的日常驱动程序上安装 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
Run Code Online (Sandbox Code Playgroud)

所以,提前,我们有一种方法可以要求原始主机提供某种形式的身份证明。

在这一点上,我们手动和自动一样容易受到攻击——字符串匹配,我们拥有创建指纹的基础数据,我们可以在未来要求该基础数据(防止冲突)。

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

这种情况下的 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==
Run Code Online (Sandbox Code Playgroud)

第一个注释行令人气愤地出现了——但是您可以通过 ">" 或 ">>" 约定通过简单的重定向来摆脱它。

由于我已尽最大努力获取用于识别“主机”和信任的未受污染的数据,因此我将将此标识添加到 ~/.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
Run Code Online (Sandbox Code Playgroud)

所以,这就是你今天保持处女的方式。您可以在自己的时间按照类似的说明对 github 进行相同的操作。

我看到很多堆栈溢出帖子告诉您以编程方式盲目添加密钥而无需任何检查。您从不同网络上的不同机器检查密钥越多,您就越能相信主机就是它所说的那个主机——这是您可以从这一层安全中获得的最好的希望。

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

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

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