Làm cách nào tôi có thể quản lý bí mật trong .tf và .tfstate?


46

Tôi muốn sử dụng Nhà cung cấp MySQL Terraform để giữ một danh sách người dùng mysql và tài trợ thuận tiện cho việc tạo môi trường thử nghiệm mới. Cả hai .tf.tfstatecác tệp dường như muốn lưu trữ mật khẩu MySQL trong bản rõ.

Liên quan .tf:

Theo hiểu biết của tôi rằng .tfcác tệp nằm trong kiểm soát sửa đổi và được duy trì bởi một nhóm. Làm thế nào mà thực hành khác nhau khi bí mật là trong .tf? Có thể mã hóa các giá trị này ở tất cả?

Liên quan .tfstate:

Tôi có thể lưu trữ .tfstatean toàn ở đâu đó sau khi chạy ứng dụng Terraform, nhưng trường hợp sử dụng này có thích hợp hơn để không lưu trữ không?

Câu trả lời:


22

Terraform hỗ trợ thêm một tệp bổ sung với các biến trong khi gọi.

tài liệu: https://www.terraform.io/intro/getting-started/variables.html#from-a-file

Chúng tôi đang sử dụng tính năng đó để cung cấp một secrets.tfvarstệp trên mỗi lần gọi của Terraform. Chúng tôi cũng sử dụng một tập lệnh để bọc lệnh sao cho lệnh gọi của nó phù hợp và tất cả các thành viên trong nhóm tránh phải mắc lỗi tương tự. Trình bao bọc đồng bộ hóa .tfstatevới S3 trước khi thực hiện và đẩy .tfstatetrở lại S3 ở cuối. Tôi cũng nghe nói về những người làm điều tương tự với trạng thái được lưu trữ trong Lãnh sự, thậm chí thêm một loại semaphore trong lãnh sự để ngăn hai người bắt đầu sử dụng Terraform cùng một lúc.

Khi bạn tránh đặt giá trị mặc định trong variables.tftệp, nó buộc người dùng nhập giá trị. Nó có thể được nhập bằng tay hoặc sử dụng -var-filetùy chọn lệnh như được mô tả ở trên. Không đặt mặc định cho các bí mật của bạn là một cách tốt để thực thi các thay đổi yêu cầu thay đổi bí mật.

Các secrets.tfvarstập tin là một liên kết tượng trưng cho một trong các tập tin với những bí mật mà không được lưu trữ trong điều khiển phiên bản. Chúng ta có nhiều, mỗi môi trường, như vậy secrets-prod.tfvars, secrets-dev.tfvars, secrets-stg.tfvars, vv ...

Một cách thực hành thậm chí tốt hơn là tạo các tệp bí mật này trong tập lệnh trình bao bọc dựa trên dữ liệu trong Vault hoặc một số cách khác để chia sẻ bí mật. Vì hiện tại khi định dạng của các bí mật thay đổi, hoặc chính các bí mật, chúng ta cần truyền đạt nó cho nhóm bên ngoài kênh kiểm soát phiên bản - và điều này không phải lúc nào cũng hoạt động tốt, phải trung thực. Nhưng bí mật thay đổi không thường xuyên.



8

Chúng tôi tránh terraform xử lý bí mật của chúng tôi. Ngay cả khi bạn quản lý để tiêm bí mật bằng tệp var "secrtes.tfvars" như đã chỉ ra ở trên, những bí mật này sẽ được lưu trữ ở trạng thái địa hình (từ xa) của bạn.

Bạn có thể bảo vệ các tệp trạng thái từ xa bằng cách sử dụng ủy quyền S3 hoặc bạn có thể gitignore các tệp trạng thái cục bộ nhưng chúng tôi đã quyết định không dựa vào loại bảo vệ này.


2
Đồng thời kiểm tra github.com/hashicorp/terraform/issues/516 , nơi họ theo dõi vấn đề bí mật rò rỉ
tfstate

6

Nếu bạn đang sử dụng AWS, hãy xem "Cách thức quản lý bí mật" của Segment.io trên Blog AWS. Chúng tôi ủng hộ việc sử dụng chambercho tất cả các khách hàng của mình để quản lý bí mật. Nó hoạt động bằng cách tận dụng Kho thông số quản lý hệ thống AWS (SSM) cùng với các khóa KMS. Điều này đảm bảo các bí mật được mã hóa khi nghỉ ngơi (và trong quá trình vận chuyển), được bảo mật bằng IAM, có thể kiểm tra được bằng CloudTrails và chỉ được hiển thị dưới dạng các biến môi trường trong thời gian chạy.

Sau khi cấu hình buồng và thiết lập khóa KMS, chúng tôi viết các bí mật cho cửa hàng tham số.

chamber write db TF_VAR_DB_USER foobar
chamber write db TF_VAR_DB_PASS secret

Sau đó sử dụng những bí mật khi bạn gọi terraform.

chamber exec db -- terraform plan

Điều này giả định rằng bạn đã xác định một biến được gọi DB_USERDB_PASStrong mã HCL của bạn.

Ví dụ: bạn có thể thêm phần này vào variables.tf

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

LƯU Ý: chamber sẽ luôn xuất các biến môi trường bằng chữ hoa

Chúng tôi cung cấp một mô-đun terraform được gọi terraform-aws-kms-keyđể cung cấp khóa KMS dễ dàng. Kiểm tra tài liệu chi tiết của chúng tôi với các ví dụ về cách sử dụng chambervới nhiều không gian tên cũng như cách sử dụng buồng với địa hình để quản lý bí mật. Xem ví dụ tham khảo đầy đủ của chúng tôi để cung cấp phụ thuộc buồng.

Đối với .tfstate, bạn đưa ra một điểm thực sự tốt về sự tồn tại của các bí mật văn bản đơn giản trong tệp trạng thái. Thực sự không có cách nào xung quanh điều này. Để terraform tính toán các thay đổi để xây dựng kế hoạch, nó cần biết trạng thái "trước" và "sau". Vì lý do này, chúng tôi khuyên bạn nên sử dụng nhóm S3 được mã hóa với phiên bản bắt buộc. Sử dụng terraform-aws-tfstate-backendmô-đun để cung cấp một nhóm và bảng khóa DynamoDB theo các thông lệ tốt nhất.


Điều này rất gắn liền với các dịch vụ AWS, mà câu hỏi không đề cập đến và âm thanh không thực sự là câu trả lời cho cơ sở hạ tầng tiền đề hoặc bất kỳ đám mây nào khác.
Tensibai

@tensibai, bạn đúng rồi. Câu hỏi ban đầu không cung cấp đủ thông tin để xác định nền tảng vận hành để đưa ra khuyến nghị tốt nhất. Mỗi nền tảng sẽ khác nhau tùy thuộc vào khả năng của nền tảng. Người dùng có thể muốn xem xét sử dụng kết hợp giữa Vault và Terraform Enterprise. Phạm vi thực hiện sẽ lớn hơn nhiều. :)
Erik Osterman

Tôi đã sử dụng AWS Secrets Manager và không muốn sử dụng buồng và Parameter Store. Có thể làm điều tương tự với Secrets Manager không?
red888

3

Để nhập bí mật vào các tệp .tf, bạn cũng có thể sử dụng nguồn dữ liệu ngoài . Đây có thể là một kịch bản giải mã bí mật của bạn.


2

Tôi đã xem xét một vài cách khác nhau nhưng tôi đặc biệt thích git-crypt cho một việc adhoc phải làm trước khi thực hiện một cái gì đó lớn hơn như Vault.


2
để thoe ai downvote, xin vui lòng giải thích tại sao.
jottr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.