Назад | Перейти на главную страницу

ssh-keys: сканировать бастион

У меня есть несколько тестовых серверов, работающих за бастионом 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-адрес.

Быстрый поиск в Google предлагает этот ssh-keyscan не учитывает конфигурационный файл ssh и все другие уловки ssh. (Хотя эта ветка довольно старая).

С помощью Ansible вы можете делегировать задачу сканирования ключей своему хосту-бастиону, а затем добавить файл 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