기존 클러스터에서 KMS로 Kubernetes 시크릿 암호화하기

기존 클러스터에서 KMS로 Kubernetes 시크릿 암호화하기

중요

사용 중단 공지: 이 절차는 더 이상 사용되지 않으며 Kubernetes 1.27 이하 버전을 실행하는 EKS 클러스터에만 적용돼요. Kubernetes 1.28 이상을 실행 중이라면 Amazon EKS가 기본적으로 봉투 암호화(envelope encryption)로 Kubernetes 시크릿을 보호해요. 자세한 내용은 모든 Kubernetes API 데이터의 기본 봉투 암호화를 참고하세요.

시크릿 암호화를 활성화하면 Kubernetes 시크릿이 선택한 AWS KMS 키로 암호화돼요. KMS 키는 다음 조건을 충족해야 해요.

  • 대칭(symmetric) 키
  • 데이터를 암호화하고 복호화할 수 있어야 함
  • 클러스터와 같은 AWS 리전에서 생성되어야 함

KMS 키가 다른 계정에서 생성되었다면 IAM 보안 주체가 KMS 키에 접근할 수 있어야 해요. 자세한 내용은 AWS Key Management Service 개발자 가이드의 Allowing IAM principals in other accounts to use a KMS key를 참고하세요.

경고

시크릿 암호화를 활성화한 뒤에는 비활성화할 수 없어요. 이 작업은 되돌릴 수 없어요.

출처: 문서

본문

eksctl

이 절차는 Kubernetes 1.27 이하 버전을 실행하는 EKS 클러스터에만 적용돼요. 자세한 내용은 모든 Kubernetes API 데이터의 기본 봉투 암호화를 참고하세요.

다음 두 가지 방법으로 암호화를 활성화할 수 있어요.

단일 명령으로 클러스터에 암호화 추가하기

시크릿을 자동으로 다시 암호화하려면 다음 명령을 실행하세요.

eksctl utils enable-secrets-encryption \
    --cluster my-cluster \
    --key-arn arn:aws:kms:region-code:account:key/key

시크릿 자동 재암호화를 선택하지 않으려면 다음 명령을 실행하세요.

eksctl utils enable-secrets-encryption \
    --cluster my-cluster \
    --key-arn arn:aws:kms:region-code:account:key/key \
    --encrypt-existing-secrets=false

kms-cluster.yaml 파일로 클러스터에 암호화 추가하기

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: my-cluster
  region: region-code

secretsEncryption:
  keyARN: arn:aws:kms:region-code:account:key/key

시크릿이 자동으로 재암호화되도록 하려면 다음 명령을 실행하세요.

eksctl utils enable-secrets-encryption -f kms-cluster.yaml

시크릿 자동 재암호화를 선택하지 않으려면 다음 명령을 실행하세요.

eksctl utils enable-secrets-encryption -f kms-cluster.yaml --encrypt-existing-secrets=false

AWS Management Console

이 절차는 Kubernetes 1.27 이하 버전을 실행하는 EKS 클러스터에만 적용돼요. 자세한 내용은 모든 Kubernetes API 데이터의 기본 봉투 암호화를 참고하세요.

  1. Amazon EKS 콘솔을 엽니다.
  2. KMS 암호화를 추가할 클러스터를 선택합니다.
  3. Overview 탭(기본 선택됨)을 선택합니다.
  4. Secrets encryption 섹션까지 아래로 스크롤한 다음 Enable을 선택합니다.
  5. 드롭다운 목록에서 키를 선택하고 Enable 버튼을 선택합니다. 나열된 키가 없으면 먼저 키를 만들어야 해요. 자세한 내용은 키 생성을 참고하세요.
  6. 선택한 키를 사용하려면 Confirm 버튼을 선택합니다.

AWS CLI

이 절차는 Kubernetes 1.27 이하 버전을 실행하는 EKS 클러스터에만 적용돼요. 자세한 내용은 모든 Kubernetes API 데이터의 기본 봉투 암호화를 참고하세요.

다음 AWS CLI 명령으로 시크릿 암호화 구성을 클러스터와 연결하세요. 예시 값을 자신의 값으로 바꾸세요.

aws eks associate-encryption-config \
    --cluster-name my-cluster \
    --encryption-config '[{"resources":["secrets"],"provider":{"keyArn":"arn:aws:kms:region-code:account:key/key"}}]'

출력 예시는 다음과 같아요.

{
  "update": {
    "id": "3141b835-8103-423a-8e68-12c2521ffa4d",
    "status": "InProgress",
    "type": "AssociateEncryptionConfig",
    "params": [
      {
        "type": "EncryptionConfig",
        "value": "[{\"resources\":[\"secrets\"],\"provider\":{\"keyArn\":\"arn:aws:kms:region-code:account:key/key\"}}]"
      }
    ],
    "createdAt": 1613754188.734,
    "errors": []
  }
}

다음 명령으로 암호화 업데이트 상태를 모니터링할 수 있어요. 이전 출력에서 반환된 특정 cluster name과 update ID를 사용하세요. Successful 상태가 표시되면 업데이트가 완료된 거예요.

aws eks describe-update \
    --region region-code \
    --name my-cluster \
    --update-id 3141b835-8103-423a-8e68-12c2521ffa4d

출력 예시는 다음과 같아요.

{
  "update": {
    "id": "3141b835-8103-423a-8e68-12c2521ffa4d",
    "status": "Successful",
    "type": "AssociateEncryptionConfig",
    "params": [
      {
        "type": "EncryptionConfig",
        "value": "[{\"resources\":[\"secrets\"],\"provider\":{\"keyArn\":\"arn:aws:kms:region-code:account:key/key\"}}]"
      }
    ],
    "createdAt": 1613754188.734,
    "errors": []
  }
}

클러스터에서 암호화가 활성화되었는지 확인하려면 describe-cluster 명령을 실행하세요. 응답에 EncryptionConfig 문자열이 포함되어 있어요.

aws eks describe-cluster --region region-code --name my-cluster

클러스터에서 암호화를 활성화한 뒤에는 모든 기존 시크릿을 새 키로 암호화해야 해요.

참고

eksctl을 사용한다면 다음 명령은 시크릿 자동 재암호화를 선택하지 않은 경우에만 필요해요.

kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - kms-encryption-timestamp="time value"

경고

기존 클러스터에 시크릿 암호화를 활성화한 뒤 사용하는 KMS 키가 삭제되면 클러스터를 복구할 방법이 없어요. KMS 키를 삭제하면 클러스터가 영구적으로 저하(degrated)된 상태가 돼요. 자세한 내용은 AWS KMS 키 삭제를 참고하세요.

참고

기본적으로 create-key 명령은 AWS KMS 작업과 리소스에 계정 루트 관리자 접근 권한을 부여하는 키 정책으로 대칭 암호화 KMS 키를 만들어요. 권한 범위를 줄이려면 create-cluster API를 호출하는 보안 주체의 정책에 kms:DescribeKey와 kms:CreateGrant 작업이 허용되어 있는지 확인하세요.

KMS 봉투 암호화를 사용하는 클러스터에는 kms:CreateGrant 권한이 필요해요. kms:GrantIsForAWSResource 조건은 CreateCluster 작업에서 지원되지 않으므로, CreateCluster를 수행하는 사용자의 kms:CreateGrant 권한을 제어하는 데 KMS 정책에서 사용하지 말아야 해요.

더 알아보기 (Learn more)