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 и это можно передать в Ansible с помощью ssh_args Вариант конфигурации. Я не хотел бы использовать это все же. Я также знаю, что использование ssh-keyscan без проверки отпечатка пальца позволяет атаковать "человек посередине". В этом тестовом сценарии я готов пойти на риск, потому что только мой IP занесен в белый список для доступа.

1 ответ

Решение

Быстрый поиск в Google предполагает, что 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).

SSH до бастиона и беги ssh-keyscan оттуда:

ssh bastion ssh-keyscan remote-host1
Другие вопросы по тегам