피드로 돌아가기
How to Handle Sensitive Data Securely in Terraform
Dev.toDev.to
Security

엔지니어가 AWS Secrets Manager와 sensitive 플래그를 조합해 Terraform에서 비밀번호 세 가지 유출 경로를 차단

How to Handle Sensitive Data Securely in Terraform

Victor Robin2026년 3월 29일3intermediate

Context

Terraform 배포 시 데이터베이스 비밀번호, API 키, TLS 인증서 같은 민감 정보가 코드베이스나 터미널 출력으로 노출되는 보안 사고가 빈번하게 발생한다. 하드코딩된 시크릿은 Git 버전 관리 히스토리에 영구 저장되어 조직 내 누구나 접근할 수 있다. 변수의 기본값으로 설정한 시크릿도 소스 제어에 커밋되므로 같은 문제가 발생한다.

Technical Solution

  • 하드코딩 방지: AWS Secrets Manager에서 시크릿을 사전에 생성하고, aws_secretsmanager_secret 데이터 블록으로 런타임에 동적으로 가져오기
  • 변수 보안화: 변수의 기본값 제거 후 sensitive = true 플래그 추가해 terraform plan, terraform apply 실행 시 터미널에 출력되지 않도록 차단
  • 상태 파일 보호: AWS S3 원격 백엔드에 encrypt = true (AES256 기본 암호화), 버전 관리 활성화, 공개 접근 차단 규칙 적용
  • 동시성 방지: DynamoDB 테이블을 상태 파일 락으로 연결하거나 use_lockfile = true 설정으로 동시 쓰기 손상 방지
  • IAM 최소 권한: CI/CD 역할에만 상태 버킷에 대한 s3:GetObject 권한 부여
  • .gitignore 강화: .terraform/, *.tfstate, *.tfstate.backup, *.tfvars, override.tf 파일 제외

Key Takeaway

시크릿은 평문 상태로 Terraform 상태 파일에 저장되므로, 터미널 숨김만으로는 부족하고 상태 파일 자체를 암호화 및 접근 제어로 보호해야 한다. 프로덕션 환경에서는 배포 이후가 아닌 배포 전에 시크릿 관리 체계를 완성해야 한다.


Terraform으로 AWS 인프라를 관리하는 팀은 AWS Secrets Manager에서 `aws_secretsmanager_secret_version` 데이터 소스로 시크릿을 동적으로 참조하고, 모든 민감 변수와 출력값에 `sensitive = true`를 설정한 뒤, S3 백엔드에 서버 측 암호화(AES256)와 DynamoDB 상태 잠금을 구성하면 시크릿 노출 경로 세 가지를 모두 차단할 수 있다.

원문 읽기