AWS KMS를 활용한 Sealed Secret 키 관리

Kubernetes 클러스터에서 민감한 데이터를 안전하게 관리하기 위해 Sealed Secret은 강력한 도구입니다. 그러나 Sealed Secret의 핵심인 Private key
를 안전하게 보관하는 것은 매우 중요합니다. 이 글에서는 AWS KMS(Key Management Service)를 사용해 Sealed Secret의 키를 저장하고 복원하는 과정을 다룹니다.
Sealed Secret 소개 #
Sealed Secret은 Kubernetes Secret을 안전하게 암호화하여 GitOps와 같은 워크플로에 사용할 수 있게 해줍니다.
- 주요 특징:
- 암호화된 Secret 관리: Sealed Secret은 클라이언트 측에서 데이터를 암호화하여 암호화된 Secret YAML을 생성합니다.
- GitOps 친화적: Git에 안전하게 암호화된 상태로 저장할 수 있습니다.
- 보안 강화:
Private key
는 클러스터 외부에 노출되지 않습니다.
AWS KMS란? #
AWS KMS(Key Management Service)는 암호화 키를 생성, 저장 및 관리할 수 있는 클라우드 서비스입니다.
- 주요 장점:
- 안전한 키 저장: AWS에서 제공하는 보안 환경에서 키를 보호합니다.
- 세분화된 접근 제어: IAM 역할과 정책으로 키 사용 권한을 설정합니다.
- 키 로테이션: 키를 주기적으로 교체하여 보안을 강화할 수 있습니다.
Sealed Secret 설치 및 기본 키 확인 #
Sealed Secret 컨트롤러 설치
먼저 Sealed Secret 컨트롤러를 Kubernetes 클러스터에 설치합니다.
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.21.0/controller.yaml
설치가 완료되면 kube-system
네임스페이스에 Sealed Secret 컨트롤러가 생성됩니다.
기본 키 확인
설치 후 컨트롤러는 기본 RSA 키를 생성합니다. 이를 확인하려면:
kubectl get secret -n kube-system sealed-secrets-key -o yaml
메인키를 로컬로 저장
메인키를 추출하여 로컬에 저장합니다.
kubectl get secret -n kube-system sealed-secrets-key -o jsonpath="{.data.tls\\.crt}" | base64 -d > tls.crt
kubectl get secret -n kube-system sealed-secrets-key -o jsonpath="{.data.tls\\.key}" | base64 -d > tls.key
tls.crt
: Public key (암호화에 사용)tls.key
: Private key (복호화에 사용)
AWS KMS에 키 저장 #
AWS KMS 키 생성
AWS KMS 콘솔 또는 CLI를 사용하여 새로운 키를 생성합니다.
aws kms create-key \
--description "Sealed Secret Private Key" \
--key-usage ENCRYPT_DECRYPT \
--origin AWS_KMS
명령이 완료되면 출력된 JSON에서 KeyId
값을 기록해 둡니다. 이 값은 KMS 키를 참조할 때 필요합니다.
Private Key를 KMS에 암호화
로컬에 저장된 tls.key
를 AWS KMS를 사용해 암호화합니다.
aws kms encrypt \
--key-id <KMS_KEY_ID> \
--plaintext fileb://tls.key \
--output text \
--query CiphertextBlob > encrypted_tls.key
<KMS_KEY_ID>
: 앞서 생성한 KMS 키의 ID.encrypted_tls.key
: 암호화된Private key
파일입니다.
Encrypted Key S3에 백업 (선택 사항)
암호화된 키를 S3 버킷에 안전하게 백업합니다.
aws s3 cp encrypted_tls.key s3://<YOUR_BUCKET_NAME>/sealed-secrets/encrypted_tls.key
S3 버킷에 접근 제어 정책을 설정하여 불필요한 접근을 방지하세요.
AWS KMS를 통한 키 복원 및 적용 #
AWS KMS에서 키 복호화
KMS에 저장된 암호화 키를 복호화하여 로컬에 복원합니다.
aws kms decrypt \
--ciphertext-blob fileb://encrypted_tls.key \
--output text \
--query Plaintext | base64 -d > tls.key
복호화된 키는 tls.key
파일로 저장됩니다.
Sealed Secret에 키 적용
복호화한 private key와 기존 public key를 사용해 새로운 Secret을 생성합니다.
kubectl create secret tls sealed-secrets-key \
--cert=tls.crt \
--key=tls.key \
-n kube-system
Sealed Secret 컨트롤러 재배포
Secret을 재적용한 후 Sealed Secret 컨트롤러를 재시작합니다.
kubectl delete pod -n kube-system -l name=sealed-secrets-controller
보안 모범 사례 #
-
IAM 정책 설정 KMS 키에 접근할 수 있는 IAM 사용자와 역할을 최소화합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<ACCOUNT_ID>:role/<ROLE_NAME>" }, "Action": "kms:*", "Resource": "<KMS_KEY_ARN>" } ] }
-
키 로테이션 KMS에서 키 로테이션 기능을 활성화하여 주기적으로 키를 교체합니다.
aws kms enable-key-rotation --key-id <KMS_KEY_ID>
-
주기적인 테스트 복원 과정을 주기적으로 테스트하여 비상 상황에서도 키를 복원할 수 있는지 확인하세요.
-
S3 버킷 접근 제어 S3 버킷에 저장된 암호화 키는 반드시 접근 제어 정책을 적용하세요.
-
Sealed Secret 키 공유 금지
Private key
는 절대 공유하거나 공용 저장소에 업로드하지 말아야 합니다.
결론 #
AWS KMS를 활용하면 Sealed Secret의 Private key
를 안전하게 관리하고 복구할 수있습니다.
또한, Terraform, Crossplane같은 IaC에서도 KMS 서비스를 이용하여 완전 자동화를 만들 수도 있습니다.
이 가이드를 통해 클러스터 보안을 강화하고 안정적인 운영 환경을 구축할 수 있기를 바랍니다.