AWS Security & Encryption 정리
작성자 : 오예환 | 작성일 : 2026-01-18 | 수정일 : 2026-01-18
1. 암호화의 기본 개념
🤔 암호화가 왜 필요한가요?
비유로 이해하기: 암호화는 봉투에 편지를 넣고 봉인하는 것과 같습니다.
- 봉투 없이 엽서로 보내면 → 누구나 내용을 볼 수 있음 (위험!)
- 봉투에 넣고 봉인하면 → 받는 사람만 열어볼 수 있음 (안전!)
암호화의 3가지 유형
1️⃣ 전송 중 암호화 (Encryption in Flight / TLS/SSL)
┌────────────────────────────────────────────────────────────────┐
│ │
│ Client 인터넷 Server │
│ ┌─────┐ ┌─────┐ │
│ │ │ ──암호화──→ aGVsbG8gd29... ──복호화──→ │ │ │
│ │ │ (HTTPS) (알아볼 수 없음) (HTTPS) │ │ │
│ └─────┘ └─────┘ │
│ │
│ Username: admin │
│ Password: supersecret │
│ │
│ ⚠️ 중간에서 가로채도 "aGVsbG8gd29..." 만 보임! │
│ │
└────────────────────────────────────────────────────────────────┘** 설명**:
- HTTPS의 S가 바로 이것! (HTTP + SSL/TLS)
- 데이터가 네트워크를 타고 이동할 때 암호화
- 해커가 중간에서 가로채도(MITM 공격) 내용을 볼 수 없음
실생활 예시:
- 은행 웹사이트 접속 시 주소창에 🔒 자물쇠 표시 = HTTPS 사용 중
2️⃣ 저장 시 암호화 (Server-side Encryption at Rest)
┌────────────────────────────────────────────────────────────────┐
│ AWS 서비스 (예: S3) │
│ │
│ Client ──(HTTPS)──→ 원본 데이터 ──암호화──→ 🔐 암호화된 데이터 │
│ │ │ │
│ │ 저장 │ │
│ │ ↓ │ │
│ 데이터 키 데이터 키 │
│ │
│ 조회 시: 🔐 암호화된 데이터 ──복호화──→ 원본 데이터 ──→ Client │
│ │
└────────────────────────────────────────────────────────────────┘** 설명**:
- 서버가 데이터를 받은 후 암호화해서 저장
- 내보낼 때 복호화해서 전송
- AWS가 키를 관리 (우리가 신경 쓸 필요 없음!)
실생활 예시:
- S3에 파일 업로드 → AWS가 알아서 암호화해서 저장
3️⃣ 클라이언트 측 암호화 (Client-side Encryption)
┌────────────────────────────────────────────────────────────────┐
│ │
│ Client (내 컴퓨터) │
│ ┌─────────────────────────────────────────┐ │
│ │ 원본 데이터 + 내 암호화 키 │ │
│ │ ↓ │ │
│ │ 🔐 암호화된 데이터 (내가 직접 암호화!) │ │
│ └─────────────────────────────────────────┘ │
│ │ │
│ ↓ 업로드 │
│ ┌─────────────────────────────────────────┐ │
│ │ S3 / FTP / Any Storage │ │
│ │ │ │
│ │ 🔐 암호화된 데이터만 저장 │ │
│ │ (서버도 내용을 모름!) │ │
│ └─────────────────────────────────────────┘ │
│ │
│ ⚠️ 서버는 절대 복호화할 수 없음! 내 키가 있어야만 복호화 가능 │
│ │
└────────────────────────────────────────────────────────────────┘** 설명**:
- 내가 직접 암호화해서 업로드
- 서버는 암호화된 데이터만 저장 (내용 모름!)
- 가장 안전하지만 키 관리를 내가 해야 함
사용 사례:
- 매우 민감한 의료 정보
- 법적으로 제3자가 접근 불가해야 하는 데이터
2. AWS KMS (Key Management Service)
🤔 KMS가 뭔가요?
비유로 이해하기: KMS는 금고 열쇠를 보관하는 은행 금고와 같습니다.
- 집에 열쇠를 보관하면 도둑이 가져갈 수 있음
- 은행 금고에 보관하면 안전! + 누가 열쇠를 사용했는지 기록됨
KMS 핵심 특징
| 특징 | 설명 | 설명 |
|---|---|---|
| 통합 | 대부분 AWS 서비스와 연동 | EBS, S3, RDS 등에서 "암호화" 체크만 하면 됨 |
| IAM 통합 | 누가 키를 쓸 수 있는지 제어 | "이 사용자만 이 키 사용 가능" |
| 감사 | CloudTrail로 키 사용 기록 | "누가 언제 어떤 키를 사용했는지" 추적 |
| API 제공 | SDK, CLI로 프로그래밍 가능 | 코드에서 직접 암호화/복호화 호출 |
⚠️ 절대 하면 안 되는 것!
# ❌ 절대 하지 마세요!
password = "MySecretPassword123" # 코드에 비밀번호 직접 저장
# ✅ 이렇게 하세요!
import boto3
kms = boto3.client('kms')
encrypted_password = "AQICAHh..." # KMS로 암호화된 값
# 필요할 때 복호화
decrypted = kms.decrypt(CiphertextBlob=encrypted_password)
password = decrypted['Plaintext']** 팁**: "코드에 비밀번호 절대 금지!" → KMS로 암호화하거나 Secrets Manager 사용
3. KMS Key 유형
🤔 왜 여러 종류가 있나요?
용도와 보안 수준에 따라 다른 키가 필요합니다.
대칭 키 vs 비대칭 키
| 유형 | 설명 | 비유 |
|---|---|---|
| 대칭 키 (Symmetric) | 암호화/복호화에 같은 키 사용 | 같은 열쇠로 잠그고 여는 금고 |
| 비대칭 키 (Asymmetric) | 공개 키(암호화) + 개인 키(복호화) | 누구나 넣을 수 있는 우체통 + 나만 열 수 있는 열쇠 |
대칭 키 (AES-256) - 가장 많이 사용!
암호화: 원본 데이터 + 키 → 🔐 암호화된 데이터
복호화: 🔐 암호화된 데이터 + 같은 키 → 원본 데이터
⚠️ 키 자체는 절대 볼 수 없음! KMS API를 통해서만 사용** 설명**:
- AWS 서비스들은 대부분 대칭 키 사용
- 키를 직접 다운로드 불가 (보안상)
- 반드시 KMS API 호출해서 암호화/복호화
비대칭 키 (RSA, ECC)
┌─────────────────────────────────────────────────────────┐
│ │
│ 공개 키 (Public Key) 개인 키 (Private Key) │
│ - 다운로드 가능 ✅ - 다운로드 불가 ❌ │
│ - 암호화에 사용 - 복호화에 사용 │
│ - 누구에게나 공개 가능 - KMS 내부에서만 사용 │
│ │
└─────────────────────────────────────────────────────────┘
사용 예시: AWS 외부에서 암호화가 필요할 때
- 외부 파트너가 공개 키로 암호화
- 우리만 개인 키로 복호화 (KMS API 통해)사용 사례:
- AWS API를 호출할 수 없는 외부 시스템과 연동
- 디지털 서명 (Sign/Verify)
KMS Key 종류별 비용
| 종류 | 비용 | 관리 주체 | 예시 |
|---|---|---|---|
| AWS Owned Keys | 무료 | AWS | SSE-S3, SSE-SQS |
| AWS Managed Keys | 무료 | AWS | aws/rds, aws/ebs |
| Customer Managed Keys | $1/월 | 고객 | 직접 생성한 키 |
| Imported Keys | $1/월 | 고객 | 외부에서 가져온 키 |
- API 호출 비용: $0.03 / 10,000 호출
키 자동 교체 (Rotation)
| 키 종류 | 자동 교체 |
|---|---|
| AWS Managed Key | 자동 (1년마다) |
| Customer Managed Key | 활성화 필요 (자동 + 수동) |
| Imported Key | 수동만 (Alias로 관리) |
** 팁**: 보안을 위해 키를 주기적으로 교체해야 합니다. Customer Managed Key는 반드시 자동 교체를 활성화하세요!
4. KMS 작동 방식
🤔 어떻게 암호화/복호화가 이뤄지나요?
기본 흐름 (4KB 이하 데이터)
┌─────────────────────────────────────────────────────────────────┐
│ 암호화 (Encrypt) │
│ │
│ 1. Client: "이 비밀번호 암호화해줘" + IAM 자격 증명 │
│ ↓ │
│ 2. KMS: IAM 권한 확인 ✅ │
│ ↓ │
│ 3. KMS: CMK로 암호화 │
│ ↓ │
│ 4. Client: 암호화된 데이터 받음 (저장해서 사용) │
│ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 복호화 (Decrypt) │
│ │
│ 1. Client: "이 암호화된 데이터 복호화해줘" + IAM 자격 증명 │
│ ↓ │
│ 2. KMS: IAM 권한 확인 ✅ │
│ ↓ │
│ 3. KMS: CMK로 복호화 │
│ ↓ │
│ 4. Client: 평문 데이터 받음 (메모리에서만 사용, 저장 금지!) │
│ │
└─────────────────────────────────────────────────────────────────┘** 주의**: Encrypt/Decrypt API는 최대 4KB 데이터만 처리 가능! 더 큰 데이터는 → Envelope Encryption 사용
5. Envelope Encryption (봉투 암호화)
🤔 왜 필요한가요?
문제: KMS Encrypt API는 4KB까지만 암호화 가능 해결: 데이터를 암호화할 **데이터 키(DEK)**를 생성하고, 그 키를 KMS로 암호화
비유로 이해하기
일반 암호화 (4KB 이하):
📄 작은 편지 → 🔐 금고에 직접 넣음
봉투 암호화 (4KB 이상):
📦 큰 상자 → 🔑 상자 전용 열쇠로 잠금
→ 🔐 열쇠만 금고에 보관
→ 📦+🔐 상자와 암호화된 열쇠를 함께 저장암호화 과정 (GenerateDataKey API)
┌─────────────────────────────────────────────────────────────────┐
│ 봉투 암호화 과정 │
│ │
│ 1. Client → KMS: "데이터 키 생성해줘" (GenerateDataKey) │
│ │
│ 2. KMS → Client: │
│ ├─ 평문 DEK (Data Encryption Key): "abc123..." │
│ └─ 암호화된 DEK: "🔐xyz789..." │
│ │
│ 3. Client에서: │
│ ├─ 평문 DEK로 큰 파일(10MB) 암호화 → 🔐 암호화된 파일 │
│ ├─ 평문 DEK 즉시 삭제! (메모리에서 제거) │
│ └─ 저장: [암호화된 DEK] + [암호화된 파일] │
│ │
│ 결과물 (Envelope): │
│ ┌──────────────────────────────────┐ │
│ │ 🔐 암호화된 DEK (작음, KMS로만 복호화 가능) │
│ │ 🔐 암호화된 파일 (큼, DEK로만 복호화 가능) │
│ └──────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘복호화 과정
┌─────────────────────────────────────────────────────────────────┐
│ 봉투 복호화 과정 │
│ │
│ 1. 저장된 Envelope에서: │
│ ├─ 🔐 암호화된 DEK 추출 │
│ └─ 🔐 암호화된 파일 추출 │
│ │
│ 2. Client → KMS: "이 DEK 복호화해줘" (Decrypt API) │
│ │
│ 3. KMS → Client: 평문 DEK 반환 │
│ │
│ 4. Client에서: │
│ ├─ 평문 DEK로 파일 복호화 → 원본 파일 │
│ └─ 평문 DEK 즉시 삭제! │
│ │
└─────────────────────────────────────────────────────────────────┘시험 핵심!
📝 4KB 이상 데이터 암호화 = Envelope Encryption = GenerateDataKey API
6. AWS Encryption SDK
🤔 이게 뭔가요?
비유로 이해하기: Envelope Encryption을 자동으로 해주는 라이브러리입니다. 직접 GenerateDataKey 호출하고, 파일 암호화하고... 복잡하죠? SDK가 한 줄로 다 해줍니다!
지원 언어
- Java
- Python
- C
- JavaScript
- CLI 도구
예시 코드 (Python)
# Encryption SDK 없이 (복잡함!)
kms = boto3.client('kms')
response = kms.generate_data_key(KeyId='alias/my-key', KeySpec='AES_256')
plaintext_key = response['Plaintext']
encrypted_key = response['CiphertextBlob']
# ... 직접 암호화 로직 구현 ...
# Encryption SDK 사용 (간단함!)
import aws_encryption_sdk
client = aws_encryption_sdk.EncryptionSDKClient()
encrypted_data, header = client.encrypt(
source=my_large_file,
key_provider=my_key_provider
)
# 끝! DEK 생성, 암호화, 저장 다 자동으로!Data Key Caching
문제: 매번 KMS API 호출 → 느림 + 비용 + Throttling 해결: Data Key를 재사용 (캐싱)
┌─────────────────────────────────────────────────────────────────┐
│ DEK 캐싱 │
│ │
│ 캐싱 없이: │
│ 파일1 암호화 → KMS 호출 (DEK 생성) │
│ 파일2 암호화 → KMS 호출 (DEK 생성) │
│ 파일3 암호화 → KMS 호출 (DEK 생성) │
│ → 3번 호출, 느림, 비용 증가 │
│ │
│ 캐싱 사용: │
│ 파일1 암호화 → KMS 호출 (DEK 생성, 캐시에 저장) │
│ 파일2 암호화 → 캐시된 DEK 사용 (KMS 호출 안 함!) │
│ 파일3 암호화 → 캐시된 DEK 사용 (KMS 호출 안 함!) │
│ → 1번만 호출, 빠름, 비용 절감 │
│ │
│ ⚠️ 보안 트레이드오프: 같은 키 재사용은 보안상 약간 위험 │
│ │
└─────────────────────────────────────────────────────────────────┘캐시 설정 옵션:
max age: 캐시 유지 시간max bytes: 암호화할 최대 데이터 크기max messages: 암호화할 최대 메시지 수
7. KMS API 요약
주요 API
| API | 용도 | 데이터 크기 |
|---|---|---|
| Encrypt | 데이터 암호화 | ≤ 4KB |
| Decrypt | 데이터 복호화 | ≤ 4KB |
| GenerateDataKey | DEK 생성 (평문 + 암호화된 키) | 큰 데이터용 |
| GenerateDataKeyWithoutPlaintext | 암호화된 DEK만 생성 | 나중에 사용 |
| GenerateRandom | 랜덤 바이트 생성 | - |
Request Quotas (API 제한)
⚠️ KMS API 호출 한도 (초당 요청 수)
대칭 키:
- 기본: 5,500 RPS
- 일부 리전: 10,000 RPS (서울 등)
- us-east-1 등: 30,000 RPS
비대칭 키:
- RSA: 500 RPS
- ECC: 300 RPS
한도 초과 시: ThrottlingException → Exponential Backoff로 재시도!해결책:
- Exponential Backoff: 재시도 간격을 점점 늘림
- DEK Caching: Encryption SDK 사용
- 한도 증가 요청: AWS Support에 문의
8. KMS Key Policy
🤔 Key Policy가 뭔가요?
비유로 이해하기: 금고의 접근 권한 목록입니다.
- "김철수는 금고 열 수 있음"
- "박영희는 금고 보기만 가능"
- "외부인은 접근 불가"
S3 버킷 정책과의 차이
| S3 버킷 정책 | KMS Key Policy |
|---|---|
| 없어도 기본 접근 가능 | 없으면 접근 불가! |
| 선택 사항 | 필수 |
기본 Key Policy
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "kms:*",
"Resource": "*"
}의미: 같은 AWS 계정의 모든 사용자/역할이 IAM 권한 있으면 접근 가능
Custom Key Policy (Cross-Account 등)
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::OTHER-ACCOUNT:root"
},
"Action": ["kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey"],
"Resource": "*"
}사용 사례: 다른 AWS 계정에서 이 키 사용 허용
Cross-Account 스냅샷 복사
┌─────────────────────────────────────────────────────────────────┐
│ 계정 A → 계정 B 스냅샷 공유 │
│ │
│ 1. 계정 A: Customer Managed Key로 암호화된 스냅샷 생성 │
│ │
│ 2. 계정 A: Key Policy에 계정 B 접근 허용 추가 │
│ │
│ 3. 계정 A: 암호화된 스냅샷을 계정 B와 공유 │
│ │
│ 4. 계정 B: 스냅샷 복사 (계정 B의 CMK로 재암호화) │
│ │
│ 5. 계정 B: 복사된 스냅샷으로 볼륨 생성 │
│ │
└─────────────────────────────────────────────────────────────────┘9. S3 Bucket Key
🤔 이게 뭔가요?
문제: S3에 파일 많이 올리면 KMS API 호출이 엄청 많아짐 → 비용↑, Throttling 해결: S3가 **자체 키(Bucket Key)**를 만들어서 KMS 호출 줄임
작동 방식
┌─────────────────────────────────────────────────────────────────┐
│ S3 Bucket Key 없이 │
│ │
│ 파일1 업로드 → KMS 호출 (DEK 생성) │
│ 파일2 업로드 → KMS 호출 (DEK 생성) │
│ 파일3 업로드 → KMS 호출 (DEK 생성) │
│ ... 파일 100개 → KMS 100번 호출! │
│ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ S3 Bucket Key 사용 │
│ │
│ 1. S3가 KMS에서 Bucket Key 생성 (1회) │
│ 2. Bucket Key로 각 파일의 DEK 생성 (S3 내부) │
│ │
│ 파일1 업로드 → Bucket Key로 DEK 생성 (KMS 호출 안 함!) │
│ 파일2 업로드 → Bucket Key로 DEK 생성 (KMS 호출 안 함!) │
│ 파일3 업로드 → Bucket Key로 DEK 생성 (KMS 호출 안 함!) │
│ ... 파일 100개 → KMS 호출 거의 없음! │
│ │
│ 결과: KMS 호출 **99% 감소**, 비용 **99% 절감** │
│ │
└─────────────────────────────────────────────────────────────────┘** 팁**: S3 + SSE-KMS 사용 시 반드시 Bucket Key 활성화! (기본 활성화)
10. CloudHSM
🤔 KMS랑 뭐가 다른가요?
비유로 이해하기:
- KMS: 은행이 관리하는 공용 금고 (편리하지만 은행도 접근 가능)
- CloudHSM: 내가 직접 관리하는 개인 금고 (완전한 통제권)
KMS vs CloudHSM
| 항목 | KMS | CloudHSM |
|---|---|---|
| 관리 | AWS가 소프트웨어 관리 | 내가 하드웨어 관리 |
| 키 소유 | AWS도 접근 가능 | 나만 접근 가능 |
| 하드웨어 | 공유 (Multi-Tenant) | 전용 (Single-Tenant) |
| 인증 | FIPS 140-2 Level 3 | FIPS 140-2 Level 3 |
| 비용 | 저렴 (무료 티어 있음) | 비쌈 (무료 티어 없음) |
| 고가용성 | AWS 관리 | 내가 Multi-AZ 구성 |
CloudHSM 아키텍처
┌─────────────────────────────────────────────────────────────────┐
│ │
│ ┌──────────────────┐ SSL ┌──────────────────┐ │
│ │ CloudHSM Client │ ←──────→ │ CloudHSM │ │
│ │ (우리 앱) │ │ (AWS 하드웨어) │ │
│ └──────────────────┘ └──────────────────┘ │
│ │
│ AWS 역할: 우리 역할: │
│ - 하드웨어 제공 - 키 생성/관리 │
│ - 물리적 보안 - 사용자 관리 │
│ - 암호화 작업 │
│ │
└─────────────────────────────────────────────────────────────────┘사용 사례
| 사례 | 이유 |
|---|---|
| 규정 준수 | FIPS 140-2 Level 3 필수 |
| 완전한 키 통제 | AWS도 키에 접근 불가해야 할 때 |
| SSL/TLS 가속 | 고성능 암호화 필요 |
| Redshift 암호화 | CloudHSM 지원 |
| SSE-C | 고객이 키를 완전 관리 |
11. SSM Parameter Store
🤔 이게 뭔가요?
비유로 이해하기: 안전한 메모장입니다.
- 설정 값 (DB URL, API 엔드포인트)
- 비밀 정보 (비밀번호, API 키)
- 버전 관리까지!
특징
| 특징 | 설명 |
|---|---|
| 저장 | 설정 + 비밀 정보 |
| 암호화 | KMS로 선택적 암호화 |
| 버전 관리 | 변경 이력 추적 |
| 계층 구조 | 폴더처럼 정리 가능 |
| IAM | 세밀한 접근 제어 |
| EventBridge | 변경 시 알림 |
계층 구조 예시
/my-department/
├── my-app/
│ ├── dev/
│ │ ├── db-url → "localhost:5432"
│ │ └── db-password → "dev-secret" (암호화)
│ └── prod/
│ ├── db-url → "prod-db.aws.com:5432"
│ └── db-password → "prod-secret" (암호화)
└── other-app/
└── ...
특수 경로:
/aws/reference/secretsmanager/secret_ID → Secrets Manager 참조
/aws/service/ami-amazon-linux-latest/... → AWS 공개 파라미터사용 예시 (Python/Lambda)
import boto3
ssm = boto3.client('ssm')
# 단일 파라미터 조회
response = ssm.get_parameter(
Name='/my-app/prod/db-password',
WithDecryption=True # 암호화된 경우 복호화
)
password = response['Parameter']['Value']
# 경로 기반 조회 (하위 전체)
response = ssm.get_parameters_by_path(
Path='/my-app/prod/',
WithDecryption=True
)
for param in response['Parameters']:
print(param['Name'], param['Value'])Standard vs Advanced 티어
| 항목 | Standard | Advanced |
|---|---|---|
| 파라미터 수 | 10,000 | 100,000 |
| 값 크기 | 4 KB | 8 KB |
| 정책 | ❌ | ✅ (TTL 등) |
| 비용 | 무료 | $0.05/월/파라미터 |
Parameter Policies (Advanced만)
// 60일 후 자동 삭제
{
"Type": "Expiration",
"Version": "1.0",
"Attributes": {
"Timestamp": "2024-12-31T00:00:00.000Z"
}
}
// 만료 15일 전 알림
{
"Type": "ExpirationNotification",
"Version": "1.0",
"Attributes": {
"Before": "15",
"Unit": "Days"
}
}12. AWS Secrets Manager
🤔 Parameter Store랑 뭐가 다른가요?
비유로 이해하기:
- Parameter Store: 범용 메모장 (설정 + 비밀)
- Secrets Manager: 비밀번호 전용 금고 (자동 교체!)
핵심 차이: 자동 비밀 교체
┌─────────────────────────────────────────────────────────────────┐
│ Secrets Manager 자동 교체 │
│ │
│ 1. 30일마다 자동 트리거 │
│ ↓ │
│ 2. Lambda 함수 호출 (AWS 제공 또는 커스텀) │
│ ↓ │
│ 3. 새 비밀번호 생성 │
│ ↓ │
│ 4. RDS/Redshift/DocumentDB 비밀번호 변경 │
│ ↓ │
│ 5. Secrets Manager에 새 비밀 저장 │
│ ↓ │
│ 6. 앱은 항상 최신 비밀 사용 (코드 변경 없이!) │
│ │
└─────────────────────────────────────────────────────────────────┘Parameter Store vs Secrets Manager
| 항목 | Parameter Store | Secrets Manager |
|---|---|---|
| 주 용도 | 설정 + 비밀 | 비밀 전용 |
| 자동 교체 | ❌ (수동 구현) | ✅ (내장) |
| RDS 통합 | ❌ | ✅ (자동 교체) |
| 암호화 | 선택 | 필수 |
| 비용 | 저렴/무료 | 비쌈 |
| API 호환 | ✅ | ✅ |
Multi-Region Secrets
┌─── us-east-1 (Primary) ───┐ ┌─── us-west-2 (Secondary) ───┐
│ │ │ │
│ Secrets Manager │ │ Secrets Manager │
│ ┌──────────────────┐ │ │ ┌──────────────────┐ │
│ │ MySecret-A │ │ │ │ MySecret-A │ │
│ │ (primary) │ ────┼───→│ │ (replica) │ │
│ └──────────────────┘ │ │ └──────────────────┘ │
│ │ │ │
└────────────────────────────┘ └─────────────────────────────┘
- 자동 동기화
- 재해 복구 시 replica를 standalone으로 승격 가능13. CloudFormation과 비밀 관리
Dynamic References
# CloudFormation 템플릿에서 직접 참조
Resources:
MyDBInstance:
Type: AWS::RDS::DBInstance
Properties:
MasterUsername: admin
MasterUserPassword: "{{resolve:secretsmanager:MyRDSSecret:SecretString:password}}"참조 형식
| 서비스 | 형식 |
|---|---|
| SSM (평문) | {{resolve:ssm:parameter-name:version}} |
| SSM (암호화) | {{resolve:ssm-secure:parameter-name:version}} |
| Secrets Manager | {{resolve:secretsmanager:secret-id:secret-string:json-key:version}} |
RDS + Secrets Manager 자동 관리
# Option 1: ManageMasterUserPassword (권장!)
Resources:
MyDBInstance:
Type: AWS::RDS::DBInstance
Properties:
Engine: mysql
ManageMasterUserPassword: true # RDS가 알아서 비밀 생성 & 관리!14. CloudWatch Logs 암호화
설정 방법
# 기존 로그 그룹에 KMS 키 연결
aws logs associate-kms-key \
--log-group-name /my-app/logs \
--kms-key-id arn:aws:kms:us-east-1:123456789012:key/xxx
# 새 로그 그룹 생성 시
aws logs create-log-group \
--log-group-name /my-app/new-logs \
--kms-key-id arn:aws:kms:us-east-1:123456789012:key/xxx⚠️ 콘솔에서는 설정 불가! 반드시 API/CLI 사용
15. AWS Nitro Enclaves
🤔 이게 뭔가요?
비유로 이해하기: EC2 안에 완전히 격리된 작은 방을 만드는 것입니다.
- 주인(EC2 호스트)도 그 방 안을 볼 수 없음
- 네트워크 접근 불가
- 디스크 저장 불가
- 오직 암호화된 채널로만 통신
특징
| 특징 | 설명 |
|---|---|
| 격리 | 완전히 독립된 VM (커널, 메모리, CPU 분리) |
| 네트워크 | 외부 네트워크 접근 불가 |
| 저장소 | 영구 저장 불가 |
| 인증 | Cryptographic Attestation (코드 검증) |
| KMS 통합 | Enclave만 특정 키에 접근 가능 |
사용 사례
| 사례 | 이유 |
|---|---|
| PII 처리 | 개인정보 보호 |
| 금융 데이터 | 신용카드 처리 |
| 의료 정보 | HIPAA 준수 |
| 개인 키 보호 | 서명 작업 |
핵심 요약
암호화 유형 선택
| 상황 | 추천 |
|---|---|
| AWS 서비스 암호화 | KMS (기본) |
| 완전한 키 통제 필요 | CloudHSM |
| 4KB 이상 데이터 | Envelope Encryption |
| 설정 + 비밀 저장 | SSM Parameter Store |
| DB 비밀번호 자동 교체 | Secrets Manager |
API 기억하기
| API | 용도 |
|---|---|
| Encrypt/Decrypt | 4KB 이하 데이터 |
| GenerateDataKey | 4KB 이상 (Envelope) |