
[security] Secrets Manager
DB 비밀번호를 코드에 박아두는 건 이제 그만. 안전하게 보관하고 알아서 교체까지 해주는 방법.
One-Line Summary
Secrets Manager는 DB 자격증명·API 키 같은 비밀을 KMS로 암호화 저장하고, 스케줄에 따라 자동 교체(rotation) 하며, 앱은 항상 최신 값을 조회해 쓰게 하는 관리형 비밀 저장소다. 시험에서는 "자격증명 자동 교체(automatic rotation)" → 곧바로 Secrets Manager 이고, RDS/Aurora와의 네이티브 연동, Parameter Store와의 비용·기능 차이가 핵심이다.
뭔지 (What / Why)
비밀번호를 코드·설정 파일·환경변수에 하드코딩하면 (1) 유출 위험, (2) 보안 정책상 요구되는 주기적 교체가 사실상 불가능하다. 수동으로 바꾸면 앱이 옛 비밀번호로 접속하다 깨진다.
Secrets Manager는 비밀을 중앙에서 암호화 보관하고, 비밀번호를 새로 만들어 대상(RDS 등)에 반영한 뒤 저장값까지 갱신하는 회전을 자동화한다. 앱은 회전 여부와 무관하게 런타임에 최신 비밀을 조회한다.
[앱/Lambda] ──런타임 조회──▶ [Secrets Manager] ──암호화──▶ (KMS)
│
(스케줄 회전)
▼
[Rotation Lambda] → 새 비밀번호 생성 → RDS에 적용 → 저장값 갱신
⇒ 코드에 비밀 없음, 회전돼도 앱은 무중단으로 새 값 사용
자동 교체(Rotation)는 실제로 어떻게 동작하나 (핵심)
회전은 Rotation Lambda가 4단계를 수행하고, 비밀은 버전 + 스테이징 라벨로 관리된다. 이 라벨 개념이 "회전 중에도 앱이 안 깨지는" 이유다.
| 스테이징 라벨 | 의미 |
|---|---|
AWSCURRENT | 지금 유효한 비밀(앱이 기본으로 받는 값) |
AWSPENDING | 회전 중 새로 만든, 아직 검증 전 비밀 |
AWSPREVIOUS | 직전 비밀(롤백/유예용) |
회전은 Lambda가 새 비밀 생성 → 대상에 설정 → 검증 → 승격을 자동 수행한다(새 값은 검증 전까지 AWSPENDING, 승격되면 AWSCURRENT).
참고: 두 계정을 번갈아 쓰는 alternating(multi-user) 전략을 쓰면 회전 중에도 다른 하나가 유효해 무중단 회전이 된다. 가용성이 중요할 때의 선택지.
| 회전 지원 수준 | 대상 |
|---|---|
| 네이티브(관리형) 회전 | RDS, Aurora, Redshift, DocumentDB |
| 커스텀 회전 | 그 외(서드파티 API 키 등)는 Rotation Lambda 직접 작성 |
실무 활용 사례
사례 1. RDS 자격증명 자동 회전 (가장 대표적)
- RDS 마스터/앱 계정 비밀번호를 Secrets Manager가 30/60/90일마다 회전.
- 앱은 시작 시(또는 캐시 만료 시) 비밀을 조회 → 회전돼도 재배포·수동 개입 불필요.
- Lambda가 프라이빗 서브넷 RDS에 접근해야 하면 Rotation Lambda도 VPC 연결 필요(단골 함정).
사례 2. 앱에서의 조회 패턴 (성능·비용 주의)
- 매 요청마다
GetSecretValue를 부르면 지연·비용·스로틀 위험 → 클라이언트 캐싱(예: AWS Secrets Manager 캐싱 라이브러리, Lambda extension)으로 값을 캐시하고 회전 시에만 갱신.
사례 3. DR·멀티리전
- 교차 리전 복제(replica secret) 로 다른 리전에도 비밀을 복제 → 리전 장애 시/멀티리전 앱에서 그 리전의 복제본을 조회.
사례 4. 세분화·교차 계정 접근
- 리소스 정책으로 "이 비밀은 이 역할/계정만" 제한, 모든 접근은 CloudTrail에 기록되어 감사 가능.
비용 감각 (시험에서 "저렴" 판단에 사용)
- 대략 비밀당 월 $0.40 + API 호출 1만 건당 $0.05. 비밀 수가 많고 회전이 필요 없다면 Parameter Store(무료 티어) 가 유리.
Secrets Manager vs Parameter Store (아주 빈출)
| 구분 | Secrets Manager | SSM Parameter Store |
|---|---|---|
| 주 목적 | 비밀 + 자동 회전 | 설정값·비밀 저장(저비용) |
| 자동 rotation | 내장(관리형) 지원 | 기본 없음(직접 Lambda 구성) |
| 비용 | 비밀당 + 호출 과금(유료) | Standard 무료 |
| RDS 연동 회전 | 네이티브 | 없음 |
| 교차 리전 복제 | 지원 | 수동 |
| 암호화 | KMS | SecureString이 KMS |
| 언제 | 회전·RDS 연동·DR | 회전 불필요, 비용 최소 |
"automatic rotation" = Secrets Manager, "그냥 저렴하게 저장" = Parameter Store. 자세히는 parameter-store.md.
Common Wrong Directions
| 오답 방향 | 왜 부족한가 |
|---|---|
| 자동 회전이 필요한데 Parameter Store | 네이티브 rotation은 Secrets Manager |
| 비밀을 환경변수/코드에 하드코딩 | 유출·회전 불가 |
| 단순 설정값까지 전부 Secrets Manager | 회전 불필요·비용 민감이면 Parameter Store |
| 매 요청마다 GetSecretValue 호출 | 지연·스로틀 → 캐싱 |
| 프라이빗 RDS 회전 Lambda를 VPC 미연결 | Lambda를 VPC에 연결해야 접근 |
| 회전하면 앱이 잠깐 깨진다고 방치 | 가용성 중요 시 다중 사용자 회전 |
Exam Triggers
| 문제에서 이런 표현이 나오면 | 떠올릴 것 |
|---|---|
| "automatically rotate database credentials" | Secrets Manager |
| "store & rotate RDS/Aurora credentials securely" | Secrets Manager(네이티브 회전) |
| "rotate without downtime" | 다중 사용자(alternating) 회전 |
| "manage API keys with rotation & audit" | Secrets Manager + CloudTrail |
| "replicate secrets to another region" | 교차 리전 복제 |
| "cheapest storage, no rotation" | Secrets Manager 아님 → Parameter Store |
Memory Sentence
Secrets Manager는 비밀을 KMS로 암호화 저장하고 Rotation Lambda(create→set→test→finish)와 스테이징 라벨(AWSCURRENT/PENDING/PREVIOUS)로 자동 교체한다. RDS/Aurora는 네이티브 회전, 무중단은 다중 사용자 전략, 조회는 캐싱. "automatic rotation"이면 Secrets Manager, 회전 없이 저렴하면 Parameter Store.
References
댓글
아직 댓글이 없습니다.