🔐 저장 데이터 암호화 실습

120

왜 저장 데이터 암호화를 배워야 할까?

2019년, 미국 대형 금융 기관 Capital One에서 1억 600만 명의 고객 데이터가 유출되었습니다. 공격자는 잘못 설정된 WAF(Web Application Firewall)를 통해 EC2 인스턴스의 IAM 역할 자격 증명을 획득했고, 이를 이용하여 S3 버킷에 저장된 고객 데이터에 접근했습니다. Capital One은 $80M(약 1,060억 원)의 벌금을 부과받았습니다.

저장 데이터 암호화 아키텍처 — KMS 봉투 암호화 패턴

흥미로운 점은, Capital One은 이미 S3 버킷에 SSE-S3 암호화를 적용하고 있었다는 것입니다. 하지만 공격자가 AWS 내부 자격 증명을 획득했기 때문에 암호화된 데이터를 정상적으로 복호화할 수 있었습니다. 만약 CMK(Customer Managed Key)를 사용하고 키 정책으로 접근을 엄격히 제한했다면, 자격 증명이 탈취되더라도 복호화가 불가능했을 것입니다.

이 사례가 보여주는 교훈은 명확합니다. 암호화는 "켜기만 하면 되는 것"이 아니라, "누가 키에 접근할 수 있는가"를 올바르게 설계해야 합니다.

AWS에서는 다양한 서비스가 암호화를 지원합니다. S3는 SSE-S3, SSE-KMS, SSE-C 세 가지 방식을 제공하고, EBS 볼륨은 생성 시 암호화를 켤 수 있으며, Secrets Manager는 데이터베이스 비밀번호와 API 키를 안전하게 저장하고 자동 교체합니다.

이 실습에서는 다음을 직접 경험합니다:

  • KMS CMK(고객 관리형 키)를 생성하고 키 정책으로 접근 제어
  • S3 SSE-KMS 암호화를 설정하고 버킷 키로 비용 최적화
  • EBS 볼륨 암호화를 적용하고 기본 암호화 설정
  • Secrets Manager로 민감 정보를 안전하게 저장하고 자동 교체 구성
  • CloudTrail로 암호화 API 호출을 감사하여 "누가 언제 복호화했는지" 추적

실습을 시작하기 전에 AWS 콘솔에 로그인되어 있는지 확인하세요. 리전은 ap-northeast-2 (서울) 을 사용합니다.

아키텍처 개요

봉투 암호화 패턴 — KMS 마스터 키와 데이터 키

봉투 암호화 흐름

다이어그램 로딩 중...
봉투 암호화(Envelope Encryption) 흐름도

비용 예측

비용 계산기

4시간
0h24h
KMS (API 요청)

요청

$0.0001
KMS (CMK 키)

시간 (월 $1)

$0.0006
Secrets Manager (비밀)

시간 (월 $0.40)

$0.0022
예상 총 비용$0.0029

* 실제 비용은 AWS 요금 정책에 따라 달라질 수 있습니다.

Step 1: KMS 키 생성 및 정책 설정

KMS CMK(Customer Managed Key)는 데이터 암호화의 "마스터 키"입니다. 이 키 자체는 AWS의 하드웨어 보안 모듈(HSM)에서 관리되므로, 키가 외부로 유출될 걱정이 없습니다.

키 정책은 "이 키를 누가 관리하고, 누가 사용할 수 있는가"를 정의합니다. 키 관리자는 키를 활성화/비활성화하고 정책을 변경할 수 있지만, 데이터를 암호화/복호화할 수는 없습니다. 키 사용자는 이 키로 데이터를 암호화/복호화할 수 있지만, 키 자체를 삭제하거나 정책을 변경할 수 없습니다. 이 분리가 바로 보안의 핵심입니다.

  1. AWS 콘솔 → KMS고객 관리형 키키 생성 클릭
  2. 키 유형: 대칭(Symmetric) 선택
  3. 키 사용: 암호화 및 복호화 선택
  4. 별칭: lab-encryption-key 입력
  5. 키 관리자: 현재 IAM 사용자 선택
  6. 키 사용자: 현재 IAM 사용자 선택
  7. 키 정책 검토 후 완료 클릭
코드
aws kms create-key \
  --description "Lab encryption key for data at rest" \
  --key-usage ENCRYPT_DECRYPT \
  --origin AWS_KMS
 
aws kms create-alias \
  --alias-name alias/lab-encryption-key \
  --target-key-id KEY_ID

KMS CMK(Customer Master Key)는 직접 데이터를 암호화하지 않습니다. Data Key를 생성하여 실제 데이터를 암호화하는 봉투 암호화 방식을 사용합니다. 이렇게 하면 대용량 데이터도 효율적으로 암호화할 수 있습니다.

Step 2: S3 SSE-KMS 암호화 설정

S3의 서버측 암호화에는 세 가지 옵션이 있습니다. SSE-S3는 AWS가 키를 자동 관리하므로 가장 간편하지만, 키에 대한 세밀한 접근 제어가 불가능합니다. SSE-KMS는 CMK를 사용하므로 키 정책으로 "누가 복호화할 수 있는가"를 제어할 수 있습니다. SSE-C는 고객이 직접 키를 제공하는 방식으로, 키 관리 부담이 크지만 완전한 통제권을 가집니다.

버킷 키(Bucket Key)를 활성화하면 S3가 버킷 수준의 키를 캐싱하여, 객체마다 KMS API를 호출하지 않아도 됩니다. 대량의 객체를 저장하는 버킷에서는 KMS API 비용을 최대 99%까지 절감할 수 있습니다.

진행률 0/6
  1. 1S3 콘솔 → 버킷 만들기 → 이름: encryption-lab-{계정ID}
  2. 2기본 암호화 섹션에서 암호화 유형: SSE-KMS 선택
  3. 3AWS KMS 키: lab-encryption-key 선택
  4. 4버킷 키 활성화 (KMS 요청 비용 절감)
  5. 5테스트 파일 업로드 후 속성 탭에서 암호화 상태 확인
  6. 6서버 측 암호화가 aws:kms로 표시되는지 검증
✏️

본인의 말로 설명해 보세요

봉투 암호화(Envelope Encryption)가 CMK로 직접 데이터를 암호화하지 않는 이유를 설명해보세요.

💡 CMK는 HSM 내부에 보관되며 AWS 밖으로 반출 불가. 대용량 데이터를 네트워크로 전송하여 HSM에서 암호화하면 속도가 매우 느림. 대신 빠른 Data Key를 생성하여 로컬에서 암호화...

S3 암호화 옵션 비교

S3의 세 가지 서버측 암호화 옵션을 비교하면 각 상황에 맞는 최적의 선택을 할 수 있습니다.

다이어그램 로딩 중...
S3 서버측 암호화 옵션 비교
  • SSE-S3: 설정이 가장 간편합니다. AWS가 자동으로 키를 생성, 관리, 교체합니다. 단, "누가 이 키를 사용할 수 있는가"를 제어할 수 없으므로, S3 버킷에 접근 권한이 있는 사람은 누구나 데이터를 복호화할 수 있습니다.
  • SSE-KMS: CMK의 키 정책으로 복호화 권한을 세밀하게 제어합니다. CloudTrail에 모든 복호화 API 호출이 기록되므로 감사에 유리합니다. 규제 준수가 필요한 환경에서 권장합니다.
  • SSE-C: 고객이 직접 암호화 키를 생성하고, 매 요청마다 키를 전달해야 합니다. AWS는 키를 저장하지 않으므로 키를 분실하면 데이터를 영구적으로 잃게 됩니다. 극도로 높은 보안 요구사항이 있는 경우에만 사용합니다.

Step 3: EBS 볼륨 암호화

EBS 볼륨 암호화는 EC2 인스턴스에 연결된 디스크 데이터를 보호합니다. 암호화된 볼륨에서는 데이터가 디스크에 기록될 때 자동으로 암호화되고, 읽힐 때 자동으로 복호화됩니다. 성능 영향은 거의 없습니다(AWS 전용 하드웨어 가속 사용).

중요한 팁: EC2 설정에서 EBS 암호화 기본값을 활성화하면, 이후 생성되는 모든 EBS 볼륨이 자동으로 암호화됩니다. 이미 존재하는 암호화되지 않은 볼륨은 직접 변환할 수 없지만, 스냅샷을 생성하고 암호화된 스냅샷에서 새 볼륨을 만드는 방법으로 변환할 수 있습니다.

  1. EC2 콘솔 → 볼륨볼륨 생성 클릭
  2. 볼륨 유형: gp3, 크기: 8 GiB
  3. 가용 영역: ap-northeast-2a
  4. 이 볼륨을 암호화 체크
  5. KMS 키: lab-encryption-key 선택
  6. 볼륨 생성 클릭
코드
aws ec2 create-volume \
  --availability-zone ap-northeast-2a \
  --size 8 \
  --volume-type gp3 \
  --encrypted \
  --kms-key-id alias/lab-encryption-key \
  --tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=lab-encrypted-vol}]'

EC2 설정에서 EBS 암호화 기본값 활성화를 설정하면 이후 생성되는 모든 EBS 볼륨이 자동으로 암호화됩니다. EC2 콘솔 → EBS 설정기본적으로 암호화 에서 활성화할 수 있습니다.

Step 4: Secrets Manager 비밀 생성 및 로테이션

Secrets Manager는 데이터베이스 비밀번호, API 키, OAuth 토큰 등 민감 정보를 안전하게 저장하는 서비스입니다. 코드에 비밀번호를 하드코딩하는 대신 Secrets Manager에서 런타임에 조회하면, 비밀번호가 소스 코드에 노출되지 않습니다.

자동 교체(Rotation)는 Secrets Manager의 핵심 기능입니다. Lambda 함수가 설정한 주기(예: 30일)마다 자동으로 비밀번호를 변경합니다. 오래된 비밀번호는 유출 위험이 높으므로, 자동 교체를 통해 보안을 강화할 수 있습니다.

진행률 0/8
  1. 1Secrets Manager 콘솔 → 새 비밀 저장 클릭
  2. 2비밀 유형: 기타 유형의 비밀 선택
  3. 3키/값: db_password / MySecureP@ssw0rd! 입력
  4. 4암호화 키: lab-encryption-key 선택
  5. 5비밀 이름: lab/database/credentials 입력
  6. 6자동 교체 구성 → 교체 주기: 30일 설정
  7. 7Lambda 교체 함수: 새 함수 생성 선택 (선택 사항)
  8. 8저장 클릭 후 비밀 값 조회 테스트

Step 5: 암호화 감사 확인

암호화를 설정했다면, 실제로 올바르게 적용되었는지 감사(audit)하는 것이 중요합니다. CloudTrail은 모든 KMS API 호출을 기록하므로, "누가 언제 어떤 데이터를 복호화했는지"를 추적할 수 있습니다. 이것은 규정 준수 감사에서 핵심 증거가 됩니다.

진행률 0/5
  1. 1KMS 콘솔 → lab-encryption-key → 키 사용량 탭 확인
  2. 2CloudTrail → 이벤트 기록 → Decrypt, GenerateDataKey API 호출 확인
  3. 3S3 버킷 객체의 x-amz-server-side-encryption 헤더가 aws:kms인지 확인
  4. 4EBS 볼륨 상세 정보에서 암호화됨: 예 확인
  5. 5Secrets Manager 비밀의 암호화 키 필드가 CMK를 가리키는지 확인

트러블슈팅 가이드

S3 객체 업로드 시 "Access Denied" 에러가 발생하는 경우

  • IAM 사용자/역할에 kms:GenerateDataKey 권한이 있는지 확인하세요. SSE-KMS로 암호화된 버킷에 객체를 업로드하려면 KMS API 호출 권한이 필요합니다.
  • KMS 키 정책에서 해당 IAM 주체가 "키 사용자"로 등록되어 있는지 확인하세요.

암호화된 EBS 스냅샷을 다른 리전/계정으로 복사할 때 실패하는 경우

  • CMK는 리전 단위 리소스입니다. 다른 리전으로 복사하려면 대상 리전에 별도의 CMK가 필요합니다.
  • 다른 계정으로 공유하려면 CMK의 키 정책에 대상 계정의 ARN을 추가해야 합니다.

KMS 키 삭제 후 데이터에 접근할 수 없는 경우

  • KMS 키를 삭제하면 해당 키로 암호화된 모든 데이터가 영구적으로 복호화 불가능해집니다. 이것은 되돌릴 수 없습니다.
  • KMS 키 삭제에는 최소 7일의 대기 기간이 있으며, 이 기간 내에 삭제를 취소할 수 있습니다.
  • 실습 완료 후에는 키를 삭제하기 전 반드시 관련 데이터를 정리하세요.

핵심 개념 확인

완성 후 테스트 가이드

진행률 0/5
  1. 1S3 암호화 확인: S3 버킷에 파일을 업로드하고, 객체 속성에서 서버측 암호화가 aws:kms로 표시되는지 확인합니다.
  2. 2EBS 암호화 확인: EC2 콘솔 → 볼륨에서 생성한 볼륨의 "암호화됨" 필드가 "예"로 표시되는지 확인합니다.
  3. 3Secrets Manager 조회 테스트: CLI로 aws secretsmanager get-secret-value --secret-id lab/database/credentials를 실행하여 비밀 값이 정상 조회되는지 확인합니다.
  4. 4CloudTrail 감사: CloudTrail 이벤트 기록에서 GenerateDataKey, Decrypt API 호출이 기록되어 있는지 확인합니다.
  5. 5접근 제어 테스트: 키 사용자가 아닌 IAM 사용자로 암호화된 S3 객체 다운로드를 시도하여 "Access Denied"가 반환되는지 확인합니다.
✏️

본인의 말로 설명해 보세요

회사 동료에게 'SSE-S3와 SSE-KMS의 차이, 그리고 왜 SSE-KMS를 선택해야 하는 상황'을 설명해보세요.

💡 SSE-S3: AWS가 키를 완전 관리, 설정 간편, 하지만 키 접근 제어 불가. SSE-KMS: CMK 사용, 키 정책으로 누가 복호화할 수 있는지 제어 가능, CloudTrail에 사용 이력 기록. 규제 준수나 세밀한 접근 제어가 필요할 때...

실무에서 자주 묻는 질문

Q: 암호화를 적용하면 성능이 떨어지나요?

대부분의 AWS 서비스에서 암호화의 성능 영향은 무시할 수 있는 수준입니다. S3의 SSE 암호화는 클라이언트 측에서 체감되지 않으며, EBS 볼륨 암호화도 AWS 전용 하드웨어(AES-NI 등)를 사용하므로 성능 차이가 1% 미만입니다. KMS API 호출이 병목이 될 수 있는 경우(초당 수천 건의 암호화 요청), S3 버킷 키나 KMS 키 캐싱을 활용하여 해결할 수 있습니다.

Q: KMS CMK는 리전마다 별도로 만들어야 하나요?

네. KMS CMK는 리전 단위 리소스입니다. 서울 리전에서 만든 CMK로 도쿄 리전의 S3 버킷을 암호화할 수 없습니다. 멀티 리전 환경에서는 각 리전마다 CMK를 생성하거나, 멀티 리전 키(Multi-Region Key) 기능을 사용하여 하나의 논리적 키를 여러 리전에서 복제할 수 있습니다.

Q: Secrets Manager와 SSM Parameter Store SecureString의 차이는?

둘 다 민감 정보를 암호화하여 저장하지만 용도가 다릅니다. Secrets Manager는 자동 교체(rotation) 기능이 내장되어 있고 비밀당 $0.40/월의 비용이 발생합니다. Parameter Store SecureString은 무료(표준 티어)이지만 자동 교체를 직접 구현해야 합니다. DB 비밀번호처럼 정기 교체가 필요한 비밀은 Secrets Manager를, 단순 설정값은 Parameter Store를 사용하는 것이 일반적입니다.

확장 아이디어

  1. 교차 계정 암호화: CMK의 키 정책을 수정하여 다른 AWS 계정에서도 이 키를 사용할 수 있도록 설정하고, 교차 계정 S3 객체 복호화를 구현합니다.
  2. RDS 암호화 적용: 암호화된 RDS 인스턴스를 생성하고, Secrets Manager와 연동하여 DB 비밀번호를 자동 교체합니다.
  3. 키 자동 교체: KMS CMK의 자동 교체를 활성화하여, 1년마다 키 자료(key material)가 자동으로 교체되도록 설정합니다.
  4. 커스텀 키 저장소: AWS CloudHSM 클러스터를 생성하고, KMS와 연동하여 자체 HSM에서 키를 관리하는 커스텀 키 저장소를 구성합니다.
  5. Parameter Store vs Secrets Manager 비교: SSM Parameter Store의 SecureString과 Secrets Manager를 비교 분석하고, 용도별 적절한 선택 기준을 정리합니다.

암호화 적용 체크리스트

프로덕션 환경에서 암호화를 완전하게 적용하려면 아래 항목을 모두 확인해야 합니다.

진행률 0/7
  1. 1S3 버킷: 모든 버킷에 SSE-KMS 기본 암호화 적용. 퍼블릭 접근이 필요한 버킷도 별도 CMK로 암호화
  2. 2EBS 볼륨: 계정 수준에서 EBS 기본 암호화 활성화. 기존 미암호화 볼륨은 스냅샷 → 암호화 스냅샷 → 새 볼륨으로 교체
  3. 3RDS 인스턴스: 생성 시 암호화 옵션 필수 체크. 기존 미암호화 인스턴스는 스냅샷 → 암호화 복원으로 교체
  4. 4Secrets Manager/Parameter Store: 코드 내 하드코딩된 비밀번호를 모두 제거하고 런타임 조회로 전환
  5. 5전송 중 암호화: ALB/CloudFront에 ACM 인증서 적용. 내부 통신도 TLS 활성화
  6. 6KMS 키 정책: 키 관리자와 키 사용자 분리. 최소 권한 원칙 적용
  7. 7CloudTrail 감사: Decrypt, GenerateDataKey API 호출이 정상 기록되는지 확인

학습 정리

핵심 치트시트

리소스 정리

실습 완료 후 반드시 아래 순서대로 리소스를 정리하여 불필요한 과금을 방지하세요.

  1. Secrets Manager 비밀 삭제 (즉시 삭제 옵션 선택)
  2. EBS 볼륨 삭제 (암호화된 볼륨)
  3. S3 버킷 비우기 및 삭제
  4. KMS 키 비활성화 → 삭제 예약 (최소 7일 대기)
  5. CloudTrail 이벤트 확인 후 추가 리소스 정리
  6. Lambda 교체 함수 삭제 (생성한 경우)