AWS Secrets Manager
더 많은 작업
- AWS Secrets Manager; Secrets Manager
- 데이터베이스 자격 증명, API 키, OAuth 토큰 같은 비밀(시크릿)을 암호화해 저장하고, 애플리케이션이 실행 중에 가져가게 하며, 자동으로 교체해 주는 AWS 관리형 서비스
DB 암호를 소스 코드나 설정 파일, 환경 변수에 직접 넣어 두면 저장소를 볼 수 있는 사람 누구에게나 노출되고, 암호를 바꿀 때마다 애플리케이션을 다시 배포해야 한다. Secrets Manager를 쓰면 애플리케이션은 시작할 때(또는 필요할 때) API로 비밀을 읽어 오고, 암호 교체는 Secrets Manager가 DB와 비밀 값을 함께 바꾸는 방식으로 처리한다. 코드에는 비밀의 이름만 남는다.
비밀 값은 AWS KMS 키로 암호화되어 저장되고, 접근은 AWS IAM 정책과 비밀에 붙이는 리소스 정책으로 통제하며, 모든 조회는 AWS CloudTrail에 기록된다.
| 항목 | 설명 |
|---|---|
| 보안 암호(secret) | 이름, 암호화된 값(문자열 또는 JSON 키-값), 메타데이터의 묶음. 값의 최대 크기는 65,536바이트다. |
| 버전과 스테이징 레이블 | 교체 중에도 끊김이 없도록 AWSCURRENT, AWSPENDING, AWSPREVIOUS 레이블로 버전을 구분한다.
|
| 교체(rotation) | 비밀 값과 실제 DB·서비스의 자격 증명을 일정에 따라 함께 갱신하는 작업 |
| 리소스 정책 | 비밀에 붙이는 정책. 다른 계정의 주체에게 읽기를 허용할 때 쓴다. |
| 복제 | 비밀을 다른 리전에 복제해 다중 리전 애플리케이션과 재해 복구에 대비한다. 필요하면 복제본을 독립 비밀로 승격할 수 있다. |
교체 방식은 비밀을 누가 관리하느냐에 따라 나뉜다.
| 방식 | 대상 | 동작 |
|---|---|---|
| 관리형 교체 | 아마존 RDS, 아마존 Aurora, 아마존 Redshift, 아마존 DocumentDB의 마스터 사용자 자격 증명 등 | 해당 서비스가 교체를 구성·관리한다. Lambda 함수가 필요 없다. |
| Lambda 함수로 교체 | 그 밖의 DB 자격 증명, 타사 API 키 등 | 교체 일정에 맞춰 Secrets Manager가 교체용 AWS Lambda 함수를 호출한다. 함수가 새 값 생성, 대상 시스템 갱신, 테스트, 레이블 이동을 수행한다. |
| 관리형 외부 비밀 교체 | Secrets Manager 파트너 SaaS의 비밀 | 파트너 시스템의 비밀을 Lambda 없이 교체 |
- DB 비밀의 Lambda 교체 전략
- 단일 사용자: 한 사용자의 암호를 바로 바꾼다. 가장 단순하지만 교체 순간 잠시 이전 암호로 접속이 실패할 수 있다.
- 대체 사용자(alternating users): 두 사용자를 번갈아 바꾸며, 한쪽을 교체하는 동안 다른 쪽이 계속 유효하다. 교체 중 가용성이 중요할 때 쓴다.
교체 Lambda 함수가 VPC 안의 DB에 접근하려면 함수도 VPC에 붙여야 하고, Secrets Manager API에 닿을 경로(NAT 게이트웨이나 VPC 엔드포인트)가 필요하다.
import json
import boto3
client = boto3.client("secretsmanager", region_name="ap-northeast-2")
resp = client.get_secret_value(SecretId="prod/orders/db")
secret = json.loads(resp["SecretString"])
conn_user = secret["username"]
conn_password = secret["password"]
EC2, Lambda, ECS의 실행 역할에 해당 비밀에 대한 secretsmanager:GetSecretValue와 KMS 키에 대한 kms:Decrypt를 허용하면 된다. 호출 횟수를 줄이려면 클라이언트 측 캐싱을 쓴다. ECS 작업 정의에서는 비밀을 컨테이너 환경 변수로 주입하도록 참조할 수도 있다.
AWS Systems Manager Parameter Store(파라미터 스토어)는 구성 데이터와 비밀을 계층적 키-값으로 저장하는 기능이다. 값은 String, StringList, KMS로 암호화하는 SecureString으로 저장한다. /prod/web/db-endpoint처럼 경로형 이름으로 계층을 만들고, 파라미터마다 최근 100개 버전을 보관한다.
| 항목 | Parameter Store 표준 | Parameter Store 고급 | Secrets Manager |
|---|---|---|---|
| 주 용도 | 설정값, AMI ID, 엔드포인트 URL | 더 큰 값, 많은 파라미터, 만료 정책 | DB 자격 증명, API 키, OAuth 토큰 |
| 최대 값 크기 | 4KB | 8KB | 65,536바이트 |
| 최대 개수(계정·리전당) | 10,000개 | 100,000개 | 할당량 기준 |
| 암호화 | 선택(SecureString + KMS) | 선택(SecureString + KMS) | 항상(KMS) |
| 자동 교체 | 없음 | 없음(파라미터 정책으로 만료 알림만) | 있음(관리형, Lambda) |
| 교차 리전 복제 | 없음 | 없음 | 있음 |
| 다른 계정과 공유 | 지원 안 함 | 지원(공유 파라미터) | 리소스 정책으로 지원 |
| 비용 | 추가 요금 없음 | 요금 부과 | 비밀당 월 요금 + API 호출 요금 |
AWS 문서도 일반 구성값은 Parameter Store, 자격 증명처럼 교체·교차 계정 접근·세밀한 감사가 필요한 비밀은 Secrets Manager를 쓰라고 권장한다.
- "DB 자격 증명을 자동으로 교체", "하드코딩된 암호 제거 + 교체" → Secrets Manager. Parameter Store에는 자동 교체 기능이 없다.
- RDS·Aurora 마스터 사용자 암호를 Secrets Manager로 관리하면 관리형 교체가 되어 Lambda를 직접 만들 필요가 없다. 운영 부담이 가장 적다.
- 단순 설정값이나 비용을 최소화해야 하는 소량의 비밀 → Parameter Store 표준(SecureString).
- 다른 리전의 DR 환경에서도 같은 비밀을 써야 하면 Secrets Manager 복제를 쓴다.
- 다른 계정이 비밀을 읽어야 하면 비밀의 리소스 정책 + 고객 관리형 KMS 키 정책을 함께 열어야 한다.
- 암호화 키 자체는 KMS, TLS 인증서는 AWS Certificate Manager, AWS 자격 증명은 IAM 역할에 맡긴다. Secrets Manager에 액세스 키를 넣는 것은 바람직하지 않다.
- AWS Secrets Manager란 무엇인가요? – AWS
- AWS Secrets Manager 보안 암호 교체 – AWS
- Secrets Manager 할당량 – AWS
- AWS Systems Manager Parameter Store – AWS
- 표준 및 고급 파라미터 티어 관리 – AWS