Como ignorar a verificação de autenticação SSH ansível?

164

Existe uma maneira de ignorar a verificação de autenticidade do SSH feita pelo Ansible? Por exemplo, quando acabei de configurar um novo servidor, tenho que responder sim a esta pergunta:

GATHERING FACTS ***************************************************************
The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established.
RSA key fingerprint is xx:yy:zz:....
Are you sure you want to continue connecting (yes/no)?

Sei que geralmente é uma má idéia, mas estou incorporando isso em um script que primeiro cria um novo servidor virtual no meu provedor de nuvem e depois chama automaticamente meu manual ansible para configurá-lo. Eu quero evitar qualquer intervenção humana no meio da execução do script.

Johan
fonte

Respostas:

247

Duas opções - a primeira, como você disse em sua própria resposta, é definir a variável de ambiente ANSIBLE_HOST_KEY_CHECKING como False.

A segunda maneira de configurá-lo é colocá-lo em um arquivo ansible.cfg, e essa é uma opção realmente útil, pois você pode configurá-lo globalmente (no nível do sistema ou do usuário, no /etc/ansible/ansible.cfgou~/.ansible.cfg ) ou em um arquivo de configuração no mesmo diretório como o manual que você está executando.

Para fazer isso, crie um ansible.cfgarquivo em um desses locais e inclua o seguinte:

[defaults]
host_key_checking = False

Você também pode definir muitos outros padrões úteis lá, como coletar ou não fatos no início de uma peça, mesclar hashes declarados em vários locais ou substituir um por outro, e assim por diante. Há uma lista grande de opções aqui nos documentos Ansible.


Edit: uma nota sobre segurança.

A validação da chave do host SSH é uma camada de segurança significativa para hosts persistentes - se você estiver se conectando à mesma máquina várias vezes, é valioso aceitar a chave do host localmente.

Para instâncias do EC2 de maior duração, faria sentido aceitar a chave do host com uma tarefa executada apenas uma vez na criação inicial da instância:

  - name: Write the new ec2 instance host key to known hosts
    connection: local
    shell: "ssh-keyscan -H {{ inventory_hostname }} >> ~/.ssh/known_hosts"

Não há valor de segurança para verificar as chaves do host nas instâncias em que você se levanta dinamicamente e remove logo após a execução do playbook, mas há valor de segurança na verificação de máquinas persistentes nas chaves do host. Portanto, você deve gerenciar a verificação de chave do host de maneira diferente por ambiente lógico.

  • Deixe a verificação ativada por padrão (em ~/.ansible.cfg )
  • Desabilite a verificação de chave do host no diretório de trabalho para playbooks executados em instâncias efêmeras ( ./ansible.cfgjunto com o playbook para testes de unidade contra VMs vagantes, automação para instâncias ec2 de curta duração)
nikobelia
fonte
5
Alguém sabe qual é a melhor prática aqui? Por exemplo, você pode executar periodicamente um script para redefinir seus hosts conhecidos, o que seria mais seguro (a menos que esteja sujeito a um ataque MITM durante essa janela). Ignorando autenticidade por padrão elimina um dos mecanismos de segurança primária SSH
TonyH
3
Gosto do padrão que minha equipe usa: colocamos arquivos ansible.cfg que desabilitam a verificação de chave do host nos diretórios de trabalho dos playbooks que executamos em instâncias efêmeras (testes de unidade executados em VMs vagantes, instâncias do AWS ec2 etc.) e deixamos a verificação ativada em nível do sistema.
Nikobelia
1
Dessa forma, você pode gerenciar a verificação de chave do host por ambiente lógico . Não há valor de segurança para verificar as chaves do host nas instâncias em que você se levanta dinamicamente e remove logo após a execução do playbook, mas há valor de segurança na verificação das chaves do host em busca de máquinas persistentes. Portanto, você deve ter padrões diferentes para esses diferentes casos de uso.
Nikobelia
2
Se algum mecanismo for usado para provisionar novas máquinas, permanentes ou temporárias, esse mecanismo deverá fornecer a chave pública SSH desta máquina. Em seguida, você pode armazená-lo em seus vários known_hostsarquivos locais para que o SSH e o Ansible reconheçam a máquina. Não fazer isso, principalmente desabilitando a verificação de chave do host, diminui a segurança do SSH para quase zero e permite ataques MITM. Muitas máquinas que parecem estar em uma "rede interna" estão realmente conectadas à Internet, onde uma única resposta DNS mais rápida permite que você converse com o invasor em vez do seu alvo.
aef
2
@TonyH ao configurar muitos hosts via AWS Cloudformation e Ansible, executei ssh-keyscan <ip list>em uma máquina confiável (para mim, é um host bastião / jump) dentro da mesma rede e coloquei os resultados em known_hosts Para configurar esse host confiável, a AWS expõe o chave do host nos logs de inicialização da instância; portanto, procurar essa chave era uma etapa manual que eu nunca eliminaria se estivesse fazendo uma recriação completa do meu ambiente. Mas esse host geralmente não precisava ser excluído. Isso pode ajudar.
Dcc310
34

Encontrei a resposta, você precisa definir a variável de ambiente ANSIBLE_HOST_KEY_CHECKINGpara False. Por exemplo:

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...
Johan
fonte
2
Sim, mas você disse que está usando isso para um novo servidor que acabou de configurar. Isso evita ter que lidar com a chave do host dessa vez, mas e as conexões SSH subseqüentes? Seu script de instalação é executado, configura o servidor e está pronto. Agora você tem outros playbooks que você executa, digamos, ou possui scripts que usam SSH. Agora, eles estão quebrados porque a chave do host ainda não está em unknown_hosts. Você atrasou apenas o seu problema. Em resumo, o que você escreveu aqui não parece uma boa resposta para a pergunta que você fez.
Todd Walton
Isso é usado em um script bash ao criar novos servidores, não é usado para mais nada.
Johan
8

encaminhar para nikobelia

Para aqueles que usam o jenkins para executar o play book, acabei de adicionar ao meu trabalho do jenkins antes de executar o ansible-playbook a variável de ambiente ANSIBLE_HOST_KEY_CHECKING = False Por exemplo, isto:

export ANSIBLE_HOST_KEY_CHECKING=False
ansible-playbook 'playbook.yml' \
--extra-vars="some vars..." \
--tags="tags_name..." -vv
dsaydon
fonte
6

Mudar host_key_checkingpara falsepara todos os hosts é uma idéia muito ruim.

A única vez que você deseja ignorá-lo é no "primeiro contato", que essas duas tarefas realizarão:

    - name: Check SSH known_hosts for {{ inventory_hostname }}
      local_action: shell ssh-keygen -F {{ inventory_hostname }}
      register: checkForKnownHostsEntry
      failed_when: false
      changed_when: false
      ignore_errors: yes
    - name: Add {{ inventory_hostname }} to SSH known hosts automatically
      when: checkForKnownHostsEntry.rc == 1
      changed_when: checkForKnownHostsEntry.rc == 1
      set_fact:
        ansible_ssh_common_args: '-o StrictHostKeyChecking=no'

Portanto, apenas desabilitamos a verificação da chave do host se não tivermos a chave do host em nosso known_hostsarquivo.

davidolrik
fonte
3

Você pode transmiti-lo como argumento de linha de comando enquanto executa o manual:

ansible-playbook play.yml --ssh-common-args='-o StrictHostKeyChecking=no'

paresh patil
fonte
2

Se você não deseja modificar ansible.cfgou o playbook.yml, basta definir uma variável de ambiente:

export ANSIBLE_HOST_KEY_CHECKING=False
Rene B.
fonte
0

Use o parâmetro nomeado como validate_certs para ignorar a validação ssh

- ec2_ami:
    instance_id: i-0661fa8b45a7531a7
    wait: yes
    name: ansible
    validate_certs: false
    tags:
      Name: ansible
      Service: TestService

Ao fazer isso, ele ignora o processo de validação ssh

Nitesh Jain
fonte
O validate_certsparâmetro simplesmente diz ao boto para não validar o certificado HTTPS da API da AWS. Não afeta a verificação da chave SSH.
Matthew Dutton
0

Sei que a pergunta foi respondida e está correta também, mas só queria vincular o documento ansible, onde é explicado claramente quando e por que a respectiva verificação deve ser adicionada: verificação da chave do host

justjais
fonte
0

A maioria dos problemas aparece quando você deseja adicionar um novo host ao inventário dinâmico (via módulo add_host) no manual. Não quero desativar permanentemente a verificação de host de impressão digital, para soluções como desativá-lo em um arquivo de configuração global não são aceitáveis ​​para mim. Exportar var como ANSIBLE_HOST_KEY_CHECKINGantes de executar o playbook é outra coisa a ser feita antes da execução que precisa ser lembrada.

É melhor adicionar o arquivo de configuração local no mesmo diretório em que está o manual. Crie um arquivo nomeado ansible.cfge cole o seguinte texto:

[defaults]
host_key_checking = False

Não há necessidade de lembrar de adicionar algo em ambientes ou adicionar ansible-playbookopções. É fácil colocar esse arquivo no repositório ansible do git.

QkiZ
fonte