จะละเว้นการตรวจสอบความถูกต้องของ SSH ที่ไม่สามารถตรวจได้อย่างไร


165

มีวิธีละเว้นการตรวจสอบความถูกต้องของ SSH ที่ทำโดย Ansible หรือไม่ ตัวอย่างเช่นเมื่อฉันเพิ่งตั้งเซิร์ฟเวอร์ใหม่ฉันต้องตอบว่าใช่สำหรับคำถามนี้:

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

ฉันรู้ว่านี่เป็นความคิดที่ไม่ดี แต่ฉันได้รวมสิ่งนี้ไว้ในสคริปต์ที่สร้างเซิร์ฟเวอร์เสมือนใหม่ที่ผู้ให้บริการคลาวด์ของฉันก่อนแล้วจึงเรียกเพลย์บุ๊คที่สามารถตรวจสอบได้ของฉันเพื่อกำหนดค่า ฉันต้องการหลีกเลี่ยงการแทรกแซงของมนุษย์ในระหว่างการดำเนินการสคริปต์

คำตอบ:


248

สองตัวเลือก - ตัวแรกอย่างที่คุณพูดในคำตอบของคุณคือการตั้งค่าตัวแปรสภาพแวดล้อมANSIBLE_HOST_KEY_CHECKINGเป็นเท็จ

วิธีที่สองในการตั้งค่าคือการใส่ไว้ในไฟล์ ansible.cfg และเป็นตัวเลือกที่มีประโยชน์จริง ๆ เพราะคุณสามารถตั้งค่าแบบโกลบอล (ในระดับระบบหรือผู้ใช้ใน/etc/ansible/ansible.cfgหรือ~/.ansible.cfg) หรือในไฟล์ปรับแต่งในไดเรกทอรีเดียวกัน ในฐานะ playbook ที่คุณใช้งาน

หากต้องการทำเช่นนั้นให้สร้างansible.cfgไฟล์ในหนึ่งในสถานที่เหล่านั้นและรวมถึงสิ่งนี้:

[defaults]
host_key_checking = False

คุณยังสามารถตั้งค่าเริ่มต้นที่มีประโยชน์อื่น ๆ อีกมากมายเช่นมีการรวบรวมข้อเท็จจริงในช่วงเริ่มต้นของการเล่นหรือไม่ว่าจะรวมแฮชที่ประกาศไว้ในหลาย ๆ ที่หรือจะแทนที่ด้วยอีกอันหนึ่งเป็นต้น มีรายการใหญ่ทั้งตัวเป็นที่นี่ในเอกสารเบิ้ล


แก้ไข: บันทึกความปลอดภัย

การตรวจสอบความถูกต้องของคีย์โฮสต์ SSH เป็นเลเยอร์ความปลอดภัยที่มีความหมายสำหรับโฮสต์แบบต่อเนื่อง - หากคุณกำลังเชื่อมต่อกับเครื่องเดียวกันหลายครั้งมันมีประโยชน์ที่จะยอมรับรหัสโฮสต์ภายในเครื่อง

สำหรับอินสแตนซ์ EC2 ที่มีอายุการใช้งานนานขึ้นจะเหมาะสมที่จะยอมรับคีย์โฮสต์ที่มีงานที่เรียกใช้เพียงครั้งเดียวในการสร้างอินสแตนซ์เริ่มต้น:

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

ไม่มีค่าความปลอดภัยสำหรับการตรวจสอบคีย์โฮสต์ในอินสแตนซ์ที่คุณยืนขึ้นแบบไดนามิกและลบทันทีหลังจากการดำเนินการกับ playbook แต่มีค่าความปลอดภัยในการตรวจสอบคีย์โฮสต์สำหรับเครื่องที่มีอยู่ ดังนั้นคุณควรจัดการการตรวจสอบคีย์โฮสต์แตกต่างกันตามสภาพแวดล้อมแบบลอจิคัล

  • ปล่อยให้การตรวจสอบเปิดใช้งานตามค่าเริ่มต้น (ใน~/.ansible.cfg)
  • ปิดการใช้งานการตรวจสอบคีย์โฮสต์ในไดเรกทอรีการทำงานสำหรับ playbooks ที่คุณทำงานกับอินสแตนซ์ชั่วคราว ( ./ansible.cfgข้าง playbook สำหรับการทดสอบหน่วยกับ VMs พเนจรระบบอัตโนมัติสำหรับอินสแตนซ์ ec2 อายุสั้น)

5
ไม่มีใครรู้ว่าสิ่งที่เป็นวิธีปฏิบัติที่ดีที่สุดที่นี่? ตัวอย่างเช่นคุณสามารถเรียกใช้สคริปต์เป็นระยะ ๆ เพื่อรีเซ็ตโฮสต์ที่คุณรู้จักซึ่งจะปลอดภัยมากขึ้น (เว้นแต่จะได้รับการโจมตีจาก MITM ซึ่งทำให้หน้าต่างดังกล่าวหยุดทำงาน) การเพิกเฉยความถูกต้องโดยค่าเริ่มต้นจะกำจัดหนึ่งในกลไกความปลอดภัยหลัก SSH
TonyH

3
ฉันชอบรูปแบบที่ทีมของฉันใช้: เราใส่ไฟล์ ansible.cfg ที่ปิดการใช้งานการตรวจสอบคีย์โฮสต์ในไดเรกทอรีทำงานสำหรับ playbooks ที่เราทำงานกับอินสแตนซ์ชั่วคราว ระดับระบบ
nikobelia

1
วิธีการที่คุณสามารถจัดการการตรวจสอบคีย์โฮสต์ต่อสภาพแวดล้อมเชิงตรรกะ ไม่มีค่าความปลอดภัยสำหรับการตรวจสอบคีย์โฮสต์ในอินสแตนซ์ที่คุณยืนขึ้นแบบไดนามิกและลบทันทีหลังจากการดำเนินการกับ playbook แต่มีค่าความปลอดภัยในการตรวจสอบคีย์โฮสต์สำหรับเครื่องถาวร ดังนั้นคุณควรมีค่าเริ่มต้นที่แตกต่างกันสำหรับกรณีการใช้งานที่แตกต่างกัน
nikobelia

2
หากมีการใช้กลไกบางอย่างเพื่อจัดเตรียมเครื่องจักรใหม่ถาวรหรือชั่วคราวกลไกนั้นควรให้กุญแจสาธารณะ SSH ของเครื่องนี้แก่คุณ จากนั้นคุณสามารถเก็บไว้ในknown_hostsไฟล์ในเครื่องของคุณสำหรับ SSH และ Ansible เพื่อจดจำเครื่อง ความล้มเหลวในการทำเช่นนั้นโดยเฉพาะอย่างยิ่งโดยการปิดใช้งานการตรวจสอบคีย์โฮสต์ทำให้การรักษาความปลอดภัยของ SSH ลดลงจนเกือบเป็นศูนย์และทำให้สามารถโจมตี MITM ได้ เครื่องจำนวนมากรู้สึกว่าอยู่ใน "เครือข่ายภายใน" ที่เชื่อมต่อกับอินเทอร์เน็ตซึ่งการตอบสนอง DNS ที่เร็วขึ้นเพียงครั้งเดียวช่วยให้คุณสามารถพูดคุยกับผู้โจมตีได้แทนที่จะเป็นเป้าหมายของคุณ
aef

2
@ TonyH เมื่อทำการตั้งค่าโฮสต์จำนวนมากผ่าน AWS Cloudformation และ Ansible ฉันวิ่งssh-keyscan <ip list>บนเครื่องที่เชื่อถือได้ (สำหรับฉันมันเป็นโฮสต์ / กระโดดโฮสต์) ภายในเครือข่ายเดียวกันและวางผลลัพธ์ในknown_hosts การตั้งค่าโฮสต์ที่เชื่อถือได้ AWS จะเปิดเผย รหัสโฮสต์ในบันทึกการเริ่มต้นของอินสแตนซ์ดังนั้นการค้นหาคีย์นั้นเป็นขั้นตอนที่ต้องทำด้วยตัวเองฉันไม่เคยตัดเลยถ้าฉันทำสิ่งที่สมบูรณ์แบบสำหรับสภาพแวดล้อมของฉัน แต่โฮสต์นั้นไม่จำเป็นต้องถูกลบ สิ่งนี้อาจช่วยได้
dcc310

34

ผมพบคำตอบที่คุณจะต้องตั้งตัวแปรสภาพแวดล้อมในการANSIBLE_HOST_KEY_CHECKING Falseตัวอย่างเช่น:

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...

2
ใช่ แต่คุณบอกว่าคุณใช้สิ่งนี้กับเซิร์ฟเวอร์ใหม่ที่เพิ่งตั้งค่า นี่เป็นการหลีกเลี่ยงการต้องจัดการกับคีย์โฮสต์ในเวลานี้ แต่สิ่งที่เกี่ยวกับการเชื่อมต่อ SSH ที่ตามมา? สคริปต์การตั้งค่าของคุณจะทำงานกำหนดค่าเซิร์ฟเวอร์และเสร็จสิ้น ตอนนี้คุณมี playbooks อื่น ๆ ที่คุณใช้พูดหรือมีสคริปต์ที่ใช้ SSH ตอนนี้มันใช้งานไม่ได้เนื่องจากรหัสโฮสต์ยังไม่รู้จักกันในชื่อ _hosts คุณมีปัญหาล่าช้าเท่านั้น กล่าวโดยย่อสิ่งที่คุณเขียนที่นี่ดูเหมือนจะไม่ใช่คำตอบที่ดีสำหรับคำถามที่คุณถาม
ทอดด์วอลตัน

สิ่งนี้ถูกใช้ในสคริปต์ทุบตีเมื่อสร้างเซิร์ฟเวอร์ใหม่มันไม่ได้ใช้สำหรับสิ่งอื่นใด
Johan

8

ไปข้างหน้าเพื่อnikobelia

สำหรับผู้ที่ใช้เจนกินส์เพื่อเล่นหนังสือเล่มนี้ฉันเพิ่งเพิ่มงานเจนกินส์ของฉันก่อนที่จะรันเพลย์บุ๊ค ansible-the- ตัวแปรสภาพแวดล้อมของเขา ANSIBLE_HOST_KEY_CHECKING = False สำหรับตัวอย่างนี้

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

คุณสามารถส่งมันเป็นอาร์กิวเมนต์บรรทัดคำสั่งในขณะที่เรียกใช้ playbook:

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


2

หากคุณไม่ต้องการแก้ไขansible.cfgหรือplaybook.ymlคุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมได้:

export ANSIBLE_HOST_KEY_CHECKING=False

1

การเพิกเฉยต่อการตรวจสอบเป็นความคิดที่ไม่ดีเนื่องจากทำให้คุณไวต่อการโจมตีแบบ Man-in-the-middle

ฉันใช้เสรีภาพในการปรับปรุงคำตอบของ nikobeliaโดยเพิ่มคีย์ของแต่ละเครื่องเพียงครั้งเดียวและตั้งค่าสถานะ ok / เปลี่ยนแปลงใน 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"

หนึ่งหงิกงอที่ฉันไม่สามารถทำงานได้คือมันทำเครื่องหมายว่ามีการเปลี่ยนแปลงแม้ว่าจะเพิ่มคีย์เดียวเท่านั้น ถ้าใครสามารถมีส่วนร่วมแก้ไขที่จะดี!


0

ใช้พารามิเตอร์ชื่อเป็น validate_certs เพื่อละเว้นการตรวจสอบ ssh

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

การทำเช่นนี้จะเป็นการข้ามกระบวนการตรวจสอบ ssh


validate_certsพารามิเตอร์เพียงแค่บอก Boto ไม่ตรวจสอบ AWS API HTTPS ใบรับรอง ไม่ส่งผลกระทบต่อการตรวจสอบคีย์ SSH
Matthew Dutton

0

ฉันรู้ว่าคำถามได้รับการตอบแล้วและก็ถูกต้องเช่นกัน แต่เพียงต้องการเชื่อมโยงเอกสารที่มีคำอธิบายซึ่งอธิบายอย่างชัดเจนว่าควรเพิ่มการตรวจสอบเมื่อใดและเพราะเหตุใด: การตรวจสอบโฮสต์ - คีย์ - การตรวจสอบ


0

ปัญหาส่วนใหญ่จะปรากฏขึ้นเมื่อคุณต้องการเพิ่มโฮสต์ใหม่ให้กับสินค้าคงคลังแบบไดนามิก (ผ่านโมดูล add_host) ใน playbook ฉันไม่ต้องการปิดการใช้งานการตรวจสอบโฮสต์ลายนิ้วมืออย่างถาวรดังนั้นโซลูชันเช่นการปิดใช้งานในไฟล์กำหนดค่าทั่วโลกไม่เป็นไรสำหรับฉัน การส่งออก var like ANSIBLE_HOST_KEY_CHECKINGbefore play playbook เป็นอีกสิ่งที่ต้องทำก่อนการเรียกใช้ซึ่งจำเป็นต้องได้รับการจดจำ

มันจะดีกว่าที่จะเพิ่มไฟล์ปรับแต่งท้องถิ่นใน dir เดียวกับที่ playbook อยู่ สร้างชื่อไฟล์ansible.cfgและวางข้อความต่อไปนี้:

[defaults]
host_key_checking = False

ไม่จำเป็นต้องจำที่จะเพิ่มบางสิ่งบางอย่างใน env vars หรือเพิ่มansible-playbookตัวเลือก มันง่ายที่จะนำไฟล์นี้ไปยัง repo git ที่เข้าใจได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.