Ansible SSH kimlik denetimi nasıl göz ardı edilir?


165

Ansible tarafından yapılan SSH özgünlük denetimini göz ardı etmenin bir yolu var mı? Örneğin, yeni bir sunucu kurduğumda bu soruya evet yanıtı vermek zorundayım:

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

Bunun genellikle kötü bir fikir olduğunu biliyorum, ancak bunu önce bulut sağlayıcımda yeni bir sanal sunucu oluşturan ve daha sonra otomatik olarak yapılandırmak için benim sorumlu oyun kitabımı çağıran bir komut dosyasına dahil ediyorum. Senaryo yürütmesinin ortasında herhangi bir insan müdahalesinden kaçınmak istiyorum.

Yanıtlar:


248

İki seçenek - birincisi, kendi cevabınızda söylediğiniz gibi, ortam değişkenini ayarlamak ANSIBLE_HOST_KEY_CHECKING Yanlış olarak ayarlamaktır.

Bunu ayarlamanın ikinci yolu onu ansible.cfg dosyasına koymaktır ve bu gerçekten yararlı bir seçenektir, çünkü ya global olarak (sistem veya kullanıcı düzeyinde, /etc/ansible/ansible.cfgveya içinde ~/.ansible.cfg) veya aynı dizindeki bir yapılandırma dosyasında ayarlayabilirsiniz çalıştırdığınız oyun kitabı olarak.

Bunu yapmak için, ansible.cfgbu konumlardan birinde bir dosya oluşturun ve şunu ekleyin:

[defaults]
host_key_checking = False

Ayrıca, oyun başlangıcında gerçeklerin toplanıp toplanmayacağı, birden çok yerde bildirilen karmaları birleştirip birleştirmeyeceği ya da bir başkasıyla değiştirip değiştirmeyeceği gibi birçok başka varsayılan varsayılan da ayarlayabilirsiniz. Ansible dokümanlarında burada büyük bir seçenek listesi var .


Düzenle: güvenlikle ilgili bir not.

SSH ana bilgisayar anahtarı doğrulaması, kalıcı ana bilgisayarlar için anlamlı bir güvenlik katmanıdır - aynı makineye birçok kez bağlanıyorsanız, ana bilgisayar anahtarını yerel olarak kabul etmek önemlidir.

Daha uzun ömürlü EC2 bulut sunucuları için, anasistem anahtarını , örneğin ilk oluşturulduğunda yalnızca bir kez çalıştırılan bir görevle kabul etmek mantıklı olacaktır :

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

Dinamik olarak ayağa kalktığınız ve çalma kitabı yürütüldükten hemen sonra kaldırdığınız örneklerde ana makine anahtarlarını denetlemek için bir güvenlik değeri yoktur, ancak kalıcı makineler için ana makine anahtarlarını denetlemede güvenlik değeri vardır. Bu nedenle, ana bilgisayar anahtarı denetimini mantıksal ortam başına farklı yönetmelisiniz.

  • Varsayılan olarak kontrolü etkin bırak (in ~/.ansible.cfg)
  • Geçici örneklere karşı çalıştırdığınız oyun kitapları için çalışma dizininde ana makine anahtarı denetimini devre dışı bırakın ( ./ansible.cfgvagrant VM'lere karşı birim testleri için yürütme kitabının yanı sıra kısa ömürlü ec2 örnekleri için otomasyon)

5
Burada en iyi uygulamanın ne olduğunu bilen var mı? Örneğin, bilinen ana makinelerinizi sıfırlamak için düzenli olarak bir komut dosyası çalıştırabilirsiniz, bu daha güvenli olacaktır (bu pencerede bir MITM saldırısına maruz kalmadıkça).
Özgünlüğü

3
Ekibimin kullandığı kalıbı beğendim: geçici örneklere (vagrant VM'lerde çalışan birim testleri, AWS ec2 örnekleri vb.) Çalışan dizinler için çalışma dizinlerine ana bilgisayar anahtarı denetimini devre dışı bırakan ansible.cfg dosyalarını yerleştiriyoruz ve denetimi etkin bırakıyoruz Sistem seviyesi.
nikobelia

1
Bu şekilde, mantıksal ortam başına ana makine anahtarı denetimini yönetebilirsiniz . Dinamik olarak ayağa kalktığınız ve çalma kitabı yürütüldükten hemen sonra kaldırdığınız örneklerde ana makine anahtarlarını denetlemek için bir güvenlik değeri yoktur, ancak kalıcı makineler için ana makine anahtarlarını denetlemede güvenlik değeri vardır. Bu nedenle, bu farklı kullanım durumları için farklı varsayılanlara sahip olmalısınız.
nikobelia

2
Kalıcı veya geçici yeni makineler sağlamak için bazı mekanizmalar kullanılıyorsa, bu mekanizma size bu makinenin SSH açık anahtarını sağlamalıdır. Daha sonra known_hostsSSH ve Ansible'ın makineyi tanıması için çeşitli yerel dosyalarınızda saklayabilirsiniz . Bunu yapmamak, özellikle ana bilgisayar anahtarı denetimini devre dışı bırakarak, SSH güvenliğini neredeyse sıfıra indirir ve MITM saldırılarına izin verir. Bir "dahili ağda" olduğu düşünülen birçok makine aslında tek bir daha hızlı DNS yanıtının hedefiniz yerine saldırganla konuşmanıza izin verdiği İnternet'e bağlıdır.
aef

2
@TonyH, AWS Cloudformation ve Ansible aracılığıyla birçok ana bilgisayar kurarken ssh-keyscan <ip list>, aynı ağ içinde güvenilir bir makinede (benim için bir burç / atlama ana makinesi) koştum ve sonuçları yerleştirin. known_hosts Bu güvenilir ana bilgisayarı kurmak için AWS, örneğin başlangıç ​​günlüklerinde anasistem anahtarı, bu yüzden bu anahtarı avlamak, ortamımın tam bir rekreasyonunu yapsaydım hiç kesmediğim manuel bir adımdı. Ancak bu ana bilgisayarın genellikle silinmesine gerek yoktu. Bu yardımcı olabilir.
dcc310

34

Ben cevabı bulduğumu, ortam değişkeni ayarlamak gerekir ANSIBLE_HOST_KEY_CHECKINGiçin False. Örneğin:

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...

2
Evet, ancak bunu yeni kurduğunuz yeni bir sunucu için kullandığınızı söylediniz. Bu, ana bilgisayar anahtarı ile bu kez uğraşmaktan kaçınır, ancak sonraki SSH bağlantıları ne olacak? Kurulum komut dosyanız çalışır, sunucuyu yapılandırır ve işlem tamamlanır. Artık çalıştırdığınız, söylediğiniz veya SSH kullanan komut dosyalarınız olan başka oyun kitaplarınız var. Şimdi onlar konum konak anahtarı known_hosts hala olmadığı için kırık. Sadece probleminizi ertelediniz. Kısacası, burada yazdıklarınız sorduğunuz soruya iyi bir cevap gibi görünmüyor.
Todd Walton

Bu, yeni sunucular oluştururken bash betiğinde kullanılır, başka bir şey için kullanılmaz.
Johan

8

nikobelia'ya ileri

Oyun kitabını çalıştırmak için jenkins'i kullananlar için, ansible-playbook'u çalıştırmadan önce jenkins işime yeni ekledim o ortam değişkeni ANSIBLE_HOST_KEY_CHECKING = False Örneğin:

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

6

Değişen host_key_checkingiçin falsetüm ana için çok kötü bir fikirdir.

Göz ardı etmek istediğiniz tek zaman, bu iki görevin yerine getireceği "ilk temas" üzerindedir:

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

Bu nedenle, ana makine anahtarı kontrolünü yalnızca known_hostsdosyamızda ana makine anahtarı yoksa kapatırız .


3

Başucu kitabını çalıştırırken komut satırı bağımsız değişkeni olarak iletebilirsiniz:

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


2

Değiştirmek istemiyorsanız ansible.cfgveya daha playbook.ymlsonra bir ortam değişkeni ayarlayabilirsiniz:

export ANSIBLE_HOST_KEY_CHECKING=False

1

Kontrolü görmezden gelmek kötü bir fikirdir çünkü sizi Ortadaki Adam saldırılarına açık hale getirir.

Her bir makinenin anahtarını yalnızca bir kez ekleyerek ve aslında Ansible'da tamam / değiştirilmiş durumu ayarlayarak nikobelia'nın yanıtını geliştirme özgürlüğünü aldım :

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

Çözemediğim bir sapma, tek bir anahtar eklese bile her şeyin değişmiş olarak işaretlenmesidir. Herkes bir düzeltme katkıda bulunabilir eğer bu harika olurdu!


0

Ssh doğrulamasını yok saymak için validate_certs adlı parametreyi kullanın

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

Bunu yaparak ssh doğrulama işlemini yok sayar.


validate_certsParametre sadece AWS API HTTPS sertifika doğrulamaz için boto söyler. SSH anahtarı doğrulamasını etkilemez.
Matthew Dutton

0

Sorunun cevaplandığını ve doğru olduğunu biliyorum, ancak ilgili dokümanın ne zaman ve neden eklenmesi gerektiği açık bir şekilde açıklandığı yerde dokümanı bağlamak istedim: ana bilgisayar anahtarı denetimi


0

Çoğu sorun, oynatma kitabındaki dinamik envantere (add_host modülü aracılığıyla) yeni ana bilgisayar eklemek istediğinizde ortaya çıkar. Parmak izi ana bilgisayar denetimini kalıcı olarak devre dışı bırakmak istemiyorum, böylece genel bir yapılandırma dosyasında devre dışı bırakma gibi çözümler benim için uygun değil. Dışa aktarma var gibiANSIBLE_HOST_KEY_CHECKINGOyun kitabını çalıştırmadan önce , hatırlanması gereken çalıştırmadan önce yapılacak başka bir şeydir.

Yerel yapılandırma dosyasını, playbook ile aynı dizine eklemek daha iyidir. Adlı bir dosya oluşturun ansible.cfgve aşağıdaki metni yapıştırın:

[defaults]
host_key_checking = False

Env değişkenlerine bir şey eklemeyi veya ansible-playbookseçeneklere eklemeyi hatırlamaya gerek yok . Bu dosyayı ansible git repo'ya koymak kolaydır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.