วิธีการเข้ารหัสไฟล์ไบนารีใน Ansible


9

เรากำลังใช้Ansible Vaultเพื่อจัดเก็บรหัสผ่านกุญแจส่วนตัวสำหรับใบรับรอง ฯลฯ ในที่เก็บ Git Ansible Playbook ของเรา ข้อมูลส่วนตัวที่มีอยู่ทั้งหมดของเราอยู่ในรูปแบบข้อความดังนั้นเราสามารถเก็บไว้ในตัวแปร สิ่งเหล่านี้จะถูกใช้ในเทมเพลตหรือด้วยcontentพารามิเตอร์ของโมดูลคัดลอก

ตอนนี้เรามีไฟล์ Java KeyStore ซึ่งน่าเศร้าที่มีรูปแบบไบนารี เช่นนี้มันไม่สามารถเก็บไว้ในตัวแปร - หรืออย่างน้อยฉันก็ไม่รู้ว่าจะทำยังไง อะไรจะเป็นวิธีที่ง่ายที่สุดในการเข้ารหัสไฟล์ของเราอย่างถูกต้องในขณะที่มันอยู่ในคอมไพล์ แต่ใช้ได้เมื่อทำงานansible-playbook?

สิ่งที่ฉันได้ลองไปแล้วโดยไม่ประสบความสำเร็จ:

  • การเข้ารหัสไฟล์ไบนารีใน base64, การจัดเก็บข้อมูลที่เข้ารหัสในตัวแปรและการใช้แม่แบบ{{base64_data | b64decode}}โมดูล นำไปสู่การEF BF BDดัมพ์เลขฐานสิบหกของไฟล์ผลลัพธ์ สามไบต์เข้ารหัสอักขระการแทนที่ Unicode ใน UTF-8 ดังนั้นจึงมีปัญหากับการตีความข้อมูลไบนารีเป็นข้อความ
  • การเข้ารหัสไฟล์ไบนารีใน base64, การจัดเก็บข้อมูลที่เข้ารหัสในตัวแปรและการใช้สำเนาcontent="{{base64_data | b64decode}}"โมดูล Ansible บ่นกับ "ตัวแปรแทรกพารามิเตอร์ใหม่ลงในโมดูล args" เมื่อใช้เครื่องหมายคำพูดเดี่ยวแทนที่จะเป็นเครื่องหมายคำพูดคู่ Ansible จะบ่นกับ "ข้อผิดพลาดในการวิเคราะห์สตริงอาร์กิวเมนต์" และคัดลอกข้อมูลไบนารีทั้งหมดที่ถูกเททิ้งไปที่เทอร์มินัล ...

จากการอภิปรายในgroups.google.com/d/topic/ansible-project/IinZK14FyX4ฉันสรุปได้ว่า ansible ไม่สนับสนุนสิ่งนี้และคุณต้องทำบางสิ่งที่ base64 ด้วยตัวคุณเอง แต่อาจมีบางสิ่งที่บุคคลที่สาม ที่สามารถทำให้ง่ายขึ้น
Antonis Christofides

ขอบคุณนี่ดูดีนะ จะลองแล้วรายงานกลับ ...
Daniel Seither

ไม่เศร้าไม่ทำงาน (ดูคำถามที่แก้ไขแล้ว) มีการอภิปรายเกี่ยวกับคำขอดึงที่อาจมีความเกี่ยวข้อง: github.com/ansible/ansible-modules-extras/pull/142
Daniel Seither

คุณคิดที่จะห่อสิ่งนี้ด้วยการโทร GPG หรือไม่? คุณสามารถมีการแสดง ASCII ของไพรเวตคีย์ GPG ที่จัดเก็บไว้ใน Ansible Vault และใช้เพื่อถอดรหัสไฟล์ไบนารี่ของคุณซึ่งจะถูกเก็บไว้ในคอมไพล์โดยไม่มีปัญหา
Christopher Karel

ขอบคุณสำหรับคำแนะนำของคุณ แต่วิธีแก้ปัญหานี้มีส่วนเกี่ยวข้องมากกว่าที่ฉันต้องการ ฉันคิดเกี่ยวกับการคัดลอก KeyStore ที่เข้ารหัส 64 ฐานไปยังเครื่องเป้าหมายและมีตัวจัดการที่ถอดรหัสไฟล์ในการอัปเดต แต่ฉันต้องการโซลูชันที่ไม่ทิ้งไฟล์ชั่วคราว
Daniel Seither

คำตอบ:


4

คุณสามารถใช้คำสั่งเชลล์กับตัวแปร base64 เพื่อทำสิ่งนั้น

- vars:
  - myvar: "<my_base64_var>"
- name: Create binary file
  shell: "echo '{{myvar}}' | base64 -d > /var/tmp/binary.dat"

เอริค


นี่เป็นตัวเลือกโดยเฉพาะอย่างยิ่งเนื่องจากไม่ได้ใช้ไฟล์ชั่วคราว น่าเศร้าที่มันไม่อนุญาตให้ Ansible ตรวจพบว่ามีการเปลี่ยนแปลง แต่ดีกว่าโซลูชันอื่น ๆ ทั้งหมดที่ฉันเคยเห็น
Daniel Seither

1
ฉันคิดว่าห้องนิรภัยรองรับทันที: "คุณสมบัติห้องนิรภัยยังสามารถเข้ารหัสไฟล์ตามอำเภอใจหรือแม้แต่ไฟล์ไบนารี่ได้หากไฟล์ที่เข้ารหัสห้องนิรภัยถูกกำหนดให้เป็นอาร์กิวเมนต์ src ไปยังโมดูลคัดลอกไฟล์จะถูกวางไว้ที่ปลายทางบนโฮสต์เป้าหมาย ถอดรหัส (สมมติว่ารหัสผ่านห้องนิรภัยที่ถูกต้องจะได้รับเมื่อเรียกใช้การเล่น) " - docs.ansible.com/ansible/playbooks_vault.html
Mike Gleason jr Couturier

2
โปรดทราบว่าพวกเขาดูเหมือนจะย้ายข้อความที่ยกมาโดย @MikeGleasonjrCouturier ไปยังหน้าอื่นในเอกสารอธิบาย ดูdocs.ansible.com/ansible/latest/vault.htmlทันที
เลียม

2

วิธีที่เราทำเช่นนั้นสำหรับการตั้งค่าที่ตรวจสอบได้คือ:

- เราเข้ารหัสเนื้อหาที่ละเอียดอ่อนแต่ละรายการ (ชุดย่อยขนาดเล็กของที่เก็บข้อมูลของเรา) โดยใช้https://www.agwa.name/projects/git-crypt/ - เราทุกคนกระทำการโดยใช้แท็กเครื่องหมาย git - เราตรวจสอบเป็นระยะ ๆ ว่ามีไฟล์ที่ไม่ได้ลงนามหรือไม่

ข้อได้เปรียบของ git-crypt คือเมื่ออาศัยตัวกรอง git การเข้ารหัสจะโปร่งใส นอกจากนี้คุณสามารถให้การเข้าถึงที่เก็บแก่นักพัฒนาโดยไม่สูญเสียเนื้อหาที่เข้ารหัส (มันจะละเว้นไฟล์ที่เข้ารหัสหากไม่สามารถรับคีย์ถอดรหัส)

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