通过堡垒机进行 ssh-keyscan

通过堡垒机进行 ssh-keyscan

我在 Openstack 上的堡垒后面运行了一些测试服务器。测试堆栈经常被删除和创建。创建堆栈后,我运行一组 Ansible 脚本来安装和配置服务器。我几乎完全自动化了这个过程,但当ssh-keyscan远程主机位于堡垒主机后面时,我似乎无法开始工作。

这就是我所拥有的~/.ssh/config

Host bastion
  HostName 1.2.3.4
  User myuser
  IdentityFile ~/.ssh/private_key.pem

Host remote-host1
  HostName 192.168.0.123
  User myuser
  IdentityFile ~/.ssh/private_key.pem
  ProxyCommand ssh -W %h:%p bastion

如果我尝试跑步,ssh-keyscan remote-host1我会

getaddrinfo remote-host1: Name or service not known

运行ssh remote-host1有效但会提示

The authenticity of host '192.168.0.123 (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)?

我正试图避免这种情况。

我知道有一个 SSH 选项-o StrictHostKeyChecking=no,可以使用ssh_args配置选项将其传递给 Ansible。但我不想使用它。我还知道,使用 ssh-keyscan 而不检查指纹会导致中间人攻击。在这个测试环境场景中,我愿意承担风险,因为只有我的 IP 被列入白名单才能访问。

答案1

快速谷歌搜索建议ssh-keyscan 不遵守 ssh 配置文件和所有其他 ssh 技巧。(虽然这个线程很旧了)。

使用 Ansible,您可以将 keyscan 任务委托给您的堡垒主机,然后在本地附加您的 known_hosts 文件:

- hosts: localhost
  gather_facts: no
  tasks:
    - command: "ssh-keyscan {{ new_host }}"
      register: new_host_fingerprint
      delegate_to: bastion
    - lineinfile:
        dest: /root/ssh/known_hosts
        line: "{{ item }}"
      with_items: "{{ new_host_fingerprint.stdout_lines }}"

其中new_host是创建主机的 IP 地址(在您的示例中为 192.168.0.123)。

答案2

SSH 到堡垒并ssh-keyscan从那里运行:

ssh bastion ssh-keyscan remote-host1

相关内容