gar*_*les 298 linux ssh known-hosts
这是我的情况:我正在设置一个测试工具,它将从中央客户端启动多个虚拟机实例,然后通过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)?
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以绕过这个问题并使客户端机器已经知道新主机,也许是通过使用已经嵌入到虚拟机映像中的公钥?如果可以的话,我真的很想避免使用 Expect 或其他任何东西来回答交互式提示。
yar*_*ena 259
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
Run Code Online (Sandbox Code Playgroud)
这将确保没有重复的条目,您的主机名和 IP 地址都被覆盖,并且还将散列输出,这是一项额外的安全措施。
Ign*_*ams 175
将StrictHostKeyChecking选项设置为no,在配置文件中或通过-o:
ssh -o StrictHostKeyChecking=no username@hostname.com
fiv*_*vef 119
对于懒人:
ssh-keyscan -H <host> >> ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)
-H 散列主机名/IP 地址
小智 43
如前所述,使用按键扫描将是正确且不显眼的方法。
ssh-keyscan -t rsa,dsa HOST 2>&1 | sort -u - ~/.ssh/known_hosts > ~/.ssh/tmp_hosts
mv ~/.ssh/tmp_hosts ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)
仅当尚未添加主机时,上述内容才可以添加主机。它也不是并发安全的;您不能在同一台机器上同时多次执行该代码段,因为 tmp_hosts 文件可能会被破坏,最终导致 known_hosts 文件变得臃肿...
Ale*_*lex 19
您可以使用ssh-keyscan命令来获取公钥并将其附加到您的known_hosts文件中。
Dom*_*nik 13
检查每个新服务器/主机的指纹。这是验证服务器身份的唯一方法。如果没有它,您的 SSH 连接可能会受到中间人攻击。
Do not use the old value StrictHostKeyChecking=no which never checks the authenticity of the server at all. Though the meaning of StrictHostKeyChecking=no is planned to be flipped later.
Second option, but less secure, is to use StrictHostKeyChecking=accept-new, which was introduced in version 7.6 (2017-10-03) of OpenSSH:
The first "accept-new" will automatically accept hitherto-unseen keys but will refuse connections for changed or invalid hostkeys.
Zar*_*art 10
这是将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.results | map(attribute='stdout_lines') | list }}'
Run Code Online (Sandbox Code Playgroud)
这将是一个完整的解决方案,仅第一次接受主机密钥
#!/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([]) }}'
Run Code Online (Sandbox Code Playgroud)
要正确执行此操作,您真正想做的是在创建 VM 时收集它们的主机公钥,并将它们按known_hosts格式放入文件中。然后-o GlobalKnownHostsFile=...,您可以使用, 指向该文件,以确保您连接到您认为应该连接的主机。你如何做到这一点取决于你如何设置虚拟机,但是,如果可能的话,从虚拟文件系统中读取它,或者甚至让主机/etc/ssh/ssh_host_rsa_key.pub在配置期间打印内容可能会成功。
也就是说,这可能不值得,这取决于您在什么样的环境中工作以及您预期的对手是谁。如上述其他几个答案中所述,执行简单的“首次连接时存储”(通过扫描或仅在第一次“真实”连接期间)可能会容易得多,并且仍能提供一些安全性。但是,如果您这样做,我强烈建议您将用户已知的主机文件 ( -o UserKnownHostsFile=...) 更改为特定于此特定测试安装的文件;这将避免使用测试信息污染您的个人已知主机文件,并在您删除 VM 时轻松清理现在无用的公钥。
我做了一个单行脚本,有点长,但对于具有多个 IP 的主机执行此任务很有用,使用dig和bash
(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
Run Code Online (Sandbox Code Playgroud)
我有一个类似的问题,发现提供的一些答案只是让我部分地获得了自动化解决方案。以下是我最终使用的内容,希望对您有所帮助:
ssh -o "StrictHostKeyChecking no" -o PasswordAuthentication=no 10.x.x.x
Run Code Online (Sandbox Code Playgroud)
它将密钥添加到known_hosts并且不提示输入密码。
你如何建造这些机器?你能运行一个 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 中找到匹配的主机密钥指纹。您确定要继续连接吗(是/否)?不
小智 6
以下避免在 ~/.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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
436656 次 |
| 最近记录: |