이 페이지에서는 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로 보호할 수 없습니다.
시작하기 전에
이 주제의 연습을 수행하려면 다음 2개의 Google Cloud 프로젝트가 필요합니다.
키 프로젝트: 암호화 키를 만들 프로젝트입니다.
클러스터 프로젝트: CMEK를 사용 설정하는 클러스터를 만들 프로젝트입니다.
키 프로젝트에서 Cloud KMS API가 사용 설정되었는지 확인합니다.
키 프로젝트에서 키링과 키를 생성하는 사용자는 다음과 같은 IAM 권한이 필요합니다.
cloudkms.keyRings.getIamPolicy
cloudkms.keyRings.setIamPolicy
이러한 권한은 사전 정의된
roles/cloudkms.admin
Identity and Access Management에 부여됩니다. Cloud KMS 문서에서 키를 관리할 권한을 부여하는 방법에 대해 자세히 알아볼 수 있습니다.클러스터 프로젝트에서 Cloud KMS API가 사용 설정되었는지 확인합니다.
gcloud CLI가 설치되었는지 확인합니다.
gcloud
를 최신 버전으로 업데이트합니다.gcloud components update
Cloud KMS 키 만들기
노드 부팅 디스크 또는 연결된 디스크를 CMEK로 보호하려면 먼저 Cloud KMS 키링과 키가 필요합니다.
키링과 키 요구사항은 다음과 같습니다.
키는 대칭 암호화를 사용해야 합니다.
키를 사용하려면 GKE 서비스 계정 권한을 부여해야 합니다.
키링에 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 암호화/복호화 역할을 부여합니다.
- Google Cloud Console에서 Cloud Key Management Service 키 브라우저를 엽니다.
Cloud KMS 키 브라우저 열기 원하는 키가 포함된 키링의 이름을 클릭합니다.
원하는 키의 체크박스를 선택합니다.
오른쪽 창의 권한 탭이 활성화됩니다.
구성원 추가 대화상자에서 액세스 권한을 부여할 Compute Engine 서비스 계정의 이메일 주소를 지정합니다.
역할 선택 드롭다운에서 Cloud KMS CryptoKey Encrypter/Decrypter를 선택합니다.
저장을 클릭합니다.
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 키로 암호화된 표준 클러스터를 만들려면 다음 단계를 수행하세요.
Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.
add_box만들기를 클릭합니다.
표준 섹션에서 구성을 클릭합니다.
원하는 대로 클러스터를 구성합니다.
탐색창의 노드 풀에서 노드를 클릭합니다.
부팅 디스크 유형 드롭다운 목록에서 표준 영구 디스크 또는 SSD 영구 디스크를 선택합니다.
부팅 디스크에 고객 관리 암호화 사용 설정 체크박스를 선택하고 위에서 만든 Cloud KMS 암호화 키를 선택합니다.
만들기를 클릭합니다.
Autopilot 클러스터 만들기
부팅 디스크가 CMEK 키로 암호화된 Autopilot 클러스터를 만들려면 다음 단계를 수행하세요.
Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.
add_box만들기를 클릭합니다.
Autopilot 섹션에서 구성을 클릭합니다.
원하는 대로 클러스터를 구성합니다.
고급 옵션 섹션을 펼쳐서 보안 옵션을 찾습니다.
부팅 디스크에 고객 관리 암호화 사용 설정 체크박스를 선택하고 위에서 만든 Cloud KMS 암호화 키를 선택합니다.
만들기를 클릭합니다.
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
: 이전 단계에서 만든 표준 클러스터의 이름입니다.
콘솔
Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.
클러스터 목록에서 수정하려는 클러스터 이름을 클릭합니다.
add_box 노드 풀 추가를 클릭합니다.
탐색창에서 노드를 클릭합니다.
머신 구성 섹션에서 부팅 디스크 유형을 표준 영구 디스크 또는 SSD 영구 디스크로 선택합니다.
부팅 디스크에 고객 관리 암호화 사용 설정 체크박스를 선택하고 생성해 둔 Cloud KMS 암호화 키를 선택합니다.
만들기를 클릭합니다.
CMEK로 보호되는 Filestore 인스턴스 또는 영구 디스크 사용
다음 정보는 새로 생성된 Filestore 인스턴스 또는 영구 디스크를 암호화하는 방법을 설명합니다. 새 Cloud KMS 키 또는 기존 Cloud KMS 키를 사용하여 새 클러스터나 기존 클러스터에서 CMEK를 사용 설정할 수 있습니다.
이러한 안내는 GKE 클러스터당 한 번만 수행해야 합니다.
- 사용 가능한 GKE 클러스터가 없는 경우 GKE 클러스터를 생성합니다.
- Filestore CSI 드라이버 또는 Compute Engine Persistent Disk CSI 드라이버를 클러스터에 배포합니다.
- 사용 가능한 Cloud KMS 키가 없는 경우 키링과 키 버전을 만듭니다.
- Filestore 서비스 계정에 키 액세스 권한을 부여합니다.
- Kubernetes에서 프로비저닝된 디스크가 Cloud KMS 키를 사용하여 자동으로 암호화되도록 하는 StorageClass를 만듭니다. 자세한 방법은 다음 섹션을 참조하세요.
Cloud KMS 키를 참조하는 StorageClass 만들기
다음 콘텐츠를
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
값은 대소문자를 구분합니다(예:keyRings
및cryptoKeys
). 잘못된 값으로 새 볼륨을 프로비저닝하면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
값은 대소문자를 구분합니다(예:keyRings
및cryptoKeys
). 잘못된 값으로 새 볼륨을 프로비저닝하면invalidResourceUsage
오류가 발생합니다.- 기존
StorageClass
객체에disk-encryption-kms-key
매개변수를 추가할 수 없습니다. 그러나StorageClass
객체를 삭제하고 동일한 이름과 다른 매개변수 집합을 사용하여 다시 만들 수 있습니다. 기존 클래스의 프로비저닝 도구가pd.csi.storage.gke.io
인지 확인합니다.
StorageClass를 기본값으로 설정할 수 있습니다.
kubectl
을 사용하여 GKE 클러스터에서StorageClass
를 배포합니다.kubectl apply -f cmek-sc.yaml
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 스토리지 볼륨을 동적으로 프로비저닝합니다.
다음 콘텐츠를
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
GKE 클러스터에
PersistentVolumeClaim
(PVC)을 적용합니다.kubectl apply -f pvc.yaml
StorageClass
에volumeBindingMode
필드가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
GKE 클러스터에 pod를 적용합니다.
kubectl apply -f pod.yaml
클러스터의
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.com
이 constraints/gcp.restrictNonCmekServices
제약조건의 서비스 Deny
정책 목록에 있는 경우 CMEK 보호를 사용 설정하지 않으면 GKE가 다음 리소스의 생성을 거부합니다.
- 새 클러스터 및 노드 풀
- 새로운 Filestore 인스턴스 및 영구 디스크
조직 정책에 constraints/gcp.restrictNonCmekCryptoKeyProjects
제약조건이 구성되어 있으면 GKE가 허용된 프로젝트, 폴더 또는 조직의 암호화 키를 사용하는 CMEK로 보호되는 리소스만을 생성합니다.
다음 단계
- Cloud Key Management Service FAQ 읽기
- Cloud KMS 키로 리소스를 보호하는 방법 알아보기