Chapter 10

KMS 데이터 암호화

"데이터를 금고에 넣자 - 저장된 데이터를 암호화하여 보호하기"

학습 목표

  • 저장 데이터 암호화(Encryption at Rest)와 전송 중 암호화(Encryption in Transit)의 차이를 이해할 수 있다
  • AWS KMS(Key Management Service)의 역할과 키 유형을 이해할 수 있다
  • RDS, S3, DynamoDB의 암호화 상태를 확인하고 설정할 수 있다
  • AWS 관리형 키와 고객 관리형 키(CMK)의 차이를 구분할 수 있다
Chapter 10 - KMS 데이터 암호화 아키텍처
AWS KMS
암호화 키 관리 서비스
↓ 암호화 키 제공
RDS MySQL
aws/rds 키
스토리지 암호화
S3 Bucket
aws/s3 키 또는 SSE-S3
기본 암호화
DynamoDB
AWS 소유 키
기본 암호화 (자동)

저장 데이터 암호화란?

비유로 이해하기: 암호화 = 금고에 데이터를 넣는 것

집에 귀중품을 보관할 때 그냥 서랍에 넣어두면 도둑이 훔쳐갈 수 있습니다. 하지만 금고에 넣고 잠그면, 금고를 가져가더라도 열쇠 없이는 내용물을 볼 수 없습니다. 데이터 암호화도 마찬가지입니다. 누군가 하드 드라이브를 물리적으로 가져가더라도 암호화 키 없이는 데이터를 읽을 수 없습니다.

두 가지 암호화: 저장 vs 전송

구분 저장 데이터 암호화 (At Rest) 전송 중 암호화 (In Transit)
대상 디스크에 저장된 데이터 네트워크를 통해 이동 중인 데이터
비유 금고에 넣어 보관 봉인된 택배로 배송
방법 KMS 키로 디스크 암호화 TLS/SSL (HTTPS) 사용
예시 RDS 스토리지, S3 객체, DynamoDB 테이블 브라우저 ↔ 서버 HTTPS 통신
위협 방어 물리적 디스크 탈취, 스냅샷 유출 네트워크 도청, 중간자 공격
이번 챕터의 초점: 저장 데이터 암호화 (Encryption at Rest)

이번 실습에서는 저장 데이터 암호화에 집중합니다. ShopEasy의 RDS, S3, DynamoDB에 저장된 데이터가 암호화되어 있는지 확인하고, 필요한 경우 암호화를 설정합니다.

KMS 핵심 개념

비유로 이해하기: KMS = 열쇠 관리 서비스 (자물쇠 전문 업체)

자물쇠 전문 업체에 금고 열쇠 관리를 맡기는 것과 같습니다. 여러분은 "이 금고를 잠가줘", "이 금고를 열어줘"라고 요청만 하면 됩니다. 열쇠를 직접 보관하거나, 열쇠가 분실될 걱정을 할 필요가 없습니다. AWS가 열쇠(암호화 키)를 안전하게 보관하고 관리해 줍니다.

AWS KMS (Key Management Service)

AWS KMS는 데이터를 암호화할 때 사용하는 암호화 키를 생성하고 관리하는 완전관리형 서비스입니다. RDS, S3, DynamoDB 등 대부분의 AWS 서비스가 KMS와 통합되어 있어, 간단한 설정만으로 데이터를 암호화할 수 있습니다.

암호화 동작 원리

text
# 데이터 저장 시 (암호화)
원본 데이터  --[KMS 키로 암호화]-->  암호화된 데이터  -->  디스크에 저장

# 데이터 읽기 시 (복호화)
디스크에서 읽기  -->  암호화된 데이터  --[KMS 키로 복호화]-->  원본 데이터

# 이 과정은 AWS 서비스가 자동으로 처리합니다.
# 애플리케이션 코드를 변경할 필요가 없습니다!
핵심 포인트: 투명한 암호화

AWS 서비스에서 암호화를 활성화하면, 애플리케이션은 암호화 여부를 알 필요가 없습니다. 데이터를 읽고 쓸 때 AWS가 자동으로 암호화/복호화를 처리합니다. ShopEasy API 서버 코드를 한 줄도 바꾸지 않아도 됩니다.

KMS 키 유형 비교

구분 AWS 소유 키 AWS 관리형 키 고객 관리형 키 (CMK)
생성 주체 AWS가 자동 생성 AWS가 자동 생성 고객이 직접 생성
키 이름 예시 (사용자에게 보이지 않음) aws/rds, aws/s3, aws/dynamodb my-shopeasy-key 등 자유 지정
키 확인 불가 KMS 콘솔에서 확인 가능 KMS 콘솔에서 관리 가능
키 순환 AWS가 자동 관리 매년 자동 순환 자동/수동 순환 설정 가능
비용 무료 무료 $1/월 + API 호출 비용
사용 사례 DynamoDB 기본 암호화 RDS, S3 기본 암호화 규제 준수, 세밀한 키 관리 필요 시
실무 Best Practice: 어떤 키를 선택할까?
  • 일반적인 경우: AWS 관리형 키 (aws/s3, aws/rds)로 충분합니다. 무료이고 관리 부담이 없습니다.
  • 규제 준수가 필요한 경우: 고객 관리형 키(CMK)를 사용합니다. 키 정책, 교차 계정 접근 제어, 감사(Audit) 등이 가능합니다.
  • 이번 실습에서는 AWS 관리형 키를 사용하여 비용 없이 암호화를 구성합니다.

ShopEasy에서 암호화할 대상

서비스 저장 데이터 암호화 방법 실습 내용
RDS MySQL 상품, 주문, 회원 데이터 스토리지 암호화 (aws/rds 키) 암호화 상태 확인
S3 Bucket 리뷰 이미지, 프론트엔드 파일 기본 암호화 (SSE-S3 또는 SSE-KMS) 기본 암호화 설정
DynamoDB 리뷰 데이터 (Reviews 테이블) AWS 소유 키 (자동 암호화) 암호화 상태 확인
RDS 암호화 주의사항

RDS 인스턴스의 스토리지 암호화는 인스턴스 생성 시에만 설정할 수 있습니다. 이미 생성된 암호화되지 않은 RDS 인스턴스에는 직접 암호화를 활성화할 수 없습니다. 암호화가 필요한 경우 스냅샷 생성 → 암호화된 스냅샷으로 복사 → 복원 과정을 거쳐야 합니다. 이번 실습에서는 현재 상태를 확인하고 개념을 이해하는 데 집중합니다.

실습: KMS 데이터 암호화

사전 준비
  • Chapter 03에서 생성한 RDS MySQL 인스턴스가 실행 중이어야 합니다
  • Chapter 05에서 생성한 S3 버킷 (shopeasy-images-{ACCOUNT_ID})이 있어야 합니다
  • Chapter 05에서 생성한 DynamoDB Reviews 테이블이 있어야 합니다
  • AWS 콘솔에 로그인되어 있어야 합니다
Hands-on Lab
  1. RDS 암호화 상태 확인

    RDS MySQL 인스턴스의 스토리지 암호화가 활성화되어 있는지 확인합니다.

    • AWS 콘솔에서 RDS 서비스로 이동합니다
    • 데이터베이스 목록에서 ShopEasy RDS 인스턴스를 선택합니다
    • 구성(Configuration) 탭에서 스토리지 암호화(Storage encryption) 항목을 확인합니다
    암호화가 비활성화되어 있다면?

    이미 생성된 RDS 인스턴스에는 스토리지 암호화를 직접 켤 수 없습니다. 암호화를 적용하려면 다음 과정이 필요합니다:

    1. 현재 인스턴스의 스냅샷을 생성
    2. 스냅샷을 암호화 옵션을 켜고 복사
    3. 암호화된 스냅샷에서 새 인스턴스를 복원
    4. 애플리케이션의 DB 엔드포인트를 새 인스턴스로 변경

    이 과정은 다운타임이 발생하고 비용이 추가되므로, 이번 실습에서는 상태 확인과 개념 이해에 집중합니다. 실무에서는 RDS 인스턴스를 처음 생성할 때 반드시 암호화를 활성화하세요!

    AWS 콘솔 → RDS → 데이터베이스 → 인스턴스 선택 → 구성 탭 → "스토리지" 섹션에서 암호화 항목을 찾습니다. "활성화됨" 또는 "비활성화됨"으로 표시됩니다.

  2. S3 버킷 기본 암호화 설정

    S3 이미지 버킷에 기본 암호화를 설정하여, 업로드되는 모든 객체가 자동으로 암호화되도록 합니다.

    • 대상 버킷: shopeasy-images-{ACCOUNT_ID}
    • 암호화 유형: SSE-S3 (AES-256) 또는 SSE-KMS (aws/s3 키)
    • 버킷 키(Bucket Key): 활성화 (KMS API 호출 비용 절감)
    SSE-S3 vs SSE-KMS 차이
    구분 SSE-S3 (AES-256) SSE-KMS (aws/s3)
    키 관리 S3가 자체 관리 KMS에서 관리
    감사 추적 불가 CloudTrail에 키 사용 기록
    비용 무료 무료 (aws/s3 관리형 키)
    추천 간단한 암호화 감사 추적이 필요한 경우
    참고: S3 기본 암호화 (2023년 1월~)

    2023년 1월부터 Amazon S3는 모든 새 객체에 대해 SSE-S3(AES-256) 암호화를 자동으로 적용합니다. 따라서 별도 설정 없이도 기본적인 암호화가 되어 있지만, 이 실습에서는 명시적으로 확인하고 설정하는 방법을 배웁니다.

    AWS 콘솔 → S3 → shopeasy-images-{ACCOUNT_ID} 버킷 → 속성(Properties) 탭 → 기본 암호화(Default encryption) 섹션 → 편집 → 암호화 유형으로 "SSE-S3" 또는 "SSE-KMS"를 선택하고 저장합니다.

  3. DynamoDB 암호화 확인

    DynamoDB Reviews 테이블의 암호화 상태를 확인합니다.

    • DynamoDB는 모든 테이블을 자동으로 암호화합니다 (비활성화 불가)
    • 기본값: AWS 소유 키 (무료, AWS가 완전 관리)
    • 선택적으로 AWS 관리형 키(aws/dynamodb) 또는 고객 관리형 키로 변경 가능
    DynamoDB 암호화의 특징

    DynamoDB는 다른 서비스와 달리 암호화를 끌 수 없습니다. 모든 데이터, 인덱스, 스트림, 백업이 항상 암호화되어 있습니다. 유일한 선택은 "어떤 키를 사용할 것인가"입니다.

    AWS 콘솔 → DynamoDB → 테이블 → Reviews 선택 → 추가 설정(Additional settings) 탭 → 암호화(Encryption) 섹션에서 현재 사용 중인 키 유형을 확인합니다.

  4. KMS 키 확인

    KMS 콘솔에서 AWS 관리형 키 목록을 확인하고, 각 키의 용도를 이해합니다.

    • KMS 콘솔에서 AWS 관리형 키 목록을 확인합니다
    • aws/rds, aws/s3, aws/dynamodb 등의 키가 있는지 확인합니다
    • 각 키를 클릭하여 키 정책, 키 사용 기록 등을 확인합니다
    AWS 관리형 키는 언제 생성되나?

    AWS 관리형 키(예: aws/rds)는 해당 서비스에서 처음으로 암호화를 사용할 때 자동으로 생성됩니다. 예를 들어, RDS 인스턴스를 암호화 옵션으로 처음 만들면 aws/rds 키가 자동 생성됩니다. 따라서 암호화된 리소스가 없는 경우 해당 키가 아직 없을 수 있습니다.

    AWS 콘솔 → KMS (Key Management Service) → 좌측 메뉴에서 AWS 관리형 키 클릭 → 키 목록에서 aws/s3, aws/rds, aws/dynamodb 등을 확인합니다. "고객 관리형 키" 메뉴에서는 직접 생성한 키를 확인할 수 있습니다.

확인 사항

아래 항목을 모두 완료했는지 체크하세요:

  • RDS 인스턴스의 스토리지 암호화 상태를 확인했다 (활성화/비활성화 여부 파악)
  • 암호화되지 않은 RDS 인스턴스에 암호화를 적용하는 방법(스냅샷 복사 방식)을 이해했다
  • S3 버킷 shopeasy-images-{ACCOUNT_ID}에 기본 암호화가 설정되었다
  • SSE-S3(AES-256)와 SSE-KMS의 차이를 이해했다
  • DynamoDB Reviews 테이블의 암호화 상태를 확인했다 (기본적으로 항상 암호화됨)
  • KMS 콘솔에서 AWS 관리형 키 목록을 확인했다
  • AWS 소유 키, AWS 관리형 키, 고객 관리형 키(CMK)의 차이를 이해했다