KMS 데이터 암호화
"데이터를 금고에 넣자 - 저장된 데이터를 암호화하여 보호하기"
학습 목표
- 저장 데이터 암호화(Encryption at Rest)와 전송 중 암호화(Encryption in Transit)의 차이를 이해할 수 있다
- AWS KMS(Key Management Service)의 역할과 키 유형을 이해할 수 있다
- RDS, S3, DynamoDB의 암호화 상태를 확인하고 설정할 수 있다
- AWS 관리형 키와 고객 관리형 키(CMK)의 차이를 구분할 수 있다
스토리지 암호화
기본 암호화
기본 암호화 (자동)
저장 데이터 암호화란?
집에 귀중품을 보관할 때 그냥 서랍에 넣어두면 도둑이 훔쳐갈 수 있습니다. 하지만 금고에 넣고 잠그면, 금고를 가져가더라도 열쇠 없이는 내용물을 볼 수 없습니다. 데이터 암호화도 마찬가지입니다. 누군가 하드 드라이브를 물리적으로 가져가더라도 암호화 키 없이는 데이터를 읽을 수 없습니다.
두 가지 암호화: 저장 vs 전송
| 구분 | 저장 데이터 암호화 (At Rest) | 전송 중 암호화 (In Transit) |
|---|---|---|
| 대상 | 디스크에 저장된 데이터 | 네트워크를 통해 이동 중인 데이터 |
| 비유 | 금고에 넣어 보관 | 봉인된 택배로 배송 |
| 방법 | KMS 키로 디스크 암호화 | TLS/SSL (HTTPS) 사용 |
| 예시 | RDS 스토리지, S3 객체, DynamoDB 테이블 | 브라우저 ↔ 서버 HTTPS 통신 |
| 위협 방어 | 물리적 디스크 탈취, 스냅샷 유출 | 네트워크 도청, 중간자 공격 |
이번 실습에서는 저장 데이터 암호화에 집중합니다. ShopEasy의 RDS, S3, DynamoDB에 저장된 데이터가 암호화되어 있는지 확인하고, 필요한 경우 암호화를 설정합니다.
KMS 핵심 개념
자물쇠 전문 업체에 금고 열쇠 관리를 맡기는 것과 같습니다. 여러분은 "이 금고를 잠가줘", "이 금고를 열어줘"라고 요청만 하면 됩니다. 열쇠를 직접 보관하거나, 열쇠가 분실될 걱정을 할 필요가 없습니다. AWS가 열쇠(암호화 키)를 안전하게 보관하고 관리해 줍니다.
AWS KMS (Key Management Service)
AWS KMS는 데이터를 암호화할 때 사용하는 암호화 키를 생성하고 관리하는 완전관리형 서비스입니다. RDS, S3, DynamoDB 등 대부분의 AWS 서비스가 KMS와 통합되어 있어, 간단한 설정만으로 데이터를 암호화할 수 있습니다.
암호화 동작 원리
# 데이터 저장 시 (암호화)
원본 데이터 --[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 기본 암호화 | 규제 준수, 세밀한 키 관리 필요 시 |
- 일반적인 경우: AWS 관리형 키 (aws/s3, aws/rds)로 충분합니다. 무료이고 관리 부담이 없습니다.
- 규제 준수가 필요한 경우: 고객 관리형 키(CMK)를 사용합니다. 키 정책, 교차 계정 접근 제어, 감사(Audit) 등이 가능합니다.
- 이번 실습에서는 AWS 관리형 키를 사용하여 비용 없이 암호화를 구성합니다.
ShopEasy에서 암호화할 대상
| 서비스 | 저장 데이터 | 암호화 방법 | 실습 내용 |
|---|---|---|---|
| RDS MySQL | 상품, 주문, 회원 데이터 | 스토리지 암호화 (aws/rds 키) | 암호화 상태 확인 |
| S3 Bucket | 리뷰 이미지, 프론트엔드 파일 | 기본 암호화 (SSE-S3 또는 SSE-KMS) | 기본 암호화 설정 |
| DynamoDB | 리뷰 데이터 (Reviews 테이블) | AWS 소유 키 (자동 암호화) | 암호화 상태 확인 |
RDS 인스턴스의 스토리지 암호화는 인스턴스 생성 시에만 설정할 수 있습니다. 이미 생성된 암호화되지 않은 RDS 인스턴스에는 직접 암호화를 활성화할 수 없습니다. 암호화가 필요한 경우 스냅샷 생성 → 암호화된 스냅샷으로 복사 → 복원 과정을 거쳐야 합니다. 이번 실습에서는 현재 상태를 확인하고 개념을 이해하는 데 집중합니다.
실습: KMS 데이터 암호화
- Chapter 03에서 생성한 RDS MySQL 인스턴스가 실행 중이어야 합니다
- Chapter 05에서 생성한 S3 버킷 (shopeasy-images-{ACCOUNT_ID})이 있어야 합니다
- Chapter 05에서 생성한 DynamoDB Reviews 테이블이 있어야 합니다
- AWS 콘솔에 로그인되어 있어야 합니다
-
RDS 암호화 상태 확인
RDS MySQL 인스턴스의 스토리지 암호화가 활성화되어 있는지 확인합니다.
- AWS 콘솔에서 RDS 서비스로 이동합니다
- 데이터베이스 목록에서 ShopEasy RDS 인스턴스를 선택합니다
- 구성(Configuration) 탭에서 스토리지 암호화(Storage encryption) 항목을 확인합니다
암호화가 비활성화되어 있다면?이미 생성된 RDS 인스턴스에는 스토리지 암호화를 직접 켤 수 없습니다. 암호화를 적용하려면 다음 과정이 필요합니다:
- 현재 인스턴스의 스냅샷을 생성
- 스냅샷을 암호화 옵션을 켜고 복사
- 암호화된 스냅샷에서 새 인스턴스를 복원
- 애플리케이션의 DB 엔드포인트를 새 인스턴스로 변경
이 과정은 다운타임이 발생하고 비용이 추가되므로, 이번 실습에서는 상태 확인과 개념 이해에 집중합니다. 실무에서는 RDS 인스턴스를 처음 생성할 때 반드시 암호화를 활성화하세요!
AWS 콘솔 → RDS → 데이터베이스 → 인스턴스 선택 → 구성 탭 → "스토리지" 섹션에서 암호화 항목을 찾습니다. "활성화됨" 또는 "비활성화됨"으로 표시됩니다.
-
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"를 선택하고 저장합니다. - 대상 버킷:
-
DynamoDB 암호화 확인
DynamoDB Reviews 테이블의 암호화 상태를 확인합니다.
- DynamoDB는 모든 테이블을 자동으로 암호화합니다 (비활성화 불가)
- 기본값: AWS 소유 키 (무료, AWS가 완전 관리)
- 선택적으로 AWS 관리형 키(aws/dynamodb) 또는 고객 관리형 키로 변경 가능
DynamoDB 암호화의 특징DynamoDB는 다른 서비스와 달리 암호화를 끌 수 없습니다. 모든 데이터, 인덱스, 스트림, 백업이 항상 암호화되어 있습니다. 유일한 선택은 "어떤 키를 사용할 것인가"입니다.
AWS 콘솔 → DynamoDB → 테이블 →
Reviews선택 → 추가 설정(Additional settings) 탭 → 암호화(Encryption) 섹션에서 현재 사용 중인 키 유형을 확인합니다. -
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)의 차이를 이해했다