ฉันจะจัดการความลับใน. tf และ. tfstate ได้อย่างไร


46

ฉันต้องการใช้ Terraform MySQL Providerเพื่อเก็บรายชื่อผู้ใช้ mysql และให้ประโยชน์ในการสร้างสภาพแวดล้อมการทดสอบใหม่ .tfและ.tfstateไฟล์ทั้งสองดูเหมือนจะต้องการที่จะเก็บรหัสผ่าน MySQL ในเท็กซ์

เกี่ยวกับ. tf:

ฉันเข้าใจว่า.tfไฟล์อยู่ในการควบคุมการแก้ไขและดูแลโดยทีม การปฏิบัตินั้นแตกต่างกันอย่างไรเมื่อความลับอยู่ใน.tf? เป็นไปได้หรือไม่ที่จะเข้ารหัสค่าเหล่านี้เลย?

เกี่ยวกับ. รัฐ:

ฉันสามารถจัดเก็บ.tfstateอย่างปลอดภัยที่ไหนสักแห่งหลังจากรัน Terraform ใช้ แต่มันจะดีกว่าสำหรับกรณีการใช้งานนี้จะไม่เก็บไว้เลย?

คำตอบ:


22

Terraform รองรับการเพิ่มไฟล์เพิ่มเติมพร้อมตัวแปรในระหว่างการเรียกใช้

เอกสาร: https://www.terraform.io/intro/getting-started/variables.html#from-a-file

เรากำลังใช้คุณสมบัตินั้นเพื่อจัดทำsecrets.tfvarsไฟล์ในการเรียกใช้ Terraform แต่ละครั้ง นอกจากนี้เรายังใช้สคริปต์เพื่อรวมคำสั่งเพื่อให้การเรียกใช้สอดคล้องกันและสมาชิกในทีมทุกคนหลีกเลี่ยงข้อผิดพลาดเดียวกัน wrapper ซิงโครไนซ์.tfstateกับ S3 ก่อนดำเนินการและผลัก.tfstateกลับไปที่ S3 ที่ส่วนท้าย ฉันยังได้ยินคนที่ทำสิ่งเดียวกันกับรัฐที่เก็บไว้ในกงสุลแม้กระทั่งการเพิ่มสัญญาณประเภทหนึ่งในกงสุลเพื่อป้องกันไม่ให้คนสองคนเริ่มต้น Terraform ในเวลาเดียวกัน

เมื่อคุณหลีกเลี่ยงการตั้งค่าเริ่มต้นในvariables.tfไฟล์มันจะบังคับให้ผู้ใช้ป้อนค่า สามารถป้อนด้วยตนเองหรือใช้-var-fileตัวเลือกคำสั่งตามที่อธิบายไว้ข้างต้น การไม่ตั้งค่าเริ่มต้นในความลับของคุณเป็นวิธีที่ดีในการบังคับใช้การเปลี่ยนแปลงที่ต้องมีการเปลี่ยนแปลงในความลับ

secrets.tfvarsแฟ้มการเชื่อมโยงสัญลักษณ์ให้เป็นหนึ่งในไฟล์ที่มีความลับที่ยังไม่ได้เก็บไว้ในการควบคุมเวอร์ชัน เรามีหลายอย่างใดอย่างหนึ่งต่อสภาพแวดล้อมเช่นดังนั้นsecrets-prod.tfvars, secrets-dev.tfvars, secrets-stg.tfvarsฯลฯ ...

วิธีปฏิบัติที่ดียิ่งขึ้นคือการสร้างไฟล์ความลับเหล่านี้ระหว่างสคริปต์ตัวตัดตามข้อมูลในห้องนิรภัยหรือวิธีอื่นในการแบ่งปันความลับ เนื่องจากปัจจุบันเมื่อรูปแบบของการเปลี่ยนแปลงความลับหรือความลับเราต้องสื่อสารกับทีมนอกช่องทางควบคุมเวอร์ชัน - และสิ่งนี้ไม่ได้ผลดีนัก แต่ความลับจะเปลี่ยนไม่บ่อยนัก


1
เชื่อมโยงไปยังรหัส - gist.github.com/kesor/21f942be0350559b44f7ad1f9d846e7c
Evgeny

8

เราหลีกเลี่ยงการจัดการกับความลับของเรา แม้ว่าคุณจะสามารถฉีดความลับด้วยไฟล์ var "secrtes.tfvars" ตามที่กล่าวไว้ข้างต้นความลับเหล่านี้จะถูกเก็บไว้ในสถานะ terraform (remote-) ของคุณ

คุณสามารถปกป้องไฟล์สถานะระยะไกลโดยใช้การอนุญาต S3 หรือคุณสามารถ gitignore ไฟล์สถานะท้องถิ่น แต่เราตัดสินใจที่จะไม่พึ่งพาการป้องกันประเภทนี้


2
ตรวจสอบgithub.com/hashicorp/terraform/issues/516ซึ่งเป็นที่ที่พวกเขาติดตามปัญหาความลับที่รั่วไหลออกมาของรัฐ
jottr

6

หากคุณใช้ AWS ให้ดูที่"วิธีการจัดการความลับที่ถูกต้อง"โดยSegment.ioบนบล็อก AWS เราสนับสนุนchamberให้ลูกค้าของเราทุกคนใช้จัดการความลับ มันทำงานโดยใช้ประโยชน์จากที่เก็บพารามิเตอร์ผู้จัดการ AWS Systems Manager (SSM) พร้อมกับคีย์ KMS สิ่งนี้ทำให้มั่นใจได้ว่าความลับถูกเข้ารหัสที่เหลือ (และระหว่างทาง) ปลอดภัยด้วย IAM ตรวจสอบได้ด้วย CloudTrails และเปิดเผยเป็นตัวแปรสภาพแวดล้อมในเวลาทำงานเท่านั้น

หลังจากกำหนดค่าแชมเบอร์และตั้งค่าคีย์ KMS เราจะเขียนความลับไปยังที่เก็บพารามิเตอร์

chamber write db TF_VAR_DB_USER foobar
chamber write db TF_VAR_DB_PASS secret

จากนั้นใช้ความลับเหล่านั้นเมื่อคุณเรียกรูปแบบดิน

chamber exec db -- terraform plan

สิ่งนี้ถือว่าคุณได้กำหนดตัวแปรที่เรียกว่าDB_USERและDB_PASSในรหัส HCL ของคุณ

ตัวอย่างเช่นคุณสามารถเพิ่มสิ่งนี้ลงใน variables.tf

variable "DB_USER" { }
variable "DB_PASS" { }

หมายเหตุ: chamberจะส่งออกตัวแปรสภาพแวดล้อมเป็นตัวพิมพ์ใหญ่เสมอ

เราให้บริการโมดูลรูปแบบพื้นผิวที่เรียกว่าterraform-aws-kms-keyเพื่อให้การจัดสรรคีย์ KMS เป็นเรื่องง่าย ตรวจสอบเอกสารรายละเอียดของเราพร้อมตัวอย่างวิธีใช้chamberกับเนมสเปซหลายรายการรวมถึงวิธีการใช้แชมเบอร์ที่มีพื้นเพื่อจัดการความลับ ดูตัวอย่างอ้างอิงที่สมบูรณ์ของเราสำหรับการอ้างอิงการจัดเตรียมห้อง

สำหรับ.tfstateคุณทำให้จุดที่ดีจริงๆเกี่ยวกับการดำรงอยู่ของความลับข้อความธรรมดาในไฟล์รัฐ ไม่มีทางรอบนี้จริงๆ เพื่อให้ terraform สามารถคำนวณการเปลี่ยนแปลงเพื่อสร้างแผนจำเป็นต้องทราบสถานะ "ก่อน" และ "หลัง" ด้วยเหตุนี้เราขอแนะนำให้ใช้ที่ฝากข้อมูล S3 ที่เข้ารหัสพร้อมการกำหนดเวอร์ชันที่จำเป็น ใช้terraform-aws-tfstate-backendโมดูลเพื่อจัดเตรียมที่ฝากข้อมูลและตารางล็อค DynamoDB ตามแนวทางปฏิบัติที่ดีที่สุด


นี่เชื่อมโยงอย่างมากกับบริการ AWS ซึ่งคำถามไม่ได้พูดถึงและฟังดูไม่ได้คำตอบจริงๆสำหรับโครงสร้างพื้นฐานของสถานที่ตั้งหรือระบบคลาวด์อื่น ๆ
Tensibai

@tensibai คุณถูกต้อง คำถามเดิมไม่ได้ให้ข้อมูลเพียงพอที่จะยืนยันแพลตฟอร์มปฏิบัติการเพื่อให้คำแนะนำที่ดีที่สุด ทุกแพลตฟอร์มจะแตกต่างกันไปขึ้นอยู่กับความสามารถของแพลตฟอร์ม ผู้ใช้ที่ไม่ได้ตั้งใจหรือไม่ใส่ใจอาจต้องการพิจารณาใช้งาน Vault และ Terraform Enterprise ขอบเขตของการดำเนินการที่จะยิ่งใหญ่กว่ามาก :)
Erik Osterman

ฉันใช้ AWS Secrets Manager แล้วและไม่ต้องการใช้ Chamber และ Parameter Store เป็นไปได้ไหมที่จะทำสิ่งเดียวกันกับผู้จัดการความลับด้วย?
red888


2

ฉันดูวิธีต่าง ๆ ไม่กี่อย่าง แต่โดยเฉพาะอย่างยิ่งฉันชอบ git-crypt สำหรับสิ่งที่ต้องทำก่อนทำสิ่งที่ใหญ่กว่าเช่น Vault


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