कैसे SSH प्रामाणिकता की जाँच की उपेक्षा करें?


164

क्या SSH द्वारा प्रमाणित SSH प्रामाणिकता की अनदेखी करने का कोई तरीका है? उदाहरण के लिए जब मैंने एक नया सर्वर सेटअप किया है तो मुझे इस प्रश्न का उत्तर देना होगा:

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

मुझे पता है कि यह आम तौर पर एक बुरा विचार है, लेकिन मैं इसे एक स्क्रिप्ट में शामिल कर रहा हूं जो पहले मेरे क्लाउड प्रदाता पर एक नया वर्चुअल सर्वर बनाता है और फिर इसे कॉन्फ़िगर करने के लिए स्वचालित रूप से मेरी ansible playbook को कॉल करता है। मैं स्क्रिप्ट के निष्पादन के बीच में किसी भी मानवीय हस्तक्षेप से बचना चाहता हूं।

जवाबों:


247

दो विकल्प - पहला, जैसा कि आपने अपने स्वयं के उत्तर में कहा था, पर्यावरण चर ANSIBLE_HOST_KEY_CHECKINGको गलत पर सेट कर रहा है ।

इसे सेट करने का दूसरा तरीका यह है कि इसे ansible.cfg फ़ाइल में रखा जाए, और यह वास्तव में एक उपयोगी विकल्प है क्योंकि आप या तो विश्व स्तर पर (सिस्टम या उपयोगकर्ता स्तर पर, /etc/ansible/ansible.cfgया ~/.ansible.cfg) या उसी निर्देशिका में एक कॉन्फिग फ़ाइल में सेट कर सकते हैं। आपके द्वारा चलाए जा रहे प्लेबुक के रूप में।

ऐसा करने के लिए, ansible.cfgउन स्थानों में से एक में एक फ़ाइल बनाएं और इसे शामिल करें:

[defaults]
host_key_checking = False

आप बहुत सारे अन्य आसान डिफॉल्ट भी सेट कर सकते हैं, जैसे कि किसी नाटक की शुरुआत में तथ्यों को इकट्ठा करना या न करना, चाहे कई स्थानों पर घोषित हैश को मर्ज करना हो या एक को दूसरे के साथ बदलना हो, इत्यादि। Ansible डॉक्स में यहां विकल्पों की एक पूरी बड़ी सूची है ।


संपादित करें: सुरक्षा पर एक नोट।

SSH होस्ट कुंजी सत्यापन लगातार मेजबानों के लिए एक सार्थक सुरक्षा परत है - यदि आप कई बार एक ही मशीन से जुड़ रहे हैं, तो यह स्थानीय रूप से होस्ट कुंजी को स्वीकार करने के लिए मूल्यवान है।

लंबे समय तक रहने वाले EC2 उदाहरणों के लिए, यह उदाहरण के प्रारंभिक निर्माण पर केवल एक बार चलने वाले कार्य के साथ मेजबान कुंजी को स्वीकार करने के लिए समझ में आएगा :

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

ऐसे उदाहरणों पर होस्ट कुंजियों की जाँच करने के लिए कोई सुरक्षा मूल्य नहीं है जो आप गतिशील रूप से खड़े रहते हैं और प्लेबुक निष्पादन के बाद सही हटा देते हैं, लेकिन लगातार मशीनों के लिए होस्ट कुंजी की जाँच करने में सुरक्षा मूल्य है। इसलिए आपको तार्किक वातावरण के अनुसार अलग-अलग होस्ट कीज की जाँच करनी चाहिए।

  • डिफ़ॉल्ट रूप से (सक्षम ~/.ansible.cfg) जाँच सक्षम छोड़ दें
  • होस्ट कुंजी playbooks के लिए काम निर्देशिका में जाँच आप (अल्पकालिक उदाहरणों के खिलाफ चलाए अक्षम ./ansible.cfgआवारा VM, अल्पकालिक EC2 उदाहरण के लिए स्वचालन के खिलाफ इकाई परीक्षण के लिए प्लेबुक के साथ)

5
किसी को भी पता है कि यहां सबसे अच्छा अभ्यास क्या है? उदाहरण के लिए, आप समय-समय पर अपने ज्ञात मेजबानों को रीसेट करने के लिए एक स्क्रिप्ट चला सकते हैं, जो कि अधिक सुरक्षित होगा (जब तक कि उस विंडो के साथ MITM हमले के अधीन न हो)। डिफ़ॉल्ट रूप से प्रामाणिकता को नजरअंदाज करना SSH के प्राथमिक सुरक्षा तंत्रों में से एक को समाप्त करता है
टोनीएच

3
मुझे वह पैटर्न पसंद है जो मेरी टीम उपयोग करती है: हम ansible.cfg फाइलें डालते हैं जो कि हम काम के लिए निर्देशिकाओं में होस्ट कुंजी चेकिंग को अक्षम करते हैं, जो हम पंचाट इंस्टेंसेस (यूनिट परीक्षण जो योनि VMs, AWS ec2 इंस्टेंसेस, आदि) पर चलते हैं और चेकिंग सक्षम करते हैं। सिस्टम स्तर।
निकोबेलिया

1
इस तरह, आप प्रति तार्किक वातावरण में होस्ट कुंजी जाँच का प्रबंधन कर सकते हैं । ऐसे उदाहरणों पर होस्ट कुंजियों की जाँच करने के लिए कोई सुरक्षा मूल्य नहीं है जो आप गतिशील रूप से खड़े रहते हैं और प्लेबुक निष्पादन के बाद सही हटा देते हैं, लेकिन लगातार मशीनों के लिए होस्ट कुंजी की जाँच करने में सुरक्षा मूल्य है। तो आप उन विभिन्न उपयोग के मामलों के लिए अलग चूक होना चाहिए।
निकोबेलिया

2
यदि कुछ तंत्र का उपयोग नई मशीनों को स्थायी या अस्थायी बनाने के लिए किया जाता है, तो उस तंत्र को आपको इस मशीन की SSH सार्वजनिक कुंजी प्रदान करनी चाहिए। फिर आप known_hostsमशीन को पहचानने के लिए SSH और Ansible के लिए अपनी विभिन्न स्थानीय फ़ाइलों में इसे संग्रहीत कर सकते हैं । ऐसा करने में विफल, विशेष रूप से होस्ट कुंजी जाँच को अक्षम करके, SSH की सुरक्षा को लगभग शून्य कर देता है, और MITM हमलों की अनुमति देता है। "आंतरिक नेटवर्क" में महसूस की जाने वाली बहुत सारी मशीनें वास्तव में इंटरनेट से जुड़ी हुई हैं, जहां एक एकल तेज़ DNS प्रतिक्रिया आपको अपने लक्ष्य के बजाय हमलावर से बात करने देती है।
अनफ

2
@THH जब AWS क्लाउडफॉर्म और Ansible के माध्यम से कई मेजबानों की स्थापना करता है, तो मैं ssh-keyscan <ip list>एक ही नेटवर्क के अंदर एक विश्वसनीय मशीन (मेरे लिए, यह एक गढ़ / कूद मेजबान है) पर दौड़ा , और परिणामों known_hosts को उस विश्वसनीय होस्ट को सेट करने के लिए, AWS को रोकता है उदाहरण के स्टार्टअप लॉग में होस्ट कुंजी, इसलिए उस कुंजी का शिकार करना एक मैनुअल कदम था जिसे मैंने कभी नहीं काटा अगर मैं अपने वातावरण का पूरा मनोरंजन कर रहा था। लेकिन उस मेजबान को आमतौर पर हटाने की आवश्यकता नहीं होती है। यह मदद कर सकता है।
dcc310

34

मुझे जवाब मिला, आपको पर्यावरण चर ANSIBLE_HOST_KEY_CHECKINGको सेट करने की आवश्यकता है False। उदाहरण के लिए:

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...

2
हां, लेकिन आपने कहा था कि आप इसका उपयोग एक नए सर्वर के लिए कर रहे हैं जो आपने अभी सेटअप किया है। इस बार मेजबान कुंजी से निपटने के लिए बचा जाता है, लेकिन बाद में एसएसएच कनेक्शन के बारे में क्या? आपकी सेटअप स्क्रिप्ट चलती है, सर्वर को कॉन्फ़िगर करती है, और यह पूरा हो गया है। अब आपके पास अन्य प्लेबुक्स हैं जो आप चलाते हैं, कहते हैं, या आपके पास स्क्रिप्ट हैं जो एसएसएच का उपयोग करते हैं। अब वे टूट गए हैं क्योंकि होस्ट कुंजी अभी भी ज्ञात_होस्ट में नहीं है। आपने केवल अपनी समस्या में देरी की है। संक्षेप में, आपने यहां जो लिखा है वह आपके द्वारा पूछे गए प्रश्न के अच्छे उत्तर की तरह नहीं है।
टोड वाल्टन

नए सर्वर बनाते समय इसका उपयोग bash script में किया जाता है, इसका उपयोग किसी और चीज के लिए नहीं किया जाता है।
जोहान

8

निकोबेलिया के लिए आगे

जो लोग प्ले बुक चलाने के लिए जेनकिंस का उपयोग कर रहे हैं, उनके लिए मैंने अपने जेनकींस जॉब में एंसिबल-प्लेबुक चलाने से पहले एएनआईबीएलई_एचएसटी_केवाई_चेकिंग = पर्यावरण चर को उदाहरण के लिए जोड़ा:

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

6

बदलने host_key_checkingके लिए falseसभी मेजबानों के लिए एक बहुत बुरा विचार है।

केवल एक बार जब आप इसे अनदेखा करना चाहते हैं, तो "पहले संपर्क" पर है, जो इन दो कार्यों को पूरा करेगा:

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

यदि हम अपनी known_hostsफ़ाइल में होस्ट कुंजी नहीं रखते हैं, तो हम केवल होस्ट कुंजी जाँच बंद कर देते हैं ।


3

आप इसे प्लेबुक चलाते समय कमांड लाइन तर्क के रूप में पास कर सकते हैं:

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


2

यदि आप संशोधित नहीं करना चाहते हैं ansible.cfgया playbook.ymlफिर आप केवल एक पर्यावरण चर सेट कर सकते हैं:

export ANSIBLE_HOST_KEY_CHECKING=False

0

Ssh सत्यापन को अनदेखा करने के लिए validate_certs नाम के पैरामीटर का उपयोग करें

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

ऐसा करने से यह ssh सत्यापन प्रक्रिया की उपेक्षा करता है


validate_certsपैरामीटर बस को मान्य नहीं करने के लिए एडब्ल्यूएस एपीआई HTTPS प्रमाणपत्र Boto बताता है। यह SSH कुंजी सत्यापन को प्रभावित नहीं करता है।
मैथ्यू डटन

0

मुझे पता है कि इस सवाल का जवाब दिया जा चुका है और यह सही भी है, लेकिन सिर्फ यह बताया गया है कि जहां यह कब और क्यों संबंधित चेक में जोड़ा जाना चाहिए, यह स्पष्ट रूप से समझाया गया है: होस्ट-की-चेकिंग


0

जब आप प्लेबुक में add_host मॉड्यूल के माध्यम से डायनामिक इन्वेंट्री में नया होस्ट जोड़ना चाहते हैं, तो सबसे अधिक समस्याएं आती हैं। मैं फ़िंगरप्रिंट होस्ट चेकिंग को स्थायी रूप से अक्षम नहीं करना चाहता हूं, इसलिए इसे ग्लोबल कॉन्फ़िगर फ़ाइल में अक्षम करना मेरे लिए ठीक नहीं है। ANSIBLE_HOST_KEY_CHECKINGप्लेबुक चलाने से पहले जैसे निर्यात करना, चलने से पहले एक और बात है जिसे याद रखने की जरूरत है।

जहां पर प्लेबुक है, उसी डिअर में लोकल कॉन्फिग फाइल जोड़ना बेहतर है। नाम बनाएँ ansible.cfgऔर पाठ के बाद पेस्ट करें:

[defaults]
host_key_checking = False

Env vars में कुछ जोड़ने या ansible-playbookविकल्पों में जोड़ने के लिए याद रखने की आवश्यकता नहीं है । इस फाइल को आसानी से जीएसटी रेपो में डालना आसान है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.