Come ignorare il controllo di autenticità SSH rispondibile?


165

Esiste un modo per ignorare il controllo di autenticità SSH effettuato da Ansible? Ad esempio, quando ho appena installato un nuovo server, devo rispondere di sì a questa domanda:

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

So che questa è generalmente una cattiva idea, ma la sto incorporando in uno script che prima crea un nuovo server virtuale presso il mio provider cloud e quindi chiama automaticamente il mio playbook Ansible per configurarlo. Voglio evitare qualsiasi intervento umano nel mezzo dell'esecuzione della sceneggiatura.

Risposte:


248

Due opzioni: la prima, come hai detto nella tua risposta, è impostare la variabile di ambiente ANSIBLE_HOST_KEY_CHECKINGsu False.

Il secondo modo per impostarlo è metterlo in un file ansible.cfg, e questa è un'opzione davvero utile perché puoi impostarla globalmente (a livello di sistema o utente, in /etc/ansible/ansible.cfgo ~/.ansible.cfg), o in un file di configurazione nella stessa directory come il playbook che stai utilizzando.

Per fare ciò, crea un ansible.cfgfile in una di quelle posizioni e includi questo:

[defaults]
host_key_checking = False

Puoi anche impostare molte altre impostazioni predefinite a portata di mano, come se raccogliere o meno i fatti all'inizio di una rappresentazione, se unire gli hash dichiarati in più punti o sostituirli uno con l'altro, e così via. C'è un intero elenco di opzioni qui nei documenti Ansible.


Modifica: una nota sulla sicurezza.

La convalida della chiave host SSH è un livello di sicurezza significativo per host persistenti : se ci si connette più volte allo stesso computer, è utile accettare la chiave host a livello locale.

Per istanze EC2 di lunga durata, sarebbe logico accettare la chiave host con un'attività eseguita una sola volta alla creazione iniziale dell'istanza:

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

Non esiste alcun valore di sicurezza per il controllo delle chiavi host su istanze che si alzano dinamicamente e si rimuovono subito dopo l'esecuzione del playbook, ma esiste un valore di sicurezza nel controllo delle chiavi host per macchine persistenti. Quindi è necessario gestire il controllo della chiave host in modo diverso per ambiente logico.

  • Lascia il controllo abilitato per impostazione predefinita (in ~/.ansible.cfg)
  • Disabilita il controllo della chiave host nella directory di lavoro per i playbook che esegui contro istanze effimere ( ./ansible.cfginsieme al playbook per test unitari contro macchine virtuali vaganti, automazione per istanze ec2 di breve durata)

5
Qualcuno sa qual è la migliore pratica qui? Ad esempio, potresti periodicamente eseguire uno script per ripristinare i tuoi host conosciuti, il che sarebbe più sicuro (a meno che non sia soggetto ad un attacco MITM durante quella finestra). Ignorare l'autenticità per impostazione predefinita elimina uno dei meccanismi di sicurezza primari SSH
TonyH,

3
Mi piace lo schema usato dal mio team: inseriamo i file ansible.cfg che disabilitano il controllo della chiave host nelle directory di lavoro per i playbook che eseguiamo contro istanze effimere (unit test eseguiti su macchine virtuali vaganti, istanze AWS ec2, ecc.) E lasciamo abilitato il controllo su livello di sistema.
nikobelia,

1
In questo modo, è possibile gestire il controllo della chiave host per ambiente logico . Non esiste alcun valore di sicurezza per il controllo delle chiavi host su istanze che si alzano dinamicamente e si rimuovono subito dopo l'esecuzione del playbook, ma esiste un valore di sicurezza nel controllo delle chiavi host per macchine persistenti. Quindi dovresti avere impostazioni predefinite diverse per quei diversi casi d'uso.
nikobelia,

2
Se viene utilizzato un meccanismo per eseguire il provisioning di nuove macchine, permanenti o temporanee, tale meccanismo dovrebbe fornire la chiave pubblica SSH di questa macchina. È quindi possibile memorizzarlo nei vari known_hostsfile locali per consentire a SSH e Ansible di riconoscere la macchina. In caso contrario, soprattutto disabilitando il controllo della chiave host, la sicurezza di SSH si riduce a quasi a zero e consente gli attacchi MITM. Molte macchine ritenute in una "rete interna" sono in realtà connesse a Internet, dove una singola risposta DNS più veloce ti consente di parlare con l'attaccante invece del tuo obiettivo.
aef

2
@TonyH durante la configurazione di molti host tramite AWS Cloudformation e Ansible, ho eseguito ssh-keyscan <ip list>su una macchina attendibile (per me, è un host bastion / jump) all'interno della stessa rete e ho inserito i risultati known_hosts Per impostare quell'host attendibile, AWS espone il chiave host nei log di avvio dell'istanza, quindi cercare quella chiave era un passaggio manuale che non avrei mai escluso se stavo facendo una ricreazione completa del mio ambiente. Ma quell'host di solito non aveva bisogno di essere eliminato. Questo può aiutare.
dcc310,

34

Ho trovato la risposta, è necessario impostare la variabile di ambiente ANSIBLE_HOST_KEY_CHECKINGsu False. Per esempio:

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...

2
Sì, ma hai detto che lo stai usando per un nuovo server che hai appena configurato. Questo evita di dover gestire la chiave host questa volta, ma per quanto riguarda le successive connessioni SSH? Lo script di installazione viene eseguito, configura il server ed è fatto. Ora hai altri playbook che esegui, diciamo, o hai script che usano SSH. Ora sono danneggiati perché la chiave host non è ancora in known_hosts. Hai solo ritardato il tuo problema. In breve, ciò che hai scritto qui non sembra una buona risposta alla domanda che hai posto.
Todd Walton,

Questo è usato in uno script bash durante la creazione di nuovi server, non è usato per nient'altro.
Johan

8

in avanti verso la nikobelia

Per coloro che usano jenkins per eseguire il playbook, ho appena aggiunto al mio lavoro jenkins prima di eseguire ansible-playbook la variabile di ambiente he ANSIBLE_HOST_KEY_CHECKING = False Ad esempio questo:

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

6

Passando host_key_checkingafalse per tutti gli host è una pessima idea.

L'unica volta che si desidera ignorarlo, è al "primo contatto", che questi due compiti eseguiranno:

    - 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'

Quindi disattiviamo il controllo della chiave host solo se non abbiamo la chiave host nel nostro known_hostsfile.


3

Puoi passarlo come argomento da riga di comando durante l'esecuzione del playbook:

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


2

Se non si desidera modificare ansible.cfgo playbook.ymlquindi è possibile impostare una variabile di ambiente:

export ANSIBLE_HOST_KEY_CHECKING=False

1

Ignorare il controllo è una cattiva idea in quanto ti rende suscettibile agli attacchi man-in-the-middle.

Ho preso la libertà di migliorare la risposta di nikobelia da solo aggiungendo la chiave di ogni macchina una volta e in realtà l'impostazione ok / stato cambiato in Ansible:

- name: Accept EC2 SSH host keys
  connection: local
  become: false
  shell: |
    ssh-keygen -F {{ inventory_hostname }} || 
      ssh-keyscan -H {{ inventory_hostname }} >> ~/.ssh/known_hosts
  register: known_hosts_script
  changed_when: "'found' not in known_hosts_script.stdout"

Tuttavia, Ansible inizia a raccogliere dati prima dell'esecuzione dello script, che richiede una connessione SSH, quindi dobbiamo disabilitare questa attività o spostarla manualmente in un secondo momento:

- name: Example play
  hosts: all
  gather_facts: no  # gather facts AFTER the host key has been accepted instead

  tasks:

  # /programming/32297456/
  - name: Accept EC2 SSH host keys
    connection: local
    become: false
    shell: |
      ssh-keygen -F {{ inventory_hostname }} ||
        ssh-keyscan -H {{ inventory_hostname }} >> ~/.ssh/known_hosts
    register: known_hosts_script
    changed_when: "'found' not in known_hosts_script.stdout"
  
  - name: Gathering Facts
    setup:

Un nodo che non sono stato in grado di capire è che segna tutto come modificato anche se aggiunge solo una chiave. Se qualcuno potesse contribuire con una soluzione sarebbe fantastico!


0

Utilizzare il parametro denominato validate_certs per ignorare la convalida ssh

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

In questo modo ignora il processo di validazione ssh


Il validate_certsparametro dice semplicemente a boto di non convalidare il certificato HTTPS dell'API AWS. Non influisce sulla verifica della chiave SSH.
Matthew Dutton,

0

So che la domanda ha avuto una risposta ed è anche corretta, ma volevo solo collegare il documento di risposta in cui è spiegato chiaramente quando e perché aggiungere il rispettivo controllo: controllo chiave host


0

La maggior parte dei problemi si presenta quando si desidera aggiungere un nuovo host all'inventario dinamico (tramite il modulo add_host) nel playbook. Non voglio disabilitare il controllo dell'host di impronte digitali in modo permanente, quindi soluzioni come disabilitarlo in un file di configurazione globale non mi vanno bene. Esportazione var comeANSIBLE_HOST_KEY_CHECKING prima di eseguire il playbook è un'altra cosa da fare prima di eseguire che è necessario ricordare.

È meglio aggiungere il file di configurazione locale nella stessa directory in cui si trova il playbook. Crea un file chiamatoansible.cfg e incolla il seguente testo:

[defaults]
host_key_checking = False

Non è necessario ricordare di aggiungere qualcosa in ambiente o di aggiungere ansible-playbookopzioni. È facile mettere questo file in risposta a git repo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.