Jak zignorować sprawdzanie autentyczności ansible SSH?

164

Czy istnieje sposób na zignorowanie sprawdzania autentyczności SSH przez Ansible? Na przykład, kiedy właśnie skonfigurowałem nowy serwer, muszę odpowiedzieć twierdząco na to pytanie:

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

Wiem, że jest to ogólnie zły pomysł, ale włączam to do skryptu, który najpierw tworzy nowy serwer wirtualny u mojego dostawcy usług w chmurze, a następnie automatycznie wywołuje mój poradnik ansibla, aby go skonfigurować. Chcę uniknąć jakiejkolwiek ingerencji człowieka w trakcie wykonywania skryptu.

Johan
źródło

Odpowiedzi:

247

Dwie opcje - pierwsza, jak powiedziałeś we własnej odpowiedzi, to ustawienie zmiennej środowiskowej ANSIBLE_HOST_KEY_CHECKINGna False.

Drugim sposobem ustawienia jest umieszczenie go w pliku ansible.cfg, a to jest naprawdę przydatna opcja, ponieważ możesz ustawić to globalnie (na poziomie systemu lub użytkownika, w /etc/ansible/ansible.cfglub ~/.ansible.cfg) lub w pliku konfiguracyjnym w tym samym katalogu jako podręcznik, z którego korzystasz.

Aby to zrobić, utwórz ansible.cfgplik w jednej z tych lokalizacji i dołącz to:

[defaults]
host_key_checking = False

Możesz tam również ustawić wiele innych przydatnych ustawień domyślnych, takich jak zbieranie faktów na początku gry, scalanie skrótów zadeklarowanych w wielu miejscach lub zastępowanie ich innymi itd. Jest cała duża lista opcji tutaj w ansibl docs.


Edycja: uwaga na temat bezpieczeństwa.

Sprawdzanie poprawności klucza hosta SSH jest znaczącą warstwą bezpieczeństwa dla stałych hostów - jeśli łączysz się z tym samym komputerem wiele razy, warto lokalnie zaakceptować klucz hosta.

W przypadku instancji EC2 o dłuższej żywotności sensowne byłoby zaakceptowanie klucza hosta w przypadku zadania uruchamianego tylko raz podczas początkowego tworzenia instancji:

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

Nie ma żadnej wartości zabezpieczeń do sprawdzania kluczy hosta w instancjach, które wstajesz dynamicznie i usuwasz zaraz po wykonaniu elementu playbook, ale sprawdzanie kluczy hostów dla maszyn trwałych ma wartość bezpieczeństwa. Dlatego należy zarządzać sprawdzaniem klucza hosta inaczej w zależności od środowiska logicznego.

  • Pozostaw sprawdzanie domyślnie włączone (in ~/.ansible.cfg)
  • Wyłącz sprawdzanie klucza hosta w katalogu roboczym dla playbooków, które uruchamiasz z efemerycznymi instancjami ( ./ansible.cfgwraz z playbookiem do testów jednostkowych na maszynach wirtualnych vagrant, automatyzację dla krótkotrwałych instancji ec2)
nikobelia
źródło
5
Czy ktoś wie, jaka jest tutaj najlepsza praktyka? Na przykład, możesz okresowo uruchamiać skrypt, aby zresetować znane hosty, co byłoby bezpieczniejsze (chyba że zostaniesz poddany atakowi MITM w tym oknie). Domyślne
ignorowanie
3
Podoba mi się wzorzec używany przez mój zespół: umieszczamy pliki ansible.cfg, które wyłączają sprawdzanie klucza hosta w katalogach roboczych dla podręczników, które uruchamiamy z instancjami efemerycznymi (testy jednostkowe, które działają na maszynach wirtualnych vagrant, instancjach AWS ec2 itp.) I pozostawiamy sprawdzanie włączone na poziom systemu.
nikobelia
1
W ten sposób można zarządzać sprawdzaniem klucza hosta w każdym środowisku logicznym . Nie ma żadnej wartości zabezpieczeń do sprawdzania kluczy hosta w instancjach, które wstajesz dynamicznie i usuwasz zaraz po wykonaniu elementu playbook, ale sprawdzanie kluczy hostów dla maszyn trwałych ma wartość bezpieczeństwa. Więc powinieneś mieć różne wartości domyślne dla tych różnych przypadków użycia.
nikobelia
2
Jeśli jakiś mechanizm jest używany do udostępniania nowych maszyn, na stałe lub tymczasowo, powinien on zapewnić Ci klucz publiczny SSH tego komputera. Następnie możesz przechowywać go w różnych known_hostsplikach lokalnych , aby SSH i Ansible mogły rozpoznać maszynę. Niezastosowanie się do tego celu, zwłaszcza wyłączenie sprawdzania klucza hosta, obniża bezpieczeństwo SSH do prawie zera i umożliwia ataki MITM. Wiele maszyn znajdujących się w „sieci wewnętrznej” jest w rzeczywistości połączonych z Internetem, gdzie pojedyncza szybsza odpowiedź DNS umożliwia rozmowę z napastnikiem zamiast z celem.
aef
2
@TonyH podczas konfigurowania wielu hostów za pośrednictwem AWS Cloudformation i Ansible, uruchomiłem ssh-keyscan <ip list>na zaufanej maszynie (dla mnie jest to host bastionu / skoku) w tej samej sieci i umieściłem wyniki w known_hosts Aby skonfigurować zaufanego hosta, AWS ujawnia klucz hosta w dziennikach uruchamiania instancji, więc wytropienie tego klucza było jednym ręcznym krokiem, którego nigdy nie przerywałem, gdybym całkowicie odtworzył moje środowisko. Ale tego hosta zwykle nie trzeba było usuwać. To może pomóc.
dcc310,
34

Znalazłem odpowiedź, musisz ustawić zmienną środowiskową ANSIBLE_HOST_KEY_CHECKINGna False. Na przykład:

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...
Johan
źródło
2
Tak, ale powiedziałeś, że używasz tego dla nowego serwera, który właśnie skonfigurowałeś. Pozwala to tym razem uniknąć konieczności zajmowania się kluczem hosta, ale co z kolejnymi połączeniami SSH? Twój skrypt instalacyjny działa, konfiguruje serwer i gotowe. Teraz masz inne podręczniki, które uruchamiasz, powiedzmy, lub masz skrypty korzystające z SSH. Teraz zepsute, ponieważ klucz hosta nadal nie znajduje się w znanych_hostach. Tylko opóźniłeś swój problem. Krótko mówiąc, to, co tu napisałeś, nie brzmi jak dobra odpowiedź na zadane pytanie.
Todd Walton
Jest używany w skrypcie bash podczas tworzenia nowych serwerów, nie jest używany do niczego innego.
Johan
8

przekaż do nikobelia

Dla tych, którzy używają jenkinsa do uruchomienia playbooka, właśnie dodałem do mojej pracy Jenkinsa przed uruchomieniem ansible-playbook zmienną środowiskową he ANSIBLE_HOST_KEY_CHECKING = False Na przykład to:

export ANSIBLE_HOST_KEY_CHECKING=False
ansible-playbook 'playbook.yml' \
--extra-vars="some vars..." \
--tags="tags_name..." -vv
dsaydon
źródło
6

Zmiana host_key_checkingnafalse dla wszystkich gospodarzy to bardzo zły pomysł.

Jedyny moment, w którym chcesz to zignorować, to „pierwszy kontakt”, który wykonają te dwa zadania:

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

Dlatego wyłączamy sprawdzanie klucza hosta tylko wtedy, gdy nie mamy klucza hosta w naszym known_hostspliku.

davidolrik
źródło
3

Możesz go przekazać jako argument wiersza poleceń podczas uruchamiania playbooka:

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

paresh patil
źródło
2

Jeśli nie chcesz modyfikować ansible.cfglub playbook.yml, możesz po prostu ustawić zmienną środowiskową:

export ANSIBLE_HOST_KEY_CHECKING=False
Rene B.
źródło
0

Użyj parametru o nazwie validate_certs, aby zignorować walidację ssh

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

W ten sposób ignoruje proces walidacji ssh

Nitesh Jain
źródło
validate_certsParametr po prostu opowiada boto nie potwierdzić AWS API HTTPS cert. Nie ma to wpływu na weryfikację klucza SSH.
Matthew Dutton
0

Wiem, że odpowiedź na to pytanie również jest poprawna, ale chciałem tylko połączyć dokument ansible, w którym wyjaśniono jasno, kiedy i dlaczego należy dodać odpowiednie sprawdzenie: sprawdzanie klucza hosta

justjais
źródło
0

Najwięcej problemów pojawia się, gdy chcesz dodać nowy host do dynamicznego spisu (poprzez moduł add_host) w playbooku. Nie chcę na stałe wyłączać sprawdzania hosta linii papilarnych, więc rozwiązania takie jak wyłączenie go w globalnym pliku konfiguracyjnym nie są dla mnie w porządku. Eksportowanie var likeANSIBLE_HOST_KEY_CHECKING przed uruchomieniem Playbooka, to kolejna rzecz do zrobienia przed uruchomieniem, o której należy pamiętać.

Lepiej jest dodać lokalny plik konfiguracyjny w tym samym katalogu, w którym znajduje się playbook. Utwórz plik o nazwie ansible.cfgi wklej następujący tekst:

[defaults]
host_key_checking = False

Nie musisz pamiętać, aby dodać coś do zmiennych środowiskowych lub dodać do ansible-playbookopcji. Łatwo jest umieścić ten plik w repozytorium git ansible.

QkiZ
źródło