我在使用 ssh 和跳转主机时遇到了奇怪的行为。当设置在机器 A 上运行时(cygwin、OpenSSH_7.1p1、OpenSSL 1.0.2d 2015 年 7 月 9 日)它在机器 B 上不起作用(OpenSSH_6.7p1 Ubuntu-5ubuntu1.3、OpenSSL 1.0.1f 2014 年 1 月 6 日)。 Ansible 应该使用此设置通过堡垒主机连接到远程计算机。
我有以下内容ssh.config
Host bastion
HostName a.a.a.a
ProxyCommand none
UserKnownHostsFile known_hosts
Host *
User user
Port 22
ForwardAgent yes
ProxyCommand ssh [email protected] nc %h %p
PasswordAuthentication no
UserKnownHostsFile known_hosts
这些known_hosts
文件位于同一文件夹中。
呼唤
ssh bastion -F ssh.config
在两台机器上都可以工作。尽管
ssh [email protected] -F ssh.config
只在机器 A 上工作,在 B 上不起作用,导致
The authenticity of host 'a.a.a.a (a.a.a.a)' can't be established.
ECDSA key fingerprint is ###.
我尝试将代理命令更改为
ProxyCommand ssh [email protected] -F ssh.config nc %h %p
这解决了这个问题
ssh [email protected] -F ssh.config
因为它现在可以在两台机器上运行。然而,该配置也由rsync
Ansible 运行,并且由于它是从另一个基本目录运行的,因此ssh.config
无法找到该文件。我不想使用绝对路径来实现可移植性。这些脚本应该在本地计算机(某些 Windows 带有cygwin
)上运行,也可以通过使用远程代理的专用构建服务器运行。
我现在已经设置ProxyCommand
为
ProxyCommand ssh -o UserKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no [email protected] nc %h %p
这适用于 A+B 但也有rsync
/问题ansible
。日志给了我:
msg: Warning: Permanently added 'a.a.a.a' (ECDSA) to the list of known hosts.
主机密钥验证失败。
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.1]
TL;DR 初始配置无法无头工作,因为它需要手动步骤来设置主机密钥。替代方案确实破坏了以下工作流程 ( rsync
)。还有其他选择吗?
答案1
“解决”主机密钥安全性的可能性是使用ssh-keyscan
它将创建文件known_hosts
,然后您可以连接而无需手动检查主机的真实性。
它可以这样使用:
ssh-keyscan hostname > known_hosts
您将失去“一点”安全性,但如果这在受信任的环境中运行,则这是可以接受的。