.tf 및 .tfstate에서 비밀을 관리하려면 어떻게해야합니까?


46

Terraform MySQL Provider 를 사용하여 mysql 사용자 목록을 유지하고 새로운 테스트 환경을 만드는 데 편리합니다. .tf.tfstate파일 모두 일반 텍스트로 MySQL의 암호를 저장 할 것으로 보인다.

.tf에 관하여 :

.tf파일은 개정 관리에 있으며 팀이 유지 관리 한다는 것을 이해합니다 . 비밀이에있을 때 그 연습은 어떻게 다릅니 .tf까? 이 값들을 전혀 암호화 할 수 있습니까?

.tfstate에 관하여 :

.tfstateTerraform apply를 실행 한 후 어딘가에 안전하게 저장할 수 있지만이 사용 사례에서 전혀 저장하지 않는 것이 좋을까요?

답변:


22

Terraform 호출 중에 변수가있는 추가 파일 추가를 지원합니다 .

설명서 : https://www.terraform.io/intro/getting-started/variables.html#from-a-file

우리는이 기능을 사용하여 secrets.tfvarsTerraform을 호출 할 때 마다 파일 을 제공합니다 . 또한 스크립트를 사용하여 명령을 래핑하여 호출의 일관성을 유지하고 모든 팀 구성원이 동일한 실수를하지 않아도됩니다. 래퍼 .tfstate는 실행 전에 S3와 동기화 되고 .tfstate마지막에 S3으로 다시 푸시 됩니다. 또한 사람들이 Consul에 저장된 상태로 동일한 작업을 수행하는 것에 대해 들었습니다. 심지어 두 사람이 동시에 Terraform을 시작하지 못하도록 Conse에 일종의 세마포어를 추가하는 경우도 있습니다.

variables.tf파일 에서 기본값을 설정하지 않으면 사용자가 값을 입력하도록합니다. 수동으로 입력하거나 -var-file위에서 설명한대로 명령 옵션을 사용하여 입력 할 수 있습니다 . 비밀을 기본값으로 설정하지 않으면 비밀을 변경해야하는 변경을 적용 할 수 있습니다.

secrets.tfvars파일 버전 제어에 저장되지 않은 비밀을 가진 파일 중 하나에 대한 심볼릭 링크입니다. 우리가 지금처럼 환경에 따라 몇 가지, 하나가 secrets-prod.tfvars, secrets-dev.tfvars, secrets-stg.tfvars, 등 ...

더 나은 방법은 Vault의 데이터 또는 비밀 을 공유 하는 다른 방법을 기반으로 래퍼 스크립트 중에 이러한 비밀 파일을 생성하는 것 입니다. 현재 비밀 형식이 변경되거나 비밀 자체가 변경되는 경우 버전 제어 채널 외부의 팀과 통신해야합니다. 정직하게 작동하는 것은 아닙니다. 그러나 비밀은 드물게 변경됩니다.



8

우리는 테라 포름이 비밀을 다루는 것을 피합니다. 위에서 지적한대로 "secrtes.tfvars"var 파일로 비밀을 주입하더라도이 비밀은 테라 폼 (원격) 상태로 저장됩니다.

예를 들어 S3 권한 부여를 사용하여 원격 상태 파일을 보호하거나 로컬 상태 파일을 무시할 수 있지만 이러한 종류의 보호에 의존하지 않기로 결정했습니다.


2
또한 github.com/hashicorp/terraform/issues/516 에서 tfstate 유출 비밀 문제를 추적하는 곳을 확인하십시오
jottr

6

당신은 AWS에있는 경우, 다음 번 봐 가지고 "비밀을 관리하는 올바른 방법" 에 의해 Segment.io AWS 블로그에 있습니다. 우리는 chamber비밀을 관리하기 위해 모든 고객에게 사용 하는 것을 옹호 합니다. AWS Systems Manager Parameter Store (SSM)를 KMS 키와 함께 활용하여 작동합니다. 이를 통해 비밀이 유휴 (및 전송) 상태로 암호화되고 IAM으로 보안되며 CloudTrails로 감사 가능하며 런타임시 환경 변수로만 노출됩니다.

챔버를 구성 하고 KMS 키를 설정 한 후 비밀을 매개 변수 저장소에 씁니다.

chamber write db TF_VAR_DB_USER foobar
chamber write db TF_VAR_DB_PASS secret

그런 다음 terraform을 호출 할 때 이러한 비밀을 사용하십시오.

chamber exec db -- terraform plan

이것은 HCL 코드에서 DB_USER및 변수를 정의했다고 가정합니다 DB_PASS.

예를 들어, 이것을 추가 할 수 있습니다 variables.tf

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

참고 : chamber 항상 환경 변수를 대문자로 내 보냅니다.

terraform-aws-kms-keyKMS 키 프로비저닝을 쉽게하기 위해 호출되는 테라 폼 모듈 을 제공합니다. chamber여러 네임 스페이스와 함께 사용하는 방법과 테라 폼과 함께 챔버를 사용 하여 비밀을 관리 하는 방법에 대한 예제와 함께 자세한 문서를 확인하십시오 . 챔버 종속성 프로비저닝에 대한 전체 참조 예제참조 하십시오 .

에 관해서 .tfstate는 상태 파일에 일반 텍스트 비밀의 존재에 대해 정말 좋은 지적을 제시합니다. 이 문제를 해결할 방법이 없습니다. 테라 폼이 계획을 작성하기 위해 변경 사항을 계산하려면 "이전"및 "이후"상태를 알아야합니다. 따라서 필수 버전 관리 기능이있는 암호화 된 S3 버킷을 사용하는 것이 좋습니다. terraform-aws-tfstate-backend모범 사례에 따라 모듈을 사용하여 버킷 및 DynamoDB 잠금 테이블을 프로비저닝합니다.


이는 AWS 서비스와 밀접한 관련이 있으며, 전제 인프라 또는 기타 클라우드에 대해서는 언급하지 않았으며 실제로 대답하지는 않습니다.
Tensibai

@tensibai, 당신은 맞습니다. 원래 질문은 최상의 권장 사항을 만들기 위해 운영 플랫폼을 확인하기에 충분한 정보를 제공하지 않습니다. 플랫폼 기능에 따라 모든 플랫폼이 다릅니다. 사내 또는 베어 메탈 사용자는 Vault와 Terraform Enterprise를 함께 사용하는 것이 좋습니다. 구현 범위는 훨씬 더 커질 것입니다. :)
Erik Osterman

이미 AWS Secrets Manager를 사용하고 있으며 챔버 및 파라미터 저장소를 사용하고 싶지 않습니다. Secrets Manager에서도 이와 동일한 작업을 수행 할 수 있습니까?
red888


2

나는 몇 가지 다른 방법을 보았지만 특히 Vault와 같은 더 큰 것을 구현하기 전에 수행해야 할 임시 작업에 대해 git-crypt를 좋아했습니다.


2
공감 한 사람에게 이유를 설명해주세요.
jottr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.