我可以自动将新主机添加到known_hosts吗?


249

这是我的情况:我正在建立一个测试工具,它将从中央客户端启动多个虚拟机实例,然后通过对其执行命令ssh。虚拟机将具有以前未使用的主机名和IP地址,因此它们将不在~/.ssh/known_hosts中央客户端的文件中。

我遇到的问题是,ssh针对新虚拟实例运行的第一个命令总是带有交互式提示:

The authenticity of host '[hostname] ([IP address])' can't be established.
RSA key fingerprint is [key fingerprint].
Are you sure you want to continue connecting (yes/no)?

有没有一种方法可以绕过它,并使新主机对客户端计算机已经为人所知,也许是通过使用已经包含在虚拟机映像中的公共密钥来实现的?如果可以的话,我真的想避免使用Expect或其他方式来回答交互式提示。


5
对于独立且物理安全的测试环境,自动密钥接受可能会很好。但是,在生产环境中或在不受信任的网络(例如Internet)上自动接受公钥将完全绕过SSH所无法提供的针对中间人攻击的保护。确保您不受MITM攻击侵害的唯一有效方法是通过某些带外可信通道来验证主机的公钥。如果没有建立适度复杂的密钥签名基础结构,就没有安全的方法来自动化它。
Eil

Answers:


141

在配置文件中或通过以下方式将StrictHostKeyChecking选项设置为:no-o

ssh -o StrictHostKeyChecking=no username@hostname.com


62
这会让您在中间攻击时对男人敞开大门,这可能不是一个好主意。
JasperWallace 2013年

9
@JasperWallace,尽管通常这是一个好建议,但是特定的用例(部署测试VM并向其发送命令)应该足够安全。
Massimo 2014年

8
这给出了一个Warning: Permanently added 'hostname,1.2.3.4' (RSA) to the list of known hosts.为了避免该警告,并避免进入被添加到任何known_hosts文件,我做的:ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR -o UserKnownHostsFile=/dev/null username@hostname.com
彼得·五Mørch

11
拒绝投票不能解决问题,并且会带来严重的安全漏洞。
marcv81 '16

12
@Mnebuerquo:如果您担心安全性,那么这个问题将与您毫无关系。您前面有正确的主机密钥,该主机密钥是从要连接的系统的控制台收集的,并且在首次连接时将手动进行验证。您当然不会“自动”执行任何操作。
伊格纳西奥·巴斯克斯

230

IMO,做到这一点的最佳方法如下:

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

这将确保没有重复的条目,使您可以使用主机名和IP地址,也将对输出进行哈希处理,这是一种额外的安全措施。


4
为什么需要全部3个ssh-keyscan?您不能只使用第一个,因为它既适用于主机名也适用于ip?
罗伯特

6
您是否可以确定回复ssh-keyscan请求的机器确实是您要与之对话的机器?如果不是,您就向中间攻击者敞开大门。
JasperWallace 2013年

2
@JasperWallace是的,为此,您至少需要指纹甚至更好的公钥,在这种情况下,您可以将其直接添加到known_hosts,从而解决这个问题。如果您只有指纹,则必须写一个额外的步骤,用您的指纹来验证下载的公钥...

1
ssh-keyscan对我的呼叫失败,因为我的目标主机不支持默认的版本1密钥类型。添加-t rsa,dsa到命令中修复了此问题。
phasetwenty

5
这可能是一个坏主意。您将通过更新这些密钥来使自己接受中间人攻击。为避免重复输入,请检查的返回状态ssh-keygen -F [address]medium.com/@wblankenship/...
retrohacker

93

对于懒惰的人:

ssh-keyscan -H <host> >> ~/.ssh/known_hosts

-H哈希主机名/ IP地址


2
“ ssh-keyscan -H <主机> >>〜/ .ssh / known_hosts”产生的条目更像ssh与用户交互所做的一样。(-H哈希远程主机的名称。)
Sarah Messer

3
易受MITM攻击。您没有检查钥匙指纹。
Mnebuerquo

8
@Mnebuerquo您说该怎么做,但不能说怎么做,这会有所帮助。

4
@jameshfisher是的,它很容易受到MITM攻击,但是您是否曾经将RSA指纹(当您手动执行此操作时,与实际的一台服务器相比)进行了比较?没有?因此,此答案就是为您完成此任务的方法。如果是,您不应该使用此答案并手动执行此操作或实施其他安全措施...
Fivef

2
@Mnebuerquo,如果您还让我们知道一种更好的方式来处理此问题,当我们需要使用无人看管的批处理脚本克隆存储库并且希望绕过此提示时,我将非常高兴。如果您认为这不是正确的解决方案,请提供一些实际的解决方案!
Waqas Shah,

42

如前所述,使用按键扫描将是正确且毫不干扰的方法。

ssh-keyscan -t rsa,dsa HOST 2>&1 | sort -u - ~/.ssh/known_hosts > ~/.ssh/tmp_hosts
mv ~/.ssh/tmp_hosts ~/.ssh/known_hosts

以上将完成添加主机的技巧,仅在尚未添加主机时。它也不是并发安全的。您不得在同一原始计算机上同时执行该代码段,因为tmp_hosts文件可能会被破坏,最终导致known_hosts文件变得肿...


有没有办法检查密钥之前 是否在known_hosts中ssh-keyscan?原因是它需要一些时间和额外的网络连接。
utapyngo 2014年

1
该文件的原始发布者版本具有cat ~/.ssh/tmp_hosts > ~/.ssh/known_hosts,但随后的编辑将其更改为>>。使用>>是错误的。它破坏了第一行中唯一性的目的,并使其在known_hosts每次运行时都将新条目转储到其中。(刚刚发布了修改以将其更改。)
paulmelnikow

1
这会遭受与其他相同的MITM攻击。
Mnebuerquo

@utapyngo ssh-keygen -F将为您提供当前指纹。如果返回空白为1,返回码为1,则说明您没有。如果它打印出一些东西,并且返回码为0,则说明它已经存在。
Rich L

1
如果您非常关心MITM,请部署DNSSEC和SSHFP记录,或使用其他一些安全的方式分发密钥,而这种混合解决方案将是无关紧要的。
Zart

19

您可以使用ssh-keyscan命令来获取公钥并将其附加到known_hosts文件中。


3
确保检查指纹以确保它是正确的密钥。否则,您可能会遭受MITM攻击。
Mnebuerquo

3
@Mnebuerquo一般情况下的公平点,但是如果有人已经知道正确的密钥是什么,为什么有人会尝试以编程方式收集密钥?
布赖恩·克莱恩

这不是这样做的方法。MITM。
jameshfisher

8

这是将ssh-keyscan整合到游戏中的方法:

---
# ansible playbook that adds ssh fingerprints to known_hosts
- hosts: all
  connection: local
  gather_facts: no
  tasks:
  - command: /usr/bin/ssh-keyscan -T 10 {{ ansible_host }}
    register: keyscan
  - lineinfile: name=~/.ssh/known_hosts create=yes line={{ item }}
    with_items: '{{ keyscan.stdout_lines }}'

1
您是否正在上载一个有效的已知known_hosts文件,或者正在执行ssh-keyscan并将输出转储到known_hosts中而不验证指纹?
Mnebuerquo

1
这只是转储按键扫描的输出,是的。因此,实际上,它与StrictHostKeyChecking = no相同,只是在不更改ssh选项的情况下更新了已知的已知主机。由于ssh-keyscan返回多行,因此该解决方案也不起作用,导致该任务始终被标记为“已更改”
Zart

这不是这样做的方法。MITM。
jameshfisher

3
@jameshfisher如果您还需要让我们知道一种更好的方法来处理此问题,当我们需要使用无人看管的批处理脚本来克隆存储库并且希望绕过此提示时,我将非常高兴。如果您认为这不是正确的解决方案,请提供一些实际的解决方案!如果您认为这样做不是正确的方法,请告诉我们“怎么做”!
Waqas Shah

这是将值添加到known_hosts的一种非常有效的方法,但是是的,它容易受到MITM的影响。但是,供内部使用是可以的。
卡梅隆·洛厄尔·帕尔默

7

这将是一个完整的解决方案,仅第一次接受主机密钥

#!/usr/bin/env ansible-playbook
---
- name: accept ssh fingerprint automatically for the first time
  hosts: all
  connection: local
  gather_facts: False

  tasks:
    - name: "check if known_hosts contains server's fingerprint"
      command: ssh-keygen -F {{ inventory_hostname }}
      register: keygen
      failed_when: keygen.stderr != ''
      changed_when: False

    - name: fetch remote ssh key
      command: ssh-keyscan -T5 {{ inventory_hostname }}
      register: keyscan
      failed_when: keyscan.rc != 0 or keyscan.stdout == ''
      changed_when: False
      when: keygen.rc == 1

    - name: add ssh-key to local known_hosts
      lineinfile:
        name: ~/.ssh/known_hosts
        create: yes
        line: "{{ item }}"
      when: keygen.rc == 1
      with_items: '{{ keyscan.stdout_lines|default([]) }}'

1
这不是这样做的方法。MITM。
jameshfisher

6

我遇到了类似的问题,发现提供的某些答案仅使我成为自动化解决方案的一部分。以下是我最终使用的内容,希望对您有所帮助:

ssh -o "StrictHostKeyChecking no" -o PasswordAuthentication=no 10.x.x.x

它将密钥添加到known_hosts并且不提示输入密码。


2
易受MITM攻击。您没有检查指纹。
Mnebuerquo

6
没有人检查指纹。
布伦丹·伯德

这不是这样做的方法。MITM。
jameshfisher

5

因此,我正在寻找一种平凡的方法来绕过克隆git repo的未知主机手动交互,如下所示:

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)?

注意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

首先,在日常驱动程序上安装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进行相同的操作。

我看到很多堆栈溢出帖子,告诉您以编程方式盲目添加密钥,而无需进行任何检查。您检查来自不同网络上不同计算机的密钥的次数越多,您对主机就是它所说的主机的信任就越多-这就是您希望从此安全层获得的最好的信任。

错误 ssh -oStrictHostKeyChecking =没有主机名[命令]

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

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


我认为这是解决此问题的最佳方法。但是,在Amazon EC2之类的设备上使用Nmap时要非常小心,我收到有关Nmap进行端口扫描的警告!进行portcanning之前,请填写其表单!
Waqas Shah,

嗯,是的 我不知道为什么要从EC2进行端口扫描。如果您已登录帐户,则只能从实际计算机上获取密钥。对于您无法控制的机器,这更多。我假设您将拥有一台不受AWS端口扫描限制的本地计算机。但是,如果您处于这种极端情况下,必须使用AWS运行nmap,我想此警告会有所帮助。
BradChesney79 2016年

使用nmap从您的工作站读取SSH主机密钥,然后信任该值与在关闭了StructHostKeyChecking的情况下通过SSH连接没有什么不同。它同样容易受到中间人攻击。
Micah R Ledbetter

... @ MicahRLedbetter,这就是为什么我建议“来自不同计算机和网络的更多比较通常会提高您信任连接的能力”的原因。但是,这就是我的意思。如果您只从一组环境条件中检查目标主机,那么您将如何知道任何差异?您有更好的建议吗?
BradChesney79 '18

1
这是安全剧院。做一些复杂的事情来创建更高安全性的外观。您可以使用多少种不同的方法来询问主机的密钥,这无关紧要。就像多次询问同一个人是否可以信任他们(也许您打电话,发电子邮件,发短信和蜗牛邮件一样)。他们总是会说“是”,但是如果您问错人了,那就没关系了。
大大超人

5

我编写了一个单行脚本,该脚本有点长,但对于使用多个IP的主机执行此任务很有用digbash

(host=github.com; ssh-keyscan -H $host; for ip in $(dig @8.8.8.8 github.com +short); do ssh-keyscan -H $host,$ip; ssh-keyscan -H $ip; done) 2> /dev/null >> .ssh/known_hosts

5

以下避免〜/ .ssh / known_hosts中的重复条目:

if ! grep "$(ssh-keyscan github.com 2>/dev/null)" ~/.ssh/known_hosts > /dev/null; then
    ssh-keyscan github.com >> ~/.ssh/known_hosts
fi

1
这不是这样做的方法。MITM。
jameshfisher

我最喜欢这个答案。对于脚本化的初始VPS脚本,除了我以外,其他人都不重要,MITM的风险正在逐渐减小。无穷小怪癖...第一行必须是mkdir -p ~/.ssh/known_hosts;
Martin Bramwell

5

您如何建造这些机器?您可以运行dns更新脚本吗?您可以加入IPA域吗?

FreeIPA会自动执行此操作,但实际上您所需要的只是您区域上的SSHFP dns记录和DNSSEC(freeipa提供作为可配置选项(默认情况下,禁用dnssec))。

您可以通过运行从主机获取现有的SSHFP记录。

ssh-keygen -r jersey.jacobdevans.com

jersey.jacobdevans.com IN SSHFP 1 1 4d8589de6b1a48e148d8fc9fbb967f1b29f53ebc jersey.jacobdevans.com IN SSHFP 1 2 6503272a11ba6d7fec2518c02dfed88f3d455ac7786ee5dbd72df63307209d55 jersey.jacobdevans.com IN SSHFP 3 1 5a7a1e8ab8f25b86b63c377b303659289b895736> jersey.jacobdevans.com IN SSHFP 3 2 1f50f790117dfedd329dbcf622a7d47551e12ff5913902c66a7da28e47de4f4b

然后发布后,您将添加VerifyHostKeyDNS yes到ssh_config或〜/ .ssh / config

如果/当Google决定启用DNSSEC时,您可以在没有主机密钥提示的情况下进行ssh输入。

ssh jersey.jacobdevans.com

但是我的域尚未签名,所以现在您将看到...。

debug1:服务器主机密钥:ecdsa-sha2-nistp256 SHA256:H1D3kBF9 / t0ynbz2IqfUdVHhL / WROQLGan2ijkfeT0s

debug1:在DNS中找到4个不安全的指纹

debug1:匹配主机密钥指纹

在DNS中找不到主机'jersey.jacobdevans.com(2605:6400:10:434 :: 10)的真实性无法建立。ECDSA密钥指纹为SHA256:H1D3kBF9 / t0ynbz2IqfUdVHhL / WROQLGan2ijkfeT0s。在DNS中找到匹配的主机密钥指纹。您确定要继续连接(是/否)吗?没有


4

为了正确地执行此操作,您真正想要做的是在创建VM时收集VM的主机公共密钥,并将其放入known_hosts格式的文件中。然后-o GlobalKnownHostsFile=...,您可以使用指向该文件的来确保您正在连接到您认为应该连接的主机。如何执行此操作取决于您如何设置虚拟机,但是,如果可能的话,从虚拟文件系统中读取它,或者甚至让主机/etc/ssh/ssh_host_rsa_key.pub在配置过程中打印其内容也可以解决问题。

也就是说,这可能不值得,具体取决于您正在哪种环境中工作以及预期的对手是谁。如上面其他几个答案所述,进行简单的“首次连接存储”(通过扫描或仅在第一个“实际”连接期间进行存储)可能会相当容易,并且仍然提供一定程度的安全性。但是,如果这样做,我强烈建议您将用户已知的主机文件(-o UserKnownHostsFile=...)更改为特定于此特定测试安装的文件。这样可以避免使用测试信息污染您的个人已知主机文件,并在删除VM时轻松清除现在无用的公钥。


4

这整个

  • ssh键扫描
  • ssh-copy-id
  • ECSDA关键警告

业务一直让我烦恼,所以我选择了

一个脚本来统治所有人

这是位于https://askubuntu.com/a/949731/129227的脚本的变体,其中Amadu Bah的回答为https://serverfault.com/a/858957/162693

范例通话

./sshcheck somedomain site1 site2 site3

该脚本将循环遍历名称站点,并修改.ssh / config和.ssh / known_hosts文件,并根据请求执行ssh-copy-id-对于最后一个功能,只是让ssh测试调用失败,例如,按回车3次密码请求。

sshcheck脚本

#!/bin/bash
# WF 2017-08-25
# check ssh access to bitplan servers

#ansi colors
#http://www.csc.uvic.ca/~sae/seng265/fall04/tips/s265s047-tips/bash-using-colors.html
blue='\033[0;34m'  
red='\033[0;31m'  
green='\033[0;32m' # '\e[1;32m' is too bright for white bg.
endColor='\033[0m'

#
# a colored message 
#   params:
#     1: l_color - the color of the message
#     2: l_msg - the message to display
#
color_msg() {
  local l_color="$1"
  local l_msg="$2"
  echo -e "${l_color}$l_msg${endColor}"
}

#
# error
#
#   show an error message and exit
#
#   params:
#     1: l_msg - the message to display
error() {
  local l_msg="$1"
  # use ansi red for error
  color_msg $red "Error: $l_msg" 1>&2
  exit 1
}

#
# show the usage
#
usage() {
  echo "usage: $0 domain sites"
  exit 1 
}

#
# check known_hosts entry for server
#
checkknown() {
  local l_server="$1"
  #echo $l_server
  local l_sid="$(ssh-keyscan $l_server 2>/dev/null)" 
  #echo $l_sid
  if (! grep "$l_sid" $sknown) > /dev/null 
  then
    color_msg $blue "adding $l_server to $sknown"
    ssh-keyscan $l_server >> $sknown 2>&1
  fi
}

#
# check the given server
#
checkserver() {
  local l_server="$1"
  grep $l_server $sconfig > /dev/null
  if [ $? -eq 1 ]
  then
    color_msg $blue "adding $l_server to $sconfig"
    today=$(date "+%Y-%m-%d")
    echo "# added $today by $0"  >> $sconfig
    echo "Host $l_server" >> $sconfig
    echo "   StrictHostKeyChecking no" >> $sconfig
    echo "   userKnownHostsFile=/dev/null" >> $sconfig
    echo "" >> $sconfig
    checkknown $l_server
  else
    color_msg $green "$l_server found in $sconfig"
  fi
  ssh -q $l_server id > /dev/null
  if [ $? -eq 0 ]
  then
    color_msg $green "$l_server accessible via ssh"
  else
    color_msg $red "ssh to $l_server failed" 
    color_msg $blue "shall I ssh-copy-id credentials to $l_server?"
    read answer
    case $answer in
      y|yes) ssh-copy-id $l_server
    esac
  fi
}

#
# check all servers
#
checkservers() {
me=$(hostname -f)
for server in $(echo $* | sort)
do
  os=`uname`
  case $os in
   # Mac OS X
   Darwin*)
     pingoption=" -t1";;
    *) ;;
  esac

  pingresult=$(ping $pingoption -i0.2 -c1 $server)
  echo $pingresult | grep 100 > /dev/null
  if [ $? -eq 1 ]
  then 
    checkserver $server
    checkserver $server.$domain
  else
    color_msg $red "ping to $server failed"
  fi
done
}

#
# check configuration
#
checkconfig() {
#https://askubuntu.com/questions/87449/how-to-disable-strict-host-key-checking-in-ssh
  if [ -f $sconfig ]
  then
    color_msg $green "$sconfig exists"
    ls -l $sconfig
  fi
}

sconfig=~/.ssh/config
sknown=~/.ssh/known_hosts

case  $# in
  0) usage ;;
  1) usage ;;
  *) 
    domain=$1 
    shift 
    color_msg $blue "checking ssh configuration for domain $domain sites $*"
    checkconfig
    checkservers $* 
    #for server in $(echo $* | sort)
    ##do
    #  checkknown $server 
    #done
    ;;
esac

2

这是如何收集主机的方法

定义主机集合

ssh_hosts:
  - server1.domain.com
  - server2.domain.com
  - server3.domain.com
  - server4.domain.com
  - server5.domain.com
  - server6.domain.com
  - server7.domain.com
  - server8.domain.com
  - server9.domain.com

然后定义两个任务以将密钥添加到已知主机:

- command: "ssh-keyscan {{item}}"
   register: known_host_keys
   with_items: "{{ssh_hosts}}"
   tags:
     - "ssh"

 - name: Add ssh keys to know hosts
   known_hosts:
     name: "{{item.item}}"
     key: "{{item.stdout}}"
     path: ~/.ssh/known_hosts
   with_items: "{{known_host_keys.results}}"

0

最好是检查每个新服务器/主机的指纹。这是认证服务器的唯一方法。没有它,您的SSH连接可能会受到中间人攻击

如果您确实确定要忽略对指纹的检查,则使用次优,安全性较低的第二个选项是OpenSSH 7.6版(2017-10-03)中StrictHostKeyChecking=accept-new引入的选项:

第一个“接受新”将自动接受迄今未见过的密钥,但拒绝更改或无效的主机密钥的连接。

不要使用旧值,StrictHostKeyChecking=no从来没有检查服务器的真实性可言。(尽管此=no设置的含义将在以后的某些版本中翻转。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.