AmberAx

AWS KMS를 활용한 Sealed Secret 키 관리

· 3 min read
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 서비스를 이용하여 완전 자동화를 만들 수도 있습니다. 이 가이드를 통해 클러스터 보안을 강화하고 안정적인 운영 환경을 구축할 수 있기를 바랍니다.

Did you find this post helpful?
Share it with others!