จะใส่รหัสผ่าน ansible-vault ได้ที่ไหน


24

เราวางแผนที่จะใช้ตู้เซฟนิรภัยในโครงการของเราเพื่อป้องกันการรั่วไหลของรหัสผ่านหรือกุญแจในคอมไพล์

แนวคิดคือการใส่ข้อมูลที่ละเอียดอ่อนทั้งหมดของเราลงในไฟล์ธรรมดาจากนั้นเข้ารหัสไฟล์นี้ด้วย ansible-vault โดยใช้รหัสผ่านก่อนที่จะพุชเข้าคอมไพล์

ในการถอดรหัสไฟล์เราจะต้องส่งรหัสผ่านห้องนิรภัยไปยัง Ansible ฉันคิดว่ามีความเป็นไปได้ 3 อย่าง:

  • เก็บไว้ในตัวแปรสภาพแวดล้อมของเซิร์ฟเวอร์
  • ส่งเป็นตัวเลือกไปยังคำสั่ง ansible-playbook
  • เก็บไว้ในไฟล์ที่ไม่ใช่เวอร์ชัน

มีตัวเลือกอื่น ๆ หรือไม่ซึ่งเป็นวิธีที่ดีที่สุด (และปลอดภัย) ในการจัดเก็บรหัสผ่าน ansible-vault เอกสารประกอบวิธีปฏิบัติที่ดีที่สุดของ ansible ไม่ได้พูดอะไรเกี่ยวกับเรื่องนี้


การพูดที่เกี่ยวข้องมาก: danielsomerfield.github.io/turtles
Xiong Chiamiov

มีบางคำตอบที่ดีที่นี่: devops.stackexchange.com/questions/3806/…
Vish

คำตอบ:


12

ความคิดคือการใส่ข้อมูลที่ละเอียดอ่อนทั้งหมดของเรา [... ]

ความหมายของคำว่า "ทั้งหมด" ในประโยคนี้ควรได้รับการวิเคราะห์อย่างรอบคอบก่อนดำเนินการตามแนวทางที่คุณวางแผน

Ansible vault เป็นเครื่องมือที่มีประโยชน์มาก แต่ควรใช้เพื่อเก็บความลับที่:

  1. จำเป็นสำหรับการปรับใช้ที่ไม่สามารถใช้ได้โดยเฉพาะ
  2. ทำให้ไร้ประโยชน์อย่างง่ายดายสำหรับเจ้าของที่ควรระวังพวกเขา แต่นั่นอาจ "จำ" พวกเขาอย่างผิดกฎหมาย (โดยทั่วไปคือพนักงานที่ไม่ได้ประจำ)

จุดที่สองมีความสำคัญ

หลายคนและอาจเป็นทั้งทีม DevOps จะสามารถเข้าถึงรหัสผ่านห้องนิรภัยได้ดังนั้นจึงเป็นความลับทั้งหมด

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

ในแง่ที่เป็นรูปธรรมหากคุณใช้ ansible ในการปรับใช้ฐานข้อมูลและผู้ใช้คุณสามารถเก็บรหัสผ่านไว้ในห้องนิรภัยได้ แต่คุณจะต้องระมัดระวังเป็นอย่างมาก และไม่จำเป็นต้องมีการรับรองความถูกต้อง VPN ใด ๆ !

ผู้ใช้ (DevOps) ที่เปิดเผยความลับควรไม่สามารถใช้รหัสผ่านที่ "จำได้" หากมีการกำหนดสิ่งกีดขวางด้านความปลอดภัย (เช่นการเข้าถึง VPN ถูกเพิกถอน) นอกจากนี้การเข้าถึงที่เก็บซอร์สโค้ด (ที่เก็บ vault) ควรถูกเพิกถอนก่อนที่จะเปลี่ยนรหัสผ่าน

ภายใต้เงื่อนไขเหล่านี้ ansible vault เป็นเครื่องมือที่มีประโยชน์มาก

การพยายามเก็บความลับที่บุคคลหรือเครื่องสามารถใช้บนอินเทอร์เน็ตในห้องนิรภัยนั้นจะเป็นความผิดพลาดแทน (เช่นข้อมูลรับรอง VPN ของผู้ใช้)

มีตัวเลือกอื่น ๆ ซึ่งเป็นวิธีที่ดีที่สุด (และปลอดภัย) ในการจัดเก็บรหัสผ่าน ansible-vault

ภายใต้เงื่อนไขจากย่อหน้าก่อนหน้าฉันคิดว่าแนวทางปฏิบัติที่ดีจะเป็น:

  1. เก็บรหัสผ่านห้องนิรภัยในห้องนิรภัยภายนอก (เช่นVault จาก HashiCorpหรือ SaaS สำหรับการจัดการข้อมูลประจำตัว)
  2. อนุญาตให้เข้าถึงรายการ vault ภายนอกไปยัง DevOps (พวกเขาจะต้องใช้รหัสผ่านสำหรับการทดสอบ) และระบบ CI / CD หรือตัวควบคุมที่ไม่สามารถใช้ได้
  3. รักษาแบบแผนเพื่อใช้ความลับ ! คุณจะไม่สามารถตรวจสอบการเปลี่ยนแปลงความลับและคุณจะไม่สามารถ grep สำหรับตัวแปรที่เชื่อได้ในไฟล์ลับ! ดังนั้นให้ละเอียดตั้งแต่ต้น การประชุมที่ดีคือการตั้งชื่อตัวแปรทั้งหมดที่เก็บไว้ในหลุมฝังศพที่มีsecret_คำนำหน้า เมื่อไหร่คุณจะเห็นสิ่งที่ชอบ:

    postgres.yml:

    postgres_password: "{{ secret_postgres_password }}"
    

    คุณจะรู้ว่าค่าถูกเก็บไว้ในหลุมฝังศพ


จุดที่ดีเกี่ยวกับการจัดเก็บรหัสผ่าน Ansible Vault นั้นปลอดภัยกว่า (HashiCorp Vault หรือ SaaS vault เช่น AWS Secrets Manager) อย่างไรก็ตามยังคงต้องหมุน (เปลี่ยน) ถ้ามีคนออกจากทีมเนื่องจากพวกเขาสามารถเข้าถึงได้แม้ว่าจะเป็นเวลาสั้น ๆ สิ่งนี้สามารถบรรเทาได้โดยใช้ vaults แยกต่างหาก (dev, test, production) เช่นไฟล์ลับใน YAML Ansible 2.4+ ยังให้คุณระบุรหัสผ่านที่แตกต่างกันสำหรับไฟล์ดังกล่าวโดยใช้ 'รหัสห้องนิรภัย' - หน้าเอกสาร
RichVel

Ansible 2.3 แนะนำคุณสมบัติที่เข้ารหัสเฉพาะค่าในไฟล์ YAML ไม่ใช่ไฟล์ทั้งหมด - ซึ่งเป็นวิธีที่ง่ายกว่าในการดูแลรักษามากกว่าการประชุมที่เก่ากว่าที่คุณพูดถึงในจุดที่ 3 ในตอนท้ายของคำตอบนี้
RichVel

6

เราวางแผนที่จะใช้ตู้เซฟนิรภัยในโครงการของเราเพื่อป้องกันการรั่วไหลของรหัสผ่านหรือกุญแจในคอมไพล์

เนื่องจากคุณยังไม่ได้ใช้งานอะไรเลยคุณอาจลองพิจารณาใหม่ การใช้ระบบเช่น Ansible vault มีข้อบกพร่องด้านความปลอดภัยจำนวนหนึ่ง:

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

ระบบที่ไม่ปลอดภัยเหล่านี้มีความปลอดภัยมากขึ้นแม้ว่าจะมีความซับซ้อนมากกว่า แต่ก็คือการใช้ Hashicorp Vault เพื่อเก็บความลับของคุณ จากนั้นคุณสามารถยังคงดึงค่าจากมันเกือบจะได้อย่างง่ายดายเช่นจากหลุมฝังศพเบิ้ลโดยใช้https://github.com/jhaals/ansible-vault

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

ตอนนี้ถ้าการตั้งค่าและการจัดการเซิร์ฟเวอร์ลับมีมากเกินไปสำหรับคุณแน่นอนว่าคุณสามารถใช้ Ansible vault ได้ ทำไมต้องเก็บรหัสผ่านไว้ในเครื่องแต่ละเครื่อง สำหรับการใช้งานแบบอินเทอร์แอคทีฟคุณสามารถขอรหัสผ่านและผู้ใช้สามารถเก็บไว้ในตัวจัดการรหัสผ่านที่เลือกได้ iTerm บน OS X มีตัวจัดการรหัสผ่านที่ทำงานร่วมกับ Keychain.app ซึ่งทำให้ง่ายขึ้น


1
วิธีที่ดีที่สุดในการใช้ห้องนิรภัย ansible ไม่ได้ใช้ .. ขอบคุณสำหรับการชี้ให้เห็น!
พายุ

สำหรับองค์กรขนาดเล็กถึงขนาดกลางฉันแนะนำให้ดูที่ตัวจัดการความลับบนคลาวด์เช่น AWS Secrets Manager - นี่มันทำงานน้อยกว่าการใช้คลัสเตอร์ที่มีความพร้อมใช้งานสูงสำหรับ HashiCorp Vault แต่เป็นการปรับปรุงความปลอดภัยที่คุณได้รับด้วย Ansible ห้องนิรภัยรวมถึงการตรวจสอบและการควบคุมการเข้าถึงอย่างละเอียด แน่นอนว่าคุณจะต้องจบลงที่บริการดังกล่าว แต่สามารถห่อหุ้มด้วยการเข้ารหัสแอปบางอย่างและการทำงานของ Ansible ประโยชน์ที่สำคัญคือความลับบางอย่างไม่จำเป็นต้องจัดการโดย Ansible เลยเช่นรหัสผ่าน DB - เพียงแค่ให้แอปได้รับความลับจากตัวจัดการความลับ
RichVel

3

สิ่งนี้จะไปที่นโยบายภายในที่คุณมีเกี่ยวกับการจัดการข้อมูลที่สำคัญ

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

export ANSIBLE_VAULT_PASSWORD_FILE=/deep/dark/place

ฉันมีสิ่งนั้นบนเวิร์กสเตชันของฉัน (ตามที่ฉันต้องการทดสอบและพัฒนา playbooks) เพื่อนร่วมงานบางคนมีมันเช่นกันและแน่นอนว่าเรามีไว้ในเครื่องควบคุม Ansible หลัก

ข้อดี:

  • ไม่ได้อยู่ในตำแหน่ง / พื้นที่เก็บข้อมูลที่แชร์ (เป็นไฟล์ที่ไม่มีเวอร์ชันตามที่คุณพูด)
  • คุณไม่จำเป็นต้องรู้รหัสผ่าน Ansible vault ของคุณเพื่อทำการเล่น (อยู่ภายใต้เงื่อนไขที่คุณมีเครื่องมือ CI เช่น Jenkins ซึ่งคุณสามารถเปิด playbooks ได้อย่างง่ายดาย)

จุดด้อย:

  • หมุนรหัสผ่านไม่สะดวก
  • ทุกคนที่ทำงานบน playbooks ของคุณจำเป็นต้องมีในเวิร์กสเตชันของเขา

ข้อเสียมีการบรรเทา แต่ก็ขึ้นอยู่กับนโยบายและกฎระเบียบที่คุณได้นำมาใช้ในการดำเนินงานประจำวัน


1
คำตอบที่ดี .. ตรวจสอบคำตอบอื่น ๆ แม้ว่าอาจเป็นที่สนใจของคุณ
พายุ

0

ลองดูโปรเจ็กต์นี้เพื่อจัดการรหัสผ่านห้องนิรภัย ansible เข้ารหัสของคุณhttps://github.com/Smile-SA/ansible-vault-manager

มันจัดการกับแพลตฟอร์มหน่วยความจำพวงกุญแจหลายอันพร้อมด้วยปลั๊กอิน (ตอนนี้ใช้ AWS SSM เท่านั้น) การผนวกรวมกับโครงการ Ansible ปัจจุบันเป็นเรื่องง่ายมาก ...


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