Bagaimana cara mengabaikan pengecekan keaslian SSH yang mungkin?

164

Apakah ada cara untuk mengabaikan pengecekan keaslian SSH yang dibuat oleh Ansible? Sebagai contoh ketika saya baru saja menyiapkan server baru saya harus menjawab ya untuk pertanyaan ini:

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

Saya tahu bahwa ini umumnya ide yang buruk, tetapi saya memasukkan ini dalam skrip yang pertama kali membuat server virtual baru di penyedia cloud saya dan kemudian secara otomatis memanggil playbook saya yang mungkin untuk mengkonfigurasinya. Saya ingin menghindari campur tangan manusia di tengah eksekusi skrip.

Johan
sumber

Jawaban:

247

Dua opsi - yang pertama, seperti yang Anda katakan dalam jawaban Anda sendiri, adalah mengatur variabel lingkungan ANSIBLE_HOST_KEY_CHECKINGke False.

Cara kedua untuk mengaturnya adalah dengan meletakkannya di file ansible.cfg, dan itu opsi yang sangat berguna karena Anda dapat mengaturnya secara global (pada tingkat sistem atau pengguna, dalam /etc/ansible/ansible.cfgatau ~/.ansible.cfg), atau dalam file konfigurasi di direktori yang sama sebagai buku pedoman yang Anda jalankan.

Untuk melakukannya, buat ansible.cfgfile di salah satu lokasi itu, dan sertakan ini:

[defaults]
host_key_checking = False

Anda juga dapat mengatur banyak default berguna lainnya di sana, seperti apakah akan mengumpulkan fakta atau tidak di awal permainan, apakah akan menggabungkan hash yang dideklarasikan di beberapa tempat atau mengganti satu dengan yang lain, dan seterusnya. Ada daftar besar seluruh opsi di sini di dokumen Ansible.


Edit: catatan tentang keamanan.

Validasi kunci host SSH adalah lapisan keamanan yang berarti untuk host yang gigih - jika Anda terhubung ke mesin yang sama berkali-kali, berharga untuk menerima kunci host secara lokal.

Untuk instance EC2 yang berumur panjang, masuk akal untuk menerima kunci host dengan tugas yang dijalankan hanya sekali pada pembuatan awal instance:

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

Tidak ada nilai keamanan untuk memeriksa kunci host pada instance yang Anda berdiri secara dinamis dan menghapus tepat setelah eksekusi playbook, tetapi ada nilai keamanan dalam memeriksa kunci host untuk mesin yang persisten. Jadi, Anda harus mengelola pemeriksaan kunci host secara berbeda per lingkungan logis.

  • Biarkan pemeriksaan diaktifkan secara default (dalam ~/.ansible.cfg)
  • Nonaktifkan memeriksa kunci host di direktori kerja untuk playbook yang Anda jalankan terhadap instance sesaat (di ./ansible.cfgsamping playbook untuk tes unit terhadap VM gelandangan, otomatisasi untuk instance EC2 berumur pendek)
nikobelia
sumber
5
Adakah yang tahu apa praktik terbaik di sini? Misalnya, Anda dapat menjalankan skrip secara berkala untuk mengatur ulang host yang dikenal, yang akan lebih aman (kecuali terkena serangan MITM selama jendela itu). Mengabaikan keaslian secara default menghilangkan salah satu mekanisme keamanan utama SSH
TonyH
3
Saya suka pola yang digunakan tim saya: kami menaruh file ansible.cfg yang menonaktifkan pemeriksaan kunci host di direktori kerja untuk buku pedoman yang kami jalankan terhadap instance fana (unit test yang berjalan pada VM gelandangan, instance AWS ec2, dll) dan membiarkan pengecekan diaktifkan di tingkat sistem.
nikobelia
1
Dengan begitu, Anda dapat mengelola pemeriksaan kunci host per lingkungan logis . Tidak ada nilai keamanan untuk memeriksa kunci host pada instance yang Anda berdiri secara dinamis dan menghapus tepat setelah eksekusi playbook, tetapi ada nilai keamanan dalam memeriksa kunci host untuk mesin yang persisten. Jadi Anda harus memiliki standar berbeda untuk kasus penggunaan yang berbeda.
nikobelia
2
Jika beberapa mekanisme digunakan untuk menyediakan mesin baru, permanen atau sementara, mekanisme itu akan memberi Anda kunci publik SSH dari mesin ini. Anda kemudian dapat menyimpannya di berbagai known_hostsfile lokal Anda untuk SSH dan Dapat mengenali mesin. Gagal melakukannya, terutama dengan menonaktifkan pemeriksaan kunci host, menurunkan keamanan SSH menjadi hampir nol, dan memungkinkan serangan MITM. Banyak mesin yang merasa berada dalam "jaringan internal" sebenarnya terhubung ke Internet, di mana satu respons DNS yang lebih cepat memungkinkan Anda berbicara dengan penyerang daripada target Anda.
aef
2
@TonyH ketika mengatur banyak host melalui AWS Cloudformation dan Ansible, saya berlari ssh-keyscan <ip list>pada mesin tepercaya (bagi saya, ini adalah host benteng / lompatan) di dalam jaringan yang sama, dan menempatkan hasilnya di known_hosts Untuk mengatur host tepercaya itu, AWS memaparkan kunci host di log startup di instance, jadi memburu kunci itu adalah satu langkah manual yang tidak pernah saya hentikan jika saya melakukan rekreasi penuh terhadap lingkungan saya. Tetapi tuan rumah itu biasanya tidak perlu dihapus. Ini bisa membantu.
dcc310
34

Saya menemukan jawabannya, Anda perlu mengatur variabel lingkungan ANSIBLE_HOST_KEY_CHECKINGuntuk False. Sebagai contoh:

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...
Johan
sumber
2
Ya, tetapi Anda mengatakan Anda menggunakan ini untuk server baru yang baru saja Anda siapkan. Ini menghindari harus berurusan dengan kunci host saat ini, tetapi bagaimana dengan koneksi SSH berikutnya? Script setup Anda berjalan, mengkonfigurasi server, dan selesai. Sekarang Anda memiliki playbook lain yang Anda jalankan, katakan, atau Anda memiliki skrip yang menggunakan SSH. Sekarang mereka rusak karena kunci host masih belum ada di known_hosts. Anda hanya menunda masalah Anda. Singkatnya, apa yang Anda tulis di sini tidak terdengar seperti jawaban yang bagus untuk pertanyaan yang Anda ajukan.
Todd Walton
Ini digunakan dalam skrip bash saat membuat server baru , ini tidak digunakan untuk hal lain.
Johan
8

maju ke nikobelia

Bagi mereka yang menggunakan jenkins untuk menjalankan buku bermain, saya baru saja menambahkan ke pekerjaan jenkins saya sebelum menjalankan anbook-playbook the variable environment environment ANSIBLE_HOST_KEY_CHECKING = Salah Misalnya, ini:

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

Mengubah host_key_checkingke falseuntuk semua host adalah ide yang sangat buruk.

Satu-satunya waktu Anda ingin mengabaikannya, adalah pada "kontak pertama", yang akan diselesaikan oleh dua tugas ini:

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

Jadi kami hanya mematikan kunci host memeriksa jika kami tidak memiliki kunci host di known_hostsfile kami .

davidolrik
sumber
3

Anda bisa melewatinya sebagai argumen baris perintah saat menjalankan playbook:

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

Paresh Patil
sumber
2

Jika Anda tidak ingin mengubah ansible.cfgatau, playbook.ymlmaka Anda bisa mengatur variabel lingkungan:

export ANSIBLE_HOST_KEY_CHECKING=False
Rene B.
sumber
0

Gunakan parameter bernama validate_certs untuk mengabaikan validasi ssh

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

Dengan melakukan ini, ia mengabaikan proses validasi ssh

Nitesh Jain
sumber
The validate_certsparameter hanya memberitahu boto tidak memvalidasi AWS API HTTPS cert. Itu tidak mempengaruhi verifikasi kunci SSH.
Matthew Dutton
0

Saya tahu pertanyaan telah dijawab dan itu benar juga, tetapi hanya ingin menautkan dokumen yang memungkinkan di mana dijelaskan dengan jelas kapan dan mengapa masing-masing cek harus ditambahkan: host-key-checking

justjais
sumber
0

Sebagian besar masalah muncul ketika Anda ingin menambahkan host baru ke inventaris dinamis (melalui modul add_host) di playbook. Saya tidak ingin menonaktifkan pemeriksaan sidik jari host secara permanen sehingga solusi seperti menonaktifkannya di file konfigurasi global tidak ok untuk saya. Mengekspor var seperti ANSIBLE_HOST_KEY_CHECKINGsebelum menjalankan playbook adalah hal lain yang harus dilakukan sebelum menjalankan yang perlu diingat.

Lebih baik menambahkan file konfigurasi lokal dalam direktori yang sama dengan playbook. Buat file dengan nama ansible.cfgdan rekatkan teks berikut:

[defaults]
host_key_checking = False

Tidak perlu ingat untuk menambahkan sesuatu di env vars atau menambah ansible-playbookopsi. Sangat mudah untuk meletakkan file ini ke git repo yang dimungkinkan.

QkiZ
sumber