จะใช้รหัสผ่าน Ansible ได้อย่างไรถ้ารหัสถูกปฏิเสธ


14

อินสแตนซ์เซิร์ฟเวอร์ใหม่ของฉันถูกกำหนดค่าให้ล็อกอินบนรูทผ่าน ssh ด้วยรหัสผ่าน ฉันต้องการให้ Ansible playbook กำหนดค่าใหม่ให้ใช้กุญแจแทนและปิดใช้งานการเข้าสู่ระบบด้วยรหัสผ่านเมื่อเปิดใช้งานครั้งแรกดังนั้นฉันต้องการสิ่งนี้:

  • ลองเข้าสู่ระบบด้วยรหัส
  • หากไม่สามารถเข้าสู่ระบบด้วยรหัส:

    • เข้าสู่ระบบด้วยรหัสผ่าน
    • เพิ่มรหัสไปที่ authorized_keys
    • ปิดใช้งานการเข้าสู่ระบบด้วยรหัสผ่าน
    • เลือกที่จะเชื่อมต่อใหม่โดยใช้รหัส
  • ทำงานอื่น ๆ

ฉันจะทำให้สำเร็จได้อย่างไร

แก้ไข : เพื่อความชัดเจนฉันไม่ได้ถามวิธีเพิ่มคีย์หรือปิดใช้งานรูทนั่นเป็นเพียงบริบท ฉันถามวิธีสำรองทางรหัสผ่านหากไม่สามารถตรวจสอบสิทธิ์ด้วยรหัส ด้วย--ask-passหรือansible_ssh_passตั้งค่า Ansible จะไม่พยายามใช้การรับรองความถูกต้องของรหัสสาธารณะ


เป็นคำถามที่ดีคุณได้ลองทำอะไรไปแล้ว
dawud

1
ฉันใช้การกำหนดค่า ssh ไปยัง playbook ที่แยกต่างหากและรันด้วยตัวเลือก -k จากนั้นฉันเรียกใช้ playbook หลักที่ไม่มี -k (โดยใช้ปุ่มจากตัวแทน) ฉันหวังว่ามันจะถูกห่อด้วย playbook
เล่ม

@ petr0 วิธีนี้ใช้ได้สำหรับฉันเมื่อรหัสผ่าน Ask-Pass สำหรับผู้ใช้อื่นที่ไม่ใช่คีย์ (เช่นเมื่อคุณสลับผู้ใช้ระยะไกลหลังจากปิดใช้งานรหัสผ่าน ssh) ไม่แน่ใจว่าช่วยได้หรือไม่
DylanYoung

คำตอบ:


6

คุณอาจจะลองใช้ตัวเลือกการตั้งค่าให้PreferredAuthentications publickey,passwordค่าเริ่มต้นรวมถึงสิ่งเหล่านี้ตามลำดับนี้พร้อมกับตัวเลือกอื่น ๆ ดังนั้นจึงสามารถตั้งค่านี้ได้ การเพิ่มผ่าน-oหรือลูกค้าssh_configอาจป้องกันไม่ให้

คุณอาจสามารถใช้สคริปต์ตัวตัดคำ ตัวอย่างเช่นเมื่อใช้สิ่งนี้ในkey_or_password.shและ a pass.shที่ให้รหัสผ่านการเรียกใช้bash key_or_password.sh root@hostจะลองใช้ publickey ตามด้วยการลงชื่อเข้าใช้รหัสผ่านที่ไม่ต้องมีการโต้ตอบ

export DISPLAY=dummy:0
export SSH_ASKPASS=$PWD/pass.sh
exec setsid ssh -v -o 'PreferredAuthentications publickey,password' "$@"

บันทึกระบุว่าวิธีการใดประสบความสำเร็จเช่น

debug1: Authentication succeeded (publickey).

7

นี่คือสิ่งที่ฉันทำถ้าansible_userแตกต่างสำหรับ 'การเรียกใช้ครั้งแรก' ของ playbook (ตัวอย่างเช่นถ้าคุณมีrootผู้ใช้เพียงคนเดียวและคุณจะตั้งค่าผู้ใช้ใหม่ด้วยคีย์ SSH):

  • เก็บรหัสผ่านansible_passตามที่คุณต้องการหากคุณใช้การเข้าสู่ระบบรหัสผ่าน (อย่าลืมใช้ Vault) นี่ควรเป็นรหัสผ่านของผู้ใช้ที่คุณใช้สำหรับ 'เรียกใช้ครั้งแรก' ของ playbook
  • ตั้งค่าansible_userชื่อผู้ใช้ของผู้ใช้ที่คุณต้องการใช้หลังจากเรียกใช้ครั้งแรกเมื่อคุณตั้งค่าผู้ใช้อย่างถูกต้องบนเซิร์ฟเวอร์
  • ตั้งค่าตัวแปรของansible_user_first_runผู้ใช้ที่คุณกำลังจะใช้สำหรับ 'การทำงานครั้งแรกของ PlayBook rootตัวอย่างเช่น
  • ใช้คำสั่งท้องถิ่นเพื่อพยายามเชื่อมต่อกับเซิร์ฟเวอร์ด้วยคีย์ SSH ที่ถูกต้องโดยใช้ignore_errorsและchanged_when: False
  • หากสิ่งนั้นล้มเหลวให้อัพเดตansible_userเป็นค่าของansible_user_first_run

นี่คือรหัส:

---
- name: Check if connection is possible
  command: ssh -o User={{ ansible_user }} -o ConnectTimeout=10 -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes {{ inventory_hostname }} echo "Worked"
  register: result
  connection: local
  ignore_errors: yes
  changed_when: False
- name: If no connection, change user_name
  connection: local
  set_fact:
    ansible_user: "{{ ansible_user_first_run }}"
  when: result|failed

หมายเหตุ: มันควรค่าแก่การตั้งค่าtransport = sshเนื่องจาก paramiko อาจล้มเหลวในการลงชื่อเข้าใช้เซิร์ฟเวอร์โดยไม่คาดคิดในการกำหนดค่าบางอย่าง (เช่นเมื่อเซิร์ฟเวอร์ตั้งค่าไม่ให้รับรหัสผ่านและคุณลองใช้รหัสผ่านเป็นครั้งแรก การขนส่งด้วย SSH นั้นเร็วกว่าดังนั้นมันก็คุ้มค่าอยู่ดี

หมายเหตุเพิ่มเติม: หากคุณใช้วิธีนี้คุณจะต้องระบุgather_facts: falseในไฟล์คำจำกัดความของ playbook เพื่อให้การรวบรวม / การรวบรวมข้อมูลข้อเท็จจริงไม่ทำงานโดยอัตโนมัติก่อนที่คุณจะถึงขั้นตอนการทดสอบรหัสผ่าน หากคุณต้องการข้อเท็จจริงใด ๆ คุณจะต้องโทรหาsetupบทบาทของคุณอย่างชัดเจนก่อนที่จะเข้าถึงข้อมูลใด ๆ ที่มีอยู่ตามปกติในสถานที่เช่นansible_devicesฯลฯ วิธีที่ดีวิธีหนึ่งในการทำเช่นนี้คือการโทรsetupด้วยwhenประโยคที่ตรวจสอบเพื่อดูว่า ความจริงที่คุณกำลังใช้นั้นว่างเปล่าหรือไม่ก่อนที่คุณจะเรียกมันว่าในบทบาทของคุณ


วิธีการแก้ปัญหาของคุณดี แต่คุณต้องเพิ่ม a gather_facts: noเพื่อหยุด ansible พยายามเชื่อมต่อเมื่อเปิด playbook :)
k4cy

คุณถูก. ฉันได้รวบรวม gather_facts เป็นปิดสำหรับ playbooks ทั้งหมดของฉันเพื่อที่ฉันจะต้องเรียก 'ตั้งค่า' อย่างชัดเจน ฉันลืมที่จะพูดถึงเรื่องนี้ในคำตอบฉันจะอัปเดตทันที
Tom Bull

5

คุณสามารถใช้--ask-passเมื่อใช้งานเพลย์บุ๊ค ansible

สำหรับงานอื่น ๆ ที่คุณถามก็สามารถทำได้โดยวิธีการต่าง ๆ เช่นคัดลอกโมดูล
การปิดใช้งานการล็อกอินรูทสามารถทำได้เช่นกัน โดย templating sshd_confหรือแทรกบรรทัดในไฟล์ conf


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