ฉันจะรันเพลย์บุ๊ค Ansible Azure ในขณะที่หลีกเลี่ยงการจัดเก็บข้อมูลรับรองในไฟล์ได้อย่างไร


13

พื้นหลัง

  1. เราใช้ Ansible เพื่อจัดเตรียมและจัดการโครงสร้างพื้นฐาน Azure ในขณะนี้เราเรียกใช้ Ansible "ด้วยตนเอง" นั่นคือเราเรียกใช้ playbooksสำหรับงานอัตโนมัติต่างๆ ไม่มีโครงสร้างพื้นฐาน CI
  2. อาจจะไม่ได้เกี่ยวข้อง azure_rm.pyแต่เราจัดการสินค้าคงคลังของเราใช้สคริปต์แบบไดนามิก
  3. เราได้รับการสนับสนุนให้มีความปลอดภัยมากที่สุดเช่น
    1. อย่าเก็บรหัสผ่านห้องนิรภัยใน~/.vault_passหรือในไฟล์ภายในเครื่อง
    2. อย่าเก็บความลับของ Azure ~/.azure/credentials
    3. อย่าเก็บสิ่งที่ปลอดภัย.bashrcไว้

ในสถานการณ์ดังกล่าวฉันมีปัญหาในการหากลยุทธ์ที่สอดคล้องกันเพื่อให้แน่ใจว่า playbooks ของฉันสามารถเข้าถึงความลับของ Azure ได้ในขณะที่ทำตามแนวทางข้างต้น

คำถาม

ฉันจะหลีกเลี่ยงการจัดเก็บข้อมูลประจำตัวของ Ansible Vault และ Azure บนไฟล์ได้อย่างไรในขณะที่ยังมั่นใจได้ว่า playbooks ของฉันสามารถเข้าถึงได้

สิ่งที่ฉันได้ลอง

จนถึงตอนนี้ฉันได้สร้างสคริปต์ตัวคลุมขึ้นมา

  1. ขอให้ผู้ใช้รหัสผ่าน Vault
  2. ใช้เพื่อถอดรหัส Vaulted Shell script
  3. ประเมินสคริปต์ซึ่งโหลดตัวแปรสภาพแวดล้อม Azure ลงในสภาพแวดล้อม
  4. เรียกใช้ playbook บนสภาพแวดล้อมที่ตั้งค่าไว้

มีโซลูชัน "Ansible" ที่ดีกว่า (หรูหรากว่าซับซ้อนกว่าหรือน้อยกว่า) ออกไปหรือไม่


สิ่งที่รบกวนคุณมากที่สุดในกระบวนการทำงานนี้
Konstantin Suvorov

1
@ KonstantinSuvorov ส่วนใหญ่เป็นจำนวนของห่วงที่ฉันต้องข้ามไปเพื่อให้บรรลุสิ่งที่ดูเหมือน (สำหรับฉันอย่างน้อย) สิ่งที่เป็นเรื่องธรรมดาที่พบบ่อยในองค์กรที่ปฏิบัติตามอย่างหนัก
Vish

คำตอบ:


8

รหัสผ่านห้องนิรภัย

ก่อนอื่นคุณควรทำความคุ้นเคยกับความจริงที่ว่าไฟล์รหัสผ่าน vault นั้นสามารถเรียกใช้สคริปต์ได้ ในกรณีนี้ Ansible จะเรียกใช้งานและคาดว่าจะได้รับรหัสผ่านเป็นเอาท์พุท

ตัวอย่างเช่นคุณสามารถใช้gpg-agentหรือkeychainเก็บรหัสผ่านจริงของคุณและปลดล็อคเมื่อจำเป็น อ่านเพิ่มเติมในโพสต์บล็อกนี้: https://benincosa.com/?p=3235

หากคุณเป็นคนหวาดระแวงคุณสามารถเพิ่มการแจ้งเตือนเมื่อมีการเรียกสคริปต์รหัสผ่านของคุณดังนี้:

#!/bin/bash
PARENT_PROCESS=$(ps -p $PPID -o args | tail -n 1)
osascript -e "display notification \"Vault password used by ${PARENT_PROCESS}\" with title \"Ansible\" sound name \"default\""
gpg --batch --use-agent --no-tty --decrypt key.gpg 2>/dev/null

สคริปต์รหัสผ่านห้องนิรภัยนี้ใช้key.gpgเป็นคีย์ห้องนิรภัยจริงและยังแสดงการแจ้งเตือนป๊อปอัพ (สำหรับ MacOS) พร้อมชื่อกระบวนการหลักเมื่อใช้สคริปต์ แคชตัวแทน Gpg ปลดล็อครหัสผ่านบางครั้งดังนั้นจึงไม่จำเป็นต้องป้อนรหัสผ่านทุกครั้งที่คุณเริ่มเล่น

เพียงแค่ตั้งในของคุณvault_password_file = ./vault_pass.shansible.cfg

สิ่งแวดล้อม

คุณบอกว่าคุณใช้azure_rm.pyเป็นสคริปต์คลังโฆษณาแบบไดนามิก ซึ่งหมายความว่าคุณต้องตั้งค่าข้อมูลรับรองลงในตัวแปรสภาพแวดล้อมของคุณก่อนที่คุณจะเริ่มเล่นเพลย์เยอร์ที่สามารถเล่นได้เพื่อให้สามารถใช้งานได้

คุณสามารถสร้างสองไฟล์:

secure_env (เข้ารหัสด้วยห้องนิรภัย):

export AZURE_SECRET=xxx;export AZURE_SUBSCRIPTION_ID=xxx;

set_env (ข้อความธรรมดา):

echo -n "Setting secure vars... "
eval $(ansible-vault view secure_env)
echo "done."

เมื่อคุณเปิดเทอร์มินัลใหม่เพื่อดำเนินงานอัตโนมัติของคุณคุณต้องเรียกใช้:

source set_env

ในขณะนี้ทุบตีประเมินset_envและsecure_env(ถอดรหัสผ่าน ansible-vault) หลังจากคำสั่งนี้คุณมี Azure หนังสือรับรองที่กำหนดไว้สำหรับเปลือกปัจจุบันดังนั้นคุณสามารถดำเนินการ playbooks ตามปกติ:

ansible-playbook provision-my-azure-instances.yml

ดังนั้นเมื่อใช้สองวิธีนี้คุณสามารถจัดเก็บkey.gpgและsecure_envในที่เก็บของคุณ จากนั้นในการโทรเทอร์มินัลใหม่source set_envหนึ่งครั้งให้ป้อนรหัสผ่าน gpg หนึ่งครั้ง (เพื่อปลดล็อคการใช้งาน key.gpg ในอนาคต); จากนั้นโทรansible-playbookหลายครั้งตามที่คุณต้องการโดยไม่มีรหัสผ่านใด ๆ


ขอบคุณสำหรับการตอบกลับ. ให้ฉันลองทำดูในสัปดาห์นี้
Vish

ดังนั้นข้อได้เปรียบหลักจากวิธีการดั้งเดิมของฉันคือมันใช้ GPG - ซึ่งจะให้ประโยชน์การแคช --- ใช่ไหม? แนวทางด้านสิ่งแวดล้อมนั้นคล้ายกับสิ่งที่ฉันคิดขึ้นมา
Vish

1
จาก OP ของคุณฉันเข้าใจว่าคุณใช้ wrapper ทุกครั้งเมื่อคุณเรียกใช้ playbook ด้วยsourceวิธีการที่คุณตั้งค่าสภาพแวดล้อมหนึ่งครั้งต่อเทอร์มินัลเซสชันและสามารถใช้เครื่องมือทุกช่วงแยกกัน: ansible-playbooks สคริปต์สินค้าคงคลัง Azure cli โดยไม่ต้องใช้อุปกรณ์เสริมใด ๆ
Konstantin Suvorov

อ่าเข้าใจแล้ว ป่วยให้กับทีมของฉัน ยอมรับคำตอบของคุณเป็นวิธีที่สะดวกกว่า ขอบคุณสำหรับการวิจัยและคำอธิบาย! นอกจากนี้ผมชอบบล็อกของคุณ :)
ฉกชิง

ประโยชน์หลักของการใช้ GPG (หรือพวงกุญแจบน macOS หรือ Linux) คือสมาชิกในทีมแต่ละคนมีการพิสูจน์ตัวตนของตนเองเพื่อปลดล็อคคีย์ส่วนตัวที่ไม่ซ้ำกัน คีย์นี้ใช้เพื่อปลดล็อกรหัสผ่าน Ansible Vault ซึ่งเป็นความลับที่แชร์ คุณต้องหมุนความลับทั้งหมดของคุณถ้ามีคนออกจากทีมอยู่แล้วรวมถึงรหัสผ่าน Ansible Vault แต่อย่างน้อยรหัสผ่าน GPG / พวงกุญแจไม่จำเป็นต้องเปลี่ยน
RichVel

2

โปรดอ่านhttps://docs.ansible.com/ansible/2.4/vault.html เนื่องจาก Ansible 2.4 สามารถ--vault-id @promptใช้ได้

เข้ารหัสไฟล์โดยใช้ ansible-vault:

ansible-vault encrypt /path/to/encrypted/file

เรียกใช้ playbook และจะส่งผลให้:

fatal: [localhost]: FAILED! => {"msg": "A vault password or secret must be
specified to decrypt /path/to/encrypted/file"}

มีหลายตัวเลือกในการถอดรหัสไฟล์รวมถึง@prompt:

ansible-playbook some-playbook --vault-id @prompt

จะแจ้งให้:

Vault password (default):

เมื่อป้อนรหัสผ่าน vault แล้ว playbook ควรจะสำเร็จ


1
การอ่านหน้าเว็บดูเหมือนว่ามีวิธีแก้ไขอยู่ที่นั่น แต่ไม่สามารถคิดได้ว่าใช้เฉพาะลิงก์ คุณช่วยอธิบายรายละเอียดได้ไหม?
Vish

ขอบคุณสำหรับการทำอย่างประณีต ฉันต้องขอรหัสผ่านห้องนิรภัยโดยใช้--ask-vault-passตัวเลือกที่เก่ากว่า และฉันไม่เข้าใจว่าการแทนที่ด้วย--vault-idจะตอบคำถามที่ใหญ่กว่าของเวิร์กโฟลว์ที่ดีขึ้นได้อย่างไร
Vish

เมื่อคุณเรียกฉันไปที่ลิงค์ที่ผมไม่ansible-playbook --vault-id my-vault-password.pyเห็นหนึ่งตัวเลือกที่น่าสนใจ: ฉันคิดว่าบางทีคุณอาจมีวิธีแก้ปัญหาเกี่ยวกับการใช้สคริปต์ python :) ฉันก็กำลังคิดเกี่ยวกับสิ่งนี้อยู่
Vish
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.