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