2017-02-06 17 views
6

Có nhiều sự cố Git được mở trên bản đồ Terraform về vấn đề này, với nhiều nhận xét thú vị, nhưng hiện tại tôi vẫn chưa thấy giải pháp cho vấn đề này.Mật khẩu và mật khẩu rõ ràng trong tập tin trạng thái (từ xa)

Terraform lưu trữ các giá trị văn bản thuần túy, bao gồm cả mật khẩu, trong các tệp tfstate.

Hầu hết người dùng được yêu cầu lưu trữ chúng từ xa để nhóm có thể làm việc đồng thời trên cùng một cơ sở hạ tầng với hầu hết trong số họ lưu trữ các tệp trạng thái trong S3.

Vậy làm cách nào để ẩn mật khẩu?

Có ai ở đây sử dụng Terraform để sản xuất không? Bạn có giữ mật khẩu ở dạng văn bản thuần túy không? Bạn có quy trình làm việc đặc biệt để xóa hoặc ẩn chúng không? Điều gì sẽ xảy ra khi bạn chạy terraform apply sau đó?

Tôi đã xem xét các tùy chọn sau:

  • cửa hàng chúng trong Lãnh sự - Tôi không sử dụng Lãnh
  • loại bỏ chúng khỏi tập tin trạng thái - điều này đòi hỏi một quá trình được thực hiện mỗi lần và tôi không biết cách Terraform xử lý tài nguyên bằng mật khẩu trống/không thể đọc/không hoạt động
  • lưu trữ mật khẩu mặc định sau đó thay đổi (vì vậy Terraform sẽ không có mật khẩu hoạt động trong tệp tfstate) - giống như trên
  • sử dụng tài nguyên Vault - nghe nó không hoàn thành quy trình làm việc nào được nêu ra
  • lưu trữ chúng trong Git với git-repo-crypt - Git không phải là tùy chọn
  • mã hóa toàn cầu nhóm S3 - điều này sẽ không ngăn mọi người nhìn thấy mật khẩu văn bản thuần túy nếu họ có quyền truy cập vào AWS như một mức độ "quản lý", nhưng nó có vẻ là lựa chọn tốt nhất cho đến nay

Từ quan điểm của tôi, đây là những gì tôi muốn thấy:

  • tập tin trạng thái không bao gồm mật khẩu
  • tệp trạng thái được mã hóa
  • mật khẩu trong file trạng thái là "con trỏ" để các nguồn lực khác, như "hầm: backend-type:/path/to/password"
  • mỗi lần chạy Terraform sẽ tập hợp các mật khẩu cần thiết từ nhà cung cấp quy định

Đây chỉ là một điều ước.

Nhưng để quay lại câu hỏi - bạn sử dụng Terraform như thế nào trong sản xuất?

Trả lời

2

Toàn bộ công cụ trạng thái từ xa là being reworked for 0.9 sẽ mở mọi thứ cho locking of remote statepotentially encrypting của toàn bộ tệp trạng thái/chỉ là bí mật.

Cho đến lúc đó, chúng tôi chỉ cần sử dụng nhiều tài khoản AWS và ghi trạng thái cho nội dung đi vào tài khoản đó vào thùng S3 trong tài khoản đó. Trong trường hợp của chúng tôi, chúng tôi không thực sự quan tâm quá nhiều về những bí mật kết thúc ở đó bởi vì nếu bạn có quyền truy cập để đọc xô thì bạn thường có một lượng truy cập hợp lý trong tài khoản đó.Ngoài ra, những bí mật thực sự duy nhất của chúng tôi được lưu giữ trong các tệp trạng thái là mật khẩu cơ sở dữ liệu RDS và chúng tôi hạn chế quyền truy cập ở cấp độ nhóm bảo mật chỉ với các cá thể ứng dụng và các cá thể Jenkins xây dựng mọi thứ để không truy cập trực tiếp từ dòng lệnh trên máy trạm của mọi người.

Tôi cũng khuyên bạn nên thêm mã hóa ở phần còn lại trên nhóm S3 (chỉ vì nó cơ bản miễn phí) và phiên bản để bạn có thể truy xuất các tệp trạng thái cũ hơn nếu cần.

Để tiếp tục, nếu bạn lo lắng về những người có quyền truy cập đọc vào nhóm S3 của bạn, bạn có thể thêm chính sách nhóm từ chối truy cập từ bất kỳ ai khác ngoài vai trò/người dùng được đưa vào danh sách trắng. trên và vượt ra ngoài bất kỳ quyền truy cập IAM nào. Mở rộng ví dụ từ một related AWS blog post chúng ta có thể có một chính sách xô mà trông giống như sau:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Deny", 
     "Principal": "*", 
     "Action": "s3:*", 
     "Resource": [ 
     "arn:aws:s3:::MyTFStateFileBucket", 
     "arn:aws:s3:::MyTFStateFileBucket/*" 
     ], 
     "Condition": { 
     "StringNotLike": { 
      "aws:userId": [ 
      "AROAEXAMPLEID:*", 
      "AIDAEXAMPLEID" 
      ] 
     } 
     } 
    } 
    ] 
} 

đâu AROAEXAMPLEID đại diện cho một ví dụ vai trò ID và AIDAEXAMPLEID đại diện cho một ID dụ người dùng. Đây có thể được tìm thấy bằng cách chạy:

aws iam get-role -–role-name ROLE-NAME 

aws iam get-user -–user-name USER-NAME 

tương ứng.

Nếu bạn thực sự muốn mã hóa toàn bộ tập tin trạng thái thì bạn cần phải viết một kịch bản lệnh để làm cho Terraform tương tác với tập tin trạng thái cục bộ (chứ không phải từ xa) và sau đó có kịch bản lệnh quản lý từ xa nhà nước, mã hóa nó trước khi nó được tải lên S3 và giải mã nó khi nó được kéo.

2

Tôi muốn biết phải làm gì để thực hành tốt nhất, nhưng hãy để tôi chia sẻ về trường hợp của tôi, mặc dù đó là cách giới hạn cho AWS. Về cơ bản tôi không quản lý thông tin đăng nhập với Terraform.

  • Đặt mật khẩu ban đầu cho RDS, bỏ qua sự khác biệt với móc vòng đời và thay đổi sau. Cách bỏ qua sự khác biệt như sau:

    resource "aws_db_instance" "db_instance" { 
        ... 
        password = "hoge" 
    
        lifecycle { 
        ignore_changes = ["password"] 
        } 
    } 
    
  • Người dùng IAM được quản lý bởi Terraform, nhưng hồ sơ đăng nhập IAM bao gồm cả mật khẩu thì không. Tôi tin rằng mật khẩu IAM nên được quản lý bởi các cá nhân chứ không phải bởi quản trị viên.

  • Khóa API được ứng dụng sử dụng cũng không được Terraform quản lý. Chúng được mã hóa với AWS KMS (Dịch vụ quản lý khóa) và dữ liệu được mã hóa được lưu trong kho git của ứng dụng hoặc thùng S3. Ưu điểm của mã hóa KMS là các quyền giải mã có thể được điều khiển bởi vai trò IAM. Không cần quản lý các khóa để giải mã.

  • Mặc dù tôi chưa thử, gần đây tôi nhận thấy rằng aws ssm put-parameter --key-id có thể được sử dụng làm cửa hàng giá trị khóa đơn giản hỗ trợ mã hóa KMS, vì vậy đây có thể là một lựa chọn tốt.

Tôi hy vọng điều này sẽ giúp ích cho bạn.

+0

Re: 'aws ssm', tôi đang kéo từ ssm trong một kịch bản wrapper chạy ứng dụng trong docker, và nó đã được xuất sắc. Tôi đã luôn luôn ghét có ngay cả bí mật được mã hóa trong kiểm soát phiên bản. – voxobscuro