본문 바로가기
IT/Cloud

[Cloud] Terraform State 관리 보안: 1.7+ Remote Backend & 암호화 설정 가이드

by 수누다 2026. 4. 9.

Terraform State 관리 보안, 왜 지금 당장 점검해야 할까요?

인프라를 코드로 관리하다 보면 어느 순간 이런 상황을 마주하게 되더라고요. 팀원이 실수로 terraform.tfstate 파일을 Git에 커밋해버린 거죠. 그 안에 RDS 비밀번호, IAM 액세스 키, 각종 민감한 리소스 정보가 그대로 담긴 채로요. 저도 몇 년 전에 비슷한 아찔한 경험을 했는데, 그때부터 Terraform State 관리 보안을 진지하게 고민하기 시작했습니다.

Terraform 1.7 버전이 릴리즈되면서 State 암호화 관련 기능이 꽤 강화됐거든요. 공식 문서만 봐서는 어디서부터 시작해야 할지 막막한 분들이 많으실 것 같아서, 제가 직접 실무에서 적용해본 경험을 바탕으로 정리해봤습니다.

이 글에서는 Terraform Remote Backend 설정부터 S3 State 암호화, 접근 제어까지 실제로 동작하는 코드와 함께 단계별로 알아볼게요.

Terraform State 관리 보안 아키텍처 전체 개요 다이어그램

▲ Terraform State 관리 보안의 전체 아키텍처 — S3 Remote Backend, DynamoDB Lock, KMS 암호화가 어떻게 연결되는지 한눈에 볼 수 있습니다.


Terraform State란 뭐고, 왜 위험할까요?

먼저 개념부터 짚고 넘어가야 할 것 같아요. Terraform State는 쉽게 말해서 "현재 인프라의 실제 상태를 기록해둔 스냅샷 파일"이에요. Terraform이 리소스를 생성하거나 수정할 때, 무엇이 어떻게 배포되어 있는지 이 파일을 기준으로 판단하거든요.

문제는 이 State 파일 안에 뭐가 들어있느냐인데요. 민감한 정보의 보고입니다.

  • 데이터베이스 연결 문자열과 비밀번호
  • IAM(Identity and Access Management) 키
  • TLS 인증서와 개인 키
  • 각종 API 토큰과 시크릿 값
  • VPC, 서브넷, 보안 그룹 상세 정보

이걸 로컬에 저장하거나 Git에 올리면... 네, 생각만 해도 아찔하죠. 그래서 Terraform Remote Backend(원격 상태 저장소)를 써야 하고, 거기에 암호화와 접근 제어까지 겹겹이 설정해야 합니다.

Local vs Remote Backend 비교

항목 Local Backend (로컬) Remote Backend (S3 등)
저장 위치 개발자 PC 로컬 클라우드 스토리지
팀 협업 ❌ 불가 (충돌 위험) ✅ 가능 (잠금 지원)
보안 ❌ 취약 (암호화 없음) ✅ KMS 암호화 가능
State Lock ❌ 없음 ✅ DynamoDB로 지원
버전 관리 ❌ 수동 관리 필요 ✅ 자동 버저닝
접근 제어 ❌ OS 권한만 ✅ IAM 정책으로 세밀하게

이 표 하나로 왜 Terraform Remote Backend를 써야 하는지 충분히 설명되는 것 같네요. 😅


사전 준비: IAM 권한과 AWS CLI 설정

본격적인 설정 전에 준비물부터 챙겨봅시다. 저는 AWS를 기준으로 설명할 건데요, 다른 클라우드도 개념은 거의 동일합니다.

필요한 IAM 권한 목록

State 관리용 IAM 사용자나 역할에는 최소한 이 권한들이 필요합니다. 제가 처음 설정할 때 권한 하나 빠뜨려서 한참 헤맸거든요 ㅎㅎ

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketVersioning",
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": [
        "arn:aws:s3:::terraform-state-bucket",
        "arn:aws:s3:::terraform-state-bucket/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:DescribeTable",
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:DeleteItem"
      ],
      "Resource": "arn:aws:dynamodb:*:*:table/terraform-lock"
    },
    {
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:Encrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "arn:aws:kms:*:*:key/*"
    }
  ]
}

이 정책을 IAM 사용자에게 할당하면, Terraform State 관리에 필요한 최소 권한을 갖추게 됩니다.