AWS Certified Developer - Associate (DVA-C02) #8 Domain 2-2 보안: 암호화와 시크릿
#7 인증과 인가에서 “누가 접근하는가"를 정리했으니, 이번에는 데이터와 비밀값 자체를 어떻게 보호하는가입니다. DVA의 암호화는 “비밀번호,API 키,DB 자격 증명을 코드와 환경변수에 평문으로 두지 않는다"는 한 가지 원칙으로 압축됩니다.
KMS: 키 관리 #
**Key Management Service(KMS)**는 암호화 키를 만들고 관리하는 서비스입니다. 대부분의 AWS 서비스가 KMS와 통합돼 저장 데이터를 암호화합니다.
| 키 종류 | 관리 주체 | 특징 |
|---|---|---|
| AWS 관리형 키 | AWS | 서비스가 자동 생성,관리(aws/s3 등). 무료 |
| 고객 관리형 키(CMK) | 사용자 | 키 정책,교체,삭제를 직접 통제. 감사,세밀한 제어 |
| AWS 소유 키 | AWS | 여러 계정이 공유, 보이지 않음 |
고객 관리형 키는 키 정책으로 누가 키를 쓸 수 있는지 통제하고, CloudTrail로 키 사용을 감사하며, 자동 회전(연 1회)을 켤 수 있습니다. “누가 언제 데이터를 복호화했는지 감사해야 한다"의 답은 고객 관리형 키(또는 SSE-KMS)입니다.
봉투 암호화(Envelope Encryption) #
KMS로 대용량 데이터를 직접 암호화하지 않습니다. KMS API는 4KB까지만 직접 암호화하기 때문입니다. 대신 봉투 암호화를 씁니다.
- KMS에
GenerateDataKey를 요청해 데이터 키를 받습니다(평문 + 암호화본 한 쌍). - 평문 데이터 키로 실제 데이터를 로컬에서 암호화합니다.
- 평문 데이터 키는 메모리에서 지우고, 암호화된 데이터 키를 데이터 옆에 저장합니다.
- 복호화 때는 암호화된 데이터 키를 KMS에 보내
Decrypt로 평문 키를 받아 데이터를 풉니다.
봉투 암호화의 요점: KMS는 작은 데이터 키만 다루고, 큰 데이터는 그 데이터 키로 로컬에서 암호화합니다. 대용량 암호화 문항에서 “KMS로 직접 암호화"는 보통 오답입니다.
at rest vs in transit #
- at rest(저장 데이터). S3,EBS,RDS,DynamoDB의 저장 암호화. 대개 KMS 통합.
- in transit(전송 데이터). TLS/SSL. ACM(Certificate Manager)으로 인증서를 발급,관리.
S3 서버 측 암호화 #
S3 저장 암호화 옵션은 시험 단골입니다.
| 옵션 | 키 관리 | 특징 |
|---|---|---|
| SSE-S3 | S3가 관리(AES-256) | 가장 단순. 기본값 |
| SSE-KMS | KMS 키 | 사용 감사(CloudTrail),키 정책 제어. 키별 권한 |
| SSE-C | 고객이 키 제공 | 고객이 키를 직접 전달, AWS는 저장 안 함 |
| 클라이언트 측 암호화 | 고객이 업로드 전 암호화 | AWS는 암호문만 봄 |
“누가 복호화했는지 감사"가 필요하면 SSE-KMS, 단순하면 SSE-S3, 키를 AWS에 절대 맡기지 않으려면 SSE-C 또는 클라이언트 측 암호화입니다.
Lambda 환경변수 암호화 #
#2에서 본 대로 환경변수는 저장 시 암호화됩니다. 더 강한 보호가 필요하면 KMS 고객 관리형 키로 암호화하고, 전송 중 노출을 막기 위해 “전송 중 암호화 헬퍼"로 배포 시점에 암호화할 수 있습니다. 다만 민감한 비밀값은 환경변수 대신 Secrets Manager,Parameter Store에서 런타임에 읽는 것이 권장입니다.
Secrets Manager vs Parameter Store #
비밀값,설정값을 코드 밖에 두는 두 서비스의 차이는 반드시 외워야 합니다.
| 구분 | Secrets Manager | Parameter Store(SSM) |
|---|---|---|
| 주 용도 | 비밀값(DB 자격 증명, API 키) | 설정값 + 비밀값(SecureString) |
| 자동 회전 | 내장(RDS 등과 통합) | 없음(직접 Lambda 구현 필요) |
| 비용 | 비밀당 유료 | 표준 파라미터 무료, Advanced 유료 |
| 크기,계층 | 비밀 중심 | 계층형 경로(/app/db/host) |
| 통합 | 교차 서비스 자동 회전 | 단순 저장,조회 |
핵심 결정: 자동 회전(rotation)이 필요하면 Secrets Manager, 단순 설정값이거나 비용이 중요하면 Parameter Store입니다. “RDS 자격 증명을 주기적으로 자동 회전"의 답은 Secrets Manager입니다. “비용 없이 설정값을 계층적으로 저장"의 답은 Parameter Store 표준 파라미터입니다.
Parameter Store는 Secrets Manager의 비밀과 KMS 키도 참조할 수 있어 둘을 함께 쓰기도 합니다. 하지만 “자동 회전 내장"은 Secrets Manager만의 기능입니다.
시험 출제 패턴 #
- “DB 자격 증명을 주기적으로 자동 회전.” → Secrets Manager.
- “설정값을 무료로 계층적으로 저장,조회.” → Parameter Store 표준 파라미터.
- “비밀번호를 Lambda에 어떻게 줄까.” → Secrets Manager/Parameter Store에서 런타임 조회(환경변수 평문 아님).
- “누가 S3 객체를 복호화했는지 감사.” → SSE-KMS.
- “대용량 파일을 KMS로 암호화하려 한다.” → 봉투 암호화(데이터 키 사용).
- “키를 AWS에 절대 저장하지 않고 S3 암호화.” → SSE-C 또는 클라이언트 측 암호화.
- “전송 중 암호화 인증서를 관리.” → ACM.
자주 만나는 함정 #
1) Parameter Store에 자동 회전이 있다고 오해 #
자동 회전 내장은 Secrets Manager입니다. Parameter Store는 직접 구현해야 합니다.
2) KMS로 대용량 직접 암호화 #
KMS 직접 암호화는 4KB 한도입니다. 큰 데이터는 봉투 암호화입니다.
3) 비밀을 환경변수 평문으로 #
환경변수는 암호화되더라도, 민감 비밀은 시크릿 저장소에서 읽는 것이 권장입니다.
정리 #
이번 글에서 잡은 것:
- KMS. AWS 관리형 vs 고객 관리형(감사,제어). 직접 암호화는 4KB 한도
- 봉투 암호화. KMS 데이터 키로 큰 데이터를 로컬 암호화
- SSE-KMS는 복호화 감사 가능, SSE-S3는 단순, SSE-C는 고객 키
- Secrets Manager(자동 회전 내장) vs Parameter Store(무료,계층,회전 없음)
- 비밀은 코드,환경변수 평문이 아니라 시크릿 저장소에서 런타임 조회
다음: Domain 3-1 CI/CD #
보안을 마쳤습니다. 다음은 24%를 차지하는 배포입니다. #9 CI/CD에서는 CodeCommit,CodeBuild,CodeDeploy,CodePipeline,CodeArtifact의 역할 분담과 buildspec.yml,appspec.yml, 그리고 파이프라인 구성을 정리하겠습니다.