ssh-keyscan através de um bastião

2

Eu tenho alguns servidores de teste rodando atrás de um bastião no Openstack. A pilha de testes é excluída e criada com frequência. Depois que a pilha é criada, eu executo um conjunto de scripts Ansible para instalar e configurar os servidores. Eu tenho o processo quase completamente automatizado, mas parece que não consigo fazer com que ssh-keyscan funcione quando o host remoto está atrás de um host bastion.

Isso é o que eu tenho no meu ~/.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

Se eu tentar executar ssh-keyscan remote-host1 , obtenho

getaddrinfo remote-host1: Name or service not known

A execução de ssh remote-host1 funciona, mas será solicitada

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)?

que estou tentando evitar.

Eu sei que há uma opção de SSH -o StrictHostKeyChecking=no e é possível passar isso para Ansible usando a opção de configuração ssh_args . Eu não gostaria de usá-lo embora. Também estou ciente de que o uso de ssh-keyscan sem verificar a impressão digital permite ataques do tipo man-in-the-middle. Neste cenário de ambiente de teste, estou disposto a assumir o risco, pois somente meu IP está na lista de permissões para acesso.

    
por Steve 02.01.2017 / 12:07

1 resposta

2

O Quick googling sugere que o ssh-keyscan não honra ssh config file e todos os outros truques ssh. (Embora esse segmento seja bem antigo).

Com o Ansible, você pode delegar a tarefa keyscan ao seu bastião e, em seguida, anexá-lo localmente ao arquivo 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

onde new_host é o endereço IP do host criado (192.168.0.123 no seu exemplo).

    
por 02.01.2017 / 16:15