고객 관리 암호화 키(CMEK) 사용


이 페이지에서는 Google Kubernetes Engine(GKE)에서 고객 관리 암호화 키(CMEK)를 사용하는 방법을 설명합니다. 키 관리 방식을 제어해야 하는 경우 Cloud Key Management Service 및 CMEK를 사용하여 GKE 클러스터의 Persistent Disk 및 커스텀 부팅 디스크를 보호할 수 있습니다.

개요

기본적으로 Google Cloud는 미사용 고객 콘텐츠를 암호화하고 GKE는 사용자의 별도 조치 없이도 암호화를 자동으로 관리합니다.

암호화 키 순환을 직접 제어하고 관리하려면 CMEK를 사용하면 됩니다. 이러한 키는 사용자의 데이터를 암호화하는 데이터 암호화 키를 암호화합니다. 자세한 내용은 키 관리를 참조하세요.

자신이 관리하는 키를 사용하여 클러스터의 보안 비밀을 암호화할 수도 있습니다. 자세한 내용은 애플리케이션 레이어 보안 비밀 암호화를 참조하세요.

GKE에서 CMEK는 노드 부팅 디스크와 연결된 디스크라는 두 가지 스토리지 디스크의 데이터를 보호할 수 있습니다.

노드 부팅 디스크
노드 부팅 디스크는 클러스터 노드 풀의 일부입니다. 클러스터 및 노드 풀을 만들 때 CMEK로 암호화된 노드 부팅 디스크를 만들 수 있습니다.
연결된 디스크
연결된 디스크는 pod에서 지속형 스토리지로 사용하는 PersistentVolume입니다. CMEK로 암호화된 연결형 영구 디스크는 GKE에서 동적으로 프로비저닝된 PersistentVolume으로 사용할 수 있습니다.

스토리지 디스크에 대한 자세한 내용은 스토리지 옵션을 참조하세요. GKE 제어 영역에 사용되는 제어 영역 디스크는 CMEK로 보호할 수 없습니다.

시작하기 전에

  1. 이 주제의 연습을 수행하려면 다음 2개의 Google Cloud 프로젝트가 필요합니다.

    • 키 프로젝트: 암호화 키를 만들 프로젝트입니다.

    • 클러스터 프로젝트: CMEK를 사용 설정하는 클러스터를 만들 프로젝트입니다.

  2. 키 프로젝트에서 Cloud KMS API가 사용 설정되었는지 확인합니다.

    Cloud KMS API 사용 설정

  3. 키 프로젝트에서 키링과 키를 생성하는 사용자는 다음과 같은 IAM 권한이 필요합니다.

    • cloudkms.keyRings.getIamPolicy
    • cloudkms.keyRings.setIamPolicy

    이러한 권한은 사전 정의된 roles/cloudkms.admin Identity and Access Management에 부여됩니다. Cloud KMS 문서에서 키를 관리할 권한을 부여하는 방법에 대해 자세히 알아볼 수 있습니다.

  4. 클러스터 프로젝트에서 Cloud KMS API가 사용 설정되었는지 확인합니다.

    Cloud KMS API 사용 설정

  5. gcloud CLI가 설치되었는지 확인합니다.

  6. gcloud를 최신 버전으로 업데이트합니다.

    gcloud components update
    

Cloud KMS 키 만들기

노드 부팅 디스크 또는 연결된 디스크를 CMEK로 보호하려면 먼저 Cloud KMS 키링과 키가 필요합니다.

키링과 키 요구사항은 다음과 같습니다.

  • 키는 대칭 암호화를 사용해야 합니다.

  • 키를 사용하려면 GKE 서비스 계정 권한을 부여해야 합니다.

  • 키링에 GKE 클러스터의 위치와 일치하는 위치가 있어야 합니다.

    • 영역 클러스터는 상위 집합 위치의 키링을 사용합니다. 예를 들어 us-central1-a 영역의 클러스터는 us-central1 리전의 키만 사용할 수 있습니다.

    • 리전 클러스터는 동일한 위치의 키링을 사용합니다. 예를 들어 asia-northeast1 리전의 클러스터는 asia-northeast1 리전의 키링으로 보호되어야 합니다.

    • Cloud KMS global 리전은 GKE에서 사용하도록 지원되지 않습니다.

키링과 키를 만드는 자세한 방법은 대칭 키 만들기를 참조하세요.

키 사용 권한 부여

클러스터의 노드에서 사용하는 Compute Engine 서비스 계정에 Cloud KMS CryptoKey 암호화/복호화 역할을 할당해야 합니다. 이는 GKE Persistent Disk가 암호화 키에 액세스하고 사용하는 데 필요합니다.

Compute Engine 서비스 계정 이름의 형식은 다음과 같습니다.

service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com

PROJECT_NUMBER를 클러스터의 프로젝트 번호로 바꿉니다.

서비스 계정에 액세스 권한을 부여하려면 gcloud 명령어 또는 Google Cloud Console을 사용하면 됩니다.

gcloud

Compute Engine 서비스 계정에 Cloud KMS CryptoKey 암호화/복호화 역할을 부여합니다.

gcloud kms keys add-iam-policy-binding KEY_NAME \
    --location LOCATION \
    --keyring RING_NAME \
    --member serviceAccount:SERVICE_ACCOUNT \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
    --project KEY_PROJECT_ID

다음을 바꿉니다.

  • KEY_NAME: 키의 이름입니다.
  • LOCATION: 키링을 만든 리전입니다.
  • RING_NAME: 키링의 이름입니다.
  • SERVICE_ACCOUNT: Compute Engine 서비스 계정의 이름입니다.
  • KEY_PROJECT_ID: 키 프로젝트 ID입니다.

콘솔

Compute Engine 서비스 계정에 Cloud KMS CryptoKey 암호화/복호화 역할을 부여합니다.

  1. Google Cloud Console에서 Cloud Key Management Service 키 브라우저를 엽니다.
    Cloud KMS 키 브라우저 열기
  2. 원하는 키가 포함된 키링의 이름을 클릭합니다.

  3. 원하는 키의 체크박스를 선택합니다.

    오른쪽 창의 권한 탭이 활성화됩니다.

  4. 구성원 추가 대화상자에서 액세스 권한을 부여할 Compute Engine 서비스 계정의 이메일 주소를 지정합니다.

  5. 역할 선택 드롭다운에서 Cloud KMS CryptoKey Encrypter/Decrypter를 선택합니다.

  6. 저장을 클릭합니다.

CMEK로 보호되는 노드 부팅 디스크 사용

이 섹션에서는 CMEK로 보호되는 부팅 디스크를 사용하여 새 클러스터 또는 노드 풀을 만듭니다.

기존 클러스터 또는 노드 풀의 부팅 디스크 유형은 변경할 수 없으므로 기존 클러스터에서 노드 부팅 디스크에 고객 관리 암호화를 사용 설정할 수 없습니다. 그러나 고객 관리 암호화가 사용 설정된 클러스터의 새 노드 풀을 만들고 이전 노드 풀을 삭제할 수는 있습니다.

또한 기존 클러스터 또는 기존 노드 풀의 노드 부팅 디스크에 대한 고객 관리 암호화를 사용 중지할 수도 없습니다. 그러나 고객 관리 암호화가 사용 중지된 클러스터의 새 노드 풀을 만들고 이전 노드 풀을 삭제할 수는 있습니다.

CMEK로 보호되는 노드 부팅 디스크로 클러스터 만들기

gcloud CLI 또는 Google Cloud Console을 사용하여 CMEK로 보호되는 노드 부팅 디스크로 클러스터를 만들 수 있습니다.

표준 클러스터의 경우 표준 영구 디스크(pd-standard) 또는 SSD 영구 디스크(pd-ssd)만 CMEK 키로 암호화할 수 있습니다.

gcloud

부팅 디스크가 CMEK 키로 암호화된 클러스터를 만들려면 클러스터 생성 명령어에 --boot-disk-kms-key 매개변수 값을 지정합니다.

표준 클러스터 만들기

부팅 디스크가 CMEK 키로 암호화된 표준 클러스터를 만들려면 다음 명령어를 사용합니다.

gcloud container clusters create CLUSTER_NAME \
    --cluster-version=latest \
    --region COMPUTE_REGION \
    --boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project CLUSTER_PROJECT_ID \
    --disk-type DISK_TYPE

Autopilot 클러스터 만들기

부팅 디스크가 CMEK 키로 암호화된 Autopilot 클러스터를 만들려면 다음 명령어를 사용합니다.

gcloud container clusters create-auto CLUSTER_NAME \
    --cluster-version=latest \
    --region COMPUTE_REGION \
    --boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project CLUSTER_PROJECT_ID

다음을 바꿉니다.

  • CLUSTER_NAME: 새 클러스터의 이름입니다.
  • COMPUTE_REGION: 클러스터 제어 영역의 컴퓨팅 리전입니다.
  • KEY_PROJECT_ID: 키 프로젝트 ID입니다.
  • LOCATION: 키링의 위치입니다.
  • RING_NAME: 키링의 이름입니다.
  • KEY_NAME: 키의 이름입니다.
  • CLUSTER_PROJECT_ID는 클러스터 프로젝트 ID입니다.
  • DISK_TYPE: pd-standard(기본값) 또는 pd-ssd입니다.

콘솔

표준 클러스터 만들기

부팅 디스크가 CMEK 키로 암호화된 표준 클러스터를 만들려면 다음 단계를 수행하세요.

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 만들기를 클릭합니다.

  3. 표준 섹션에서 구성을 클릭합니다.

  4. 원하는 대로 클러스터를 구성합니다.

  5. 탐색창의 노드 풀에서 노드를 클릭합니다.

  6. 부팅 디스크 유형 드롭다운 목록에서 표준 영구 디스크 또는 SSD 영구 디스크를 선택합니다.

  7. 부팅 디스크에 고객 관리 암호화 사용 설정 체크박스를 선택하고 위에서 만든 Cloud KMS 암호화 키를 선택합니다.

  8. 만들기를 클릭합니다.

Autopilot 클러스터 만들기

부팅 디스크가 CMEK 키로 암호화된 Autopilot 클러스터를 만들려면 다음 단계를 수행하세요.

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 만들기를 클릭합니다.

  3. Autopilot 섹션에서 구성을 클릭합니다.

  4. 원하는 대로 클러스터를 구성합니다.

  5. 고급 옵션 섹션을 펼쳐서 보안 옵션을 찾습니다.

  6. 부팅 디스크에 고객 관리 암호화 사용 설정 체크박스를 선택하고 위에서 만든 Cloud KMS 암호화 키를 선택합니다.

  7. 만들기를 클릭합니다.

CMEK로 보호되는 노드 부팅 디스크로 새 노드 풀 만들기

기존 표준 클러스터에 CMEK가 사용 설정된 새 노드 풀을 만들려면 gcloud CLI 또는 Google Cloud Console을 사용하면 됩니다.

gcloud

노드 부팅 디스크에 대한 고객 관리 암호화를 사용하여 노드 풀을 만들려면 생성 명령어의 --boot-disk-kms-key 매개변수에 값을 지정합니다.

gcloud container node-pools create NODE_POOL_NAME \
    --region COMPUTE_REGION \
    --disk-type DISK_TYPE \
    --boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project CLUSTER_PROJECT_ID \
    --cluster CLUSTER_NAME

다음을 바꿉니다.

  • NODE_POOL_NAME: 노드 풀에 대해 선택한 이름입니다.
  • COMPUTE_REGION: 클러스터 제어 영역의 컴퓨팅 리전입니다.
  • DISK_TYPE: pd-standard(기본값) 또는 pd-ssd입니다.
  • KEY_PROJECT_ID: 키 프로젝트 ID입니다.
  • LOCATION: 키링의 위치입니다.
  • RING_NAME: 키링의 이름입니다.
  • KEY_NAME: 키의 이름입니다.
  • CLUSTER_PROJECT_ID: 클러스터 프로젝트 ID입니다.
  • CLUSTER_NAME: 이전 단계에서 만든 표준 클러스터의 이름입니다.

콘솔

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 클러스터 목록에서 수정하려는 클러스터 이름을 클릭합니다.

  3. 노드 풀 추가를 클릭합니다.

  4. 탐색창에서 노드를 클릭합니다.

  5. 머신 구성 섹션에서 부팅 디스크 유형표준 영구 디스크 또는 SSD 영구 디스크로 선택합니다.

  6. 부팅 디스크에 고객 관리 암호화 사용 설정 체크박스를 선택하고 생성해 둔 Cloud KMS 암호화 키를 선택합니다.

  7. 만들기를 클릭합니다.

CMEK로 보호되는 Filestore 인스턴스 또는 영구 디스크 사용

다음 정보는 새로 생성된 Filestore 인스턴스 또는 영구 디스크를 암호화하는 방법을 설명합니다. 새 Cloud KMS 키 또는 기존 Cloud KMS 키를 사용하여 새 클러스터나 기존 클러스터에서 CMEK를 사용 설정할 수 있습니다.

이러한 안내는 GKE 클러스터당 한 번만 수행해야 합니다.

Cloud KMS 키를 참조하는 StorageClass 만들기

  1. 다음 콘텐츠를 cmek-sc.yaml이라는 YAML 파일에 복사합니다. 이 구성을 사용 설정하면 암호화된 볼륨을 동적으로 프로비저닝할 수 있습니다.

    Filestore 인스턴스

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-filestore-cmek
    provisioner: filestore.csi.storage.gke.io
    allowVolumeExpansion: true
    parameters:
      tier: enterprise
      instance-encryption-kms-key: projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
    
    • instance-encryption-kms-key 필드는 새 Filestore 디스크를 암호화하는 데 사용할 키의 정규화된 리소스 식별자여야 합니다.
    • instance-encryption-kms-key 값은 대소문자를 구분합니다(예: keyRingscryptoKeys). 잘못된 값으로 새 볼륨을 프로비저닝하면 invalidResourceUsage 오류가 발생합니다.
    • 기존 StorageClass 객체에 instance-encryption-kms-key 매개변수를 추가할 수 없습니다. 그러나 StorageClass 객체를 삭제하고 동일한 이름과 다른 매개변수 집합을 사용하여 다시 만들 수 있습니다.

    영구 디스크

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-gce-pd-cmek
    provisioner: pd.csi.storage.gke.io
    volumeBindingMode: "WaitForFirstConsumer"
    allowVolumeExpansion: true
    parameters:
      type: pd-standard
      disk-encryption-kms-key: projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
    
    • disk-encryption-kms-key 필드는 새 디스크를 암호화하는 데 사용할 키의 정규화된 리소스 식별자여야 합니다.
    • disk-encryption-kms-key 값은 대소문자를 구분합니다(예: keyRingscryptoKeys). 잘못된 값으로 새 볼륨을 프로비저닝하면 invalidResourceUsage 오류가 발생합니다.
    • 기존 StorageClass 객체에 disk-encryption-kms-key 매개변수를 추가할 수 없습니다. 그러나 StorageClass 객체를 삭제하고 동일한 이름과 다른 매개변수 집합을 사용하여 다시 만들 수 있습니다. 기존 클래스의 프로비저닝 도구가 pd.csi.storage.gke.io인지 확인합니다.

    StorageClass를 기본값으로 설정할 수 있습니다.

  2. kubectl을 사용하여 GKE 클러스터에서 StorageClass를 배포합니다.

    kubectl apply -f cmek-sc.yaml
    
  3. StorageClass가 Compute Engine Filestore 또는 Persistent Disk CSI 드라이버를 사용했으며 키의 ID를 포함하는지 확인합니다.

    Filestore 인스턴스

    kubectl describe storageclass csi-filestore-cmek
    

    명령어의 출력에서 다음을 확인합니다.

    • 프로비저닝 도구가 filestore.csi.storage.gke.io로 설정됩니다.
    • 키의 ID는 instance-encryption-kms-key를 따릅니다.
    Name:                  csi-filestore-cmek
    IsDefaultClass:        No
    Annotations:           None
    Provisioner:           filestore.csi.storage.gke.io
    Parameters:            instance-encryption-kms-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME,type=pd-standard
    AllowVolumeExpansion:  true
    MountOptions:          none
    ReclaimPolicy:         Delete
    VolumeBindingMode:     WaitForFirstConsumer
    Events:                none
    

    영구 디스크

    kubectl describe storageclass csi-gce-pd-cmek
    

    명령어의 출력에서 다음을 확인합니다.

    • 준비자가 pd.csi.storage.gke.io로 설정되어 있습니다.
    • disk-encryption-kms-key 다음에 키의 ID가 나옵니다.
    Name:                  csi-gce-pd-cmek
    IsDefaultClass:        No
    Annotations:           None
    Provisioner:           pd.csi.storage.gke.io
    Parameters:            disk-encryption-kms-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME,type=pd-standard
    AllowVolumeExpansion:  unset
    MountOptions:          none
    ReclaimPolicy:         Delete
    VolumeBindingMode:     WaitForFirstConsumer
    Events:                none
    

GKE에서 암호화된 스토리지 볼륨 만들기

이 섹션에서는 새 StorageClass 및 Cloud KMS 키를 사용하여 암호화된 Kubernetes 스토리지 볼륨을 동적으로 프로비저닝합니다.

  1. 다음 콘텐츠를 pvc.yaml이라는 새 파일에 복사하고 storageClassName 값이 StorageClass 객체의 이름과 일치하는지 확인합니다.

    Filestore 인스턴스

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: csi-filestore-cmek
      resources:
        requests:
          storage: 1Ti
    

    영구 디스크

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: csi-gce-pd-cmek
      resources:
        requests:
          storage: 6Gi
    
  2. GKE 클러스터에 PersistentVolumeClaim(PVC)을 적용합니다.

    kubectl apply -f pvc.yaml
    
  3. StorageClassvolumeBindingMode 필드가 WaitForFirstConsumer로 설정된 경우 PVC를 사용할 pod를 만들어야 유효성을 검증할 수 있습니다. 다음 콘텐츠를 pod.yaml이라는 새 파일에 복사하고 claimName 값이 PersistentVolumeClaim 객체의 이름과 일치하는지 확인합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: web-server
    spec:
      containers:
       - name: web-server
         image: nginx
         volumeMounts:
           - mountPath: /var/lib/www/html
             name: mypvc
      volumes:
       - name: mypvc
         persistentVolumeClaim:
           claimName: podpvc
           readOnly: false
    
  4. GKE 클러스터에 pod를 적용합니다.

    kubectl apply -f pod.yaml
    
  5. 클러스터의 PersistentVolumeClaim을 가져오고 PVC가 생성되어 새로 프로비저닝된 PersistentVolume에 결합되었는지 확인합니다.

    Filestore 인스턴스

    kubectl get pvc
    

    출력은 다음과 비슷합니다.

    NAME      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
    podpvc    Bound     pvc-e36abf50-84f3-11e8-8538-42010a800002   1Ti        RWO            csi-filestore-cmek  9s
    

    영구 디스크

    kubectl get pvc
    

    출력은 다음과 비슷합니다.

    NAME      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
    podpvc    Bound     pvc-e36abf50-84f3-11e8-8538-42010a800002   6Gi       RWO            csi-gce-pd-cmek  9s
    

이제 CMEK로 보호되는 Persistent Disk를 GKE 클러스터와 함께 사용할 수 있습니다.

CMEK 보호 삭제

Persistent Disk에서 CMEK 보호를 제거하려면 Compute Engine 문서 의 지침을 따르세요.

Filestore 인스턴스에서 CMEK 암호화를 삭제할 수 없습니다.

GKE 및 CMEK 조직 정책

GKE는 CMEK 보호가 필요할 수 있고 CMEK 보호에 사용할 수 있는 Cloud KMS 키를 제한할 수 있는 CMEK 조직 정책(미리보기)을 지원합니다.

container.googleapis.comconstraints/gcp.restrictNonCmekServices 제약조건의 서비스 Deny 정책 목록에 있는 경우 CMEK 보호를 사용 설정하지 않으면 GKE가 다음 리소스의 생성을 거부합니다.

  • 새 클러스터 및 노드 풀
  • 새로운 Filestore 인스턴스 및 영구 디스크

조직 정책에 constraints/gcp.restrictNonCmekCryptoKeyProjects 제약조건이 구성되어 있으면 GKE가 허용된 프로젝트, 폴더 또는 조직의 암호화 키를 사용하는 CMEK로 보호되는 리소스만을 생성합니다.

다음 단계