本頁說明如何在 Google Kubernetes Engine (GKE) 上使用客戶管理的加密金鑰 (CMEK)。如果您需要控制金鑰的管理權限,可以使用 Cloud Key Management Service 和 CMEK 來保護 GKE 叢集中的連結永久磁碟和自訂開機磁碟。
總覽
根據預設, Google Cloud會加密靜態的客戶內容,而 GKE 會為您管理加密作業,您不必進行任何操作。
如果要自行控制及管理加密金鑰的輪替作業,則可以使用 CMEK。這類金鑰會加密用於加密您資料的資料加密金鑰。詳情請參閱金鑰管理一節。
您也可以使用自行管理的金鑰,加密叢集中的密鑰。詳情請參閱應用程式層密鑰加密功能。
在 GKE 中,CMEK 可保護兩種儲存磁碟的資料:節點開機磁碟和連結的磁碟。
- 節點開機磁碟
- 節點開機磁碟是叢集節點集區的一部分。建立叢集和節點集區時,您可以建立 CMEK 加密的節點開機磁碟。
- 已連接的磁碟
- 附加磁碟是 Pod 用於持久儲存空間的 PersistentVolume。在 GKE 中,連結的 CMEK 加密永久磁碟會做為動態佈建的 PersistentVolume 提供。
如要進一步瞭解儲存空間磁碟,請參閱「儲存空間選項」。 用於 GKE 控制層的控制層磁碟無法以 CMEK 保護。
事前準備
如要進行本主題的練習,您需要兩個 Google Cloud 專案:
金鑰專案:這是您建立加密金鑰的專案。
叢集專案:這是您建立啟用 CMEK 的叢集。
在金鑰專案中,請務必啟用 Cloud KMS API。
在金鑰專案中,建立金鑰環和金鑰的使用者需具備下列 IAM 權限:
cloudkms.keyRings.getIamPolicycloudkms.keyRings.setIamPolicy
這些權限會授予預先定義的
roles/cloudkms.adminIdentity and Access Management 角色。 詳情請參閱 Cloud KMS 說明文件中的授予管理金鑰的權限一節。在叢集專案中,請務必啟用 Cloud KMS API。
確認您已安裝 gcloud CLI。
將
gcloud更新到最新版本:gcloud components update
建立 Cloud KMS 金鑰
如要使用 CMEK 保護節點開機磁碟或附加磁碟,您必須先擁有 Cloud KMS 金鑰環和金鑰。
金鑰環和金鑰必須符合下列規定:
金鑰應使用對稱式加密。
您需要授予 GKE 服務帳戶權限,才能使用金鑰。
金鑰環的位置必須與 GKE 叢集的位置一致:
如需建立金鑰環和金鑰的操作說明,請參閱「建立對稱金鑰」。
授予金鑰使用權限
您必須將 Cloud KMS 金鑰的 Cloud KMS CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) IAM 角色授予叢集專案中的 Compute Engine 服務代理人。授予這個角色後,GKE 永久磁碟就能存取及使用您的加密金鑰。
如要將 roles/cloudkms.cryptoKeyEncrypterDecrypter 角色授予 Compute Engine 服務代理,請選取下列其中一個選項:
gcloud
執行下列指令:
gcloud kms keys add-iam-policy-binding KEY_NAME \
--location LOCATION \
--keyring RING_NAME \
--member serviceAccount:service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project KEY_PROJECT_ID
更改下列內容:
KEY_NAME:金鑰名稱。LOCATION:您建立金鑰環的區域。RING_NAME:金鑰環的名稱。PROJECT_NUMBER:叢集的專案編號。KEY_PROJECT_ID:您的金鑰專案 ID。
控制台
- 前往 Google Cloud 控制台的「金鑰管理」頁面。
按一下包含金鑰的金鑰環名稱。
按一下要修改的金鑰名稱。
按一下「Permissions」(權限) 分頁標籤。
按一下 「授予存取權」。「授予金鑰存取權」窗格隨即開啟。
在「新增主體」欄位中,輸入 Compute Engine 服務代理人的名稱:
service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com將
PROJECT_NUMBER替換為叢集的專案編號。在「Select a role」(選取角色) 選單中,選取「Cloud KMS CryptoKey Encrypter/Decrypter」(Cloud KMS CryptoKey 加密者/解密者)。
按一下 [儲存]。
使用受 CMEK 保護的節點開機磁碟
在本節中,您將建立新的叢集或節點集區,並使用受 CMEK 保護的開機磁碟。
您無法在現有叢集上啟用節點開機磁碟的客戶管理加密,因為現有叢集或節點集區的開機磁碟類型不能變更。不過,您可以為叢集建立新的節點集區,並啟用客戶自行管理的加密功能,然後刪除先前的節點集區。
此外,您也無法在現有叢集或節點集區上,停用節點開機磁碟的客戶管理加密功能。不過,您可以為叢集建立新的節點集區,並停用客戶自行管理的加密功能,然後刪除先前的節點集區。
建立叢集時,使用受 CMEK 保護的節點開機磁碟
您可以使用 gcloud CLI 或 Google Cloud 控制台,建立具有受 CMEK 保護節點開機磁碟的叢集。
如果是標準叢集,只有標準永久磁碟 (pd-standard) 或 SSD 永久磁碟 (pd-ssd) 可以使用 CMEK 金鑰加密。
gcloud
如要建立開機磁碟以 CMEK 金鑰加密的叢集,請在叢集建立指令中指定 --boot-disk-kms-key 參數的值。
建立標準叢集
如要建立開機磁碟以 CMEK 金鑰加密的 Standard 叢集,請使用下列指令:
gcloud container clusters create CLUSTER_NAME \
--cluster-version=latest \
--location CONTROL_PLANE_LOCATION \
--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 \
--location CONTROL_PLANE_LOCATION \
--boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
--project CLUSTER_PROJECT_ID
更改下列內容:
CLUSTER_NAME:新叢集的名稱。CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。如果是區域性 Standard 和 Autopilot 叢集,請提供區域;如果是可用區 Standard 叢集,請提供可用區。KEY_PROJECT_ID:您的金鑰專案 ID。LOCATION:金鑰環的位置。RING_NAME:金鑰環的名稱。KEY_NAME:金鑰名稱。CLUSTER_PROJECT_ID是您的叢集專案 ID。DISK_TYPE:pd-standard(預設) 或pd-ssd。
控制台
建立標準叢集
如要建立開機磁碟以 CMEK 金鑰加密的 Standard 叢集,請執行下列步驟:
- 前往 Google Cloud 控制台的「Create a Kubernetes cluster」(建立 Kubernetes 叢集) 頁面。
- 視需求設定叢集。
- 在導覽窗格的「Node Pools」(節點集區) 下方,按一下「Nodes」(節點)。
- 在「Boot disk type」(開機磁碟類型) 下拉式清單中,選取「Standard persistent disk」(標準永久磁碟) 或「SSD Persistent Disk」(SSD 永久磁碟)。
- 選取「Enable customer-managed encryption for Boot Disk」(為開機磁碟啟用客戶管理加密) 核取方塊,然後選擇您先前建立的 Cloud KMS 加密金鑰。
- 點選「建立」。
建立 Autopilot 叢集
如要建立開機磁碟以 CMEK 金鑰加密的 Autopilot 叢集,請執行下列步驟:
- 前往 Google Cloud 控制台的「建立 Autopilot 叢集」頁面。
- 視需求設定叢集。
- 展開「Advanced Options」(進階選項) 部分,找出「Security」(安全性) 選項。
- 選取「Enable customer-managed encryption for Boot Disk」(為開機磁碟啟用客戶管理加密) 核取方塊,然後選擇您先前建立的 Cloud KMS 加密金鑰。
- 點選「建立」。
建立受 CMEK 保護的節點開機磁碟的新節點集區
如要在現有標準叢集上建立啟用 CMEK 的新節點集區,可以使用 gcloud CLI 或 Google Cloud 控制台。
gcloud
如要建立節點集區,並為節點開機磁碟啟用客戶管理的加密功能,請在建立指令中指定 --boot-disk-kms-key 參數的值。
gcloud container node-pools create NODE_POOL_NAME \
--location CONTROL_PLANE_LOCATION \
--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:您為節點集區選擇的名稱。CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。如果是地區叢集,請提供區域;如果是區域叢集,請提供可用區。DISK_TYPE:pd-standard(預設) 或pd-ssd。KEY_PROJECT_ID:您的金鑰專案 ID。LOCATION:金鑰環的位置。RING_NAME:金鑰環的名稱。KEY_NAME:金鑰名稱。CLUSTER_PROJECT_ID:叢集專案 ID。CLUSTER_NAME:您在上一個步驟中建立的 Standard 叢集名稱。
控制台
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
在叢集清單中,按一下您要修改的叢集名稱。
按一下 add_box「Add Node Pool」(新增節點集區)。
按一下導覽窗格中的「Nodes」(節點)。
在「Machine Configuration」(機器設定) 部分,確認「Boot disk type」(開機磁碟類型) 為「Standard persistent disk」(標準永久磁碟) 或「SSD persistent disk」(SSD 永久磁碟)。
選取「Enable customer-managed encryption for boot disk」(為開機磁碟啟用客戶自行管理的加密功能) 核取方塊,然後選取您建立的 Cloud KMS 加密金鑰。
點選「建立」。
使用受 CMEK 保護的 Filestore 執行個體或永久磁碟
以下資訊說明如何加密新建的 Filestore 執行個體或永久磁碟。您可以使用新的或現有的 Cloud KMS 金鑰,在新叢集或現有叢集上啟用 CMEK。
以下說明需要在每個 GKE 叢集上完成一遍:
- 如果還沒有 GKE 叢集,請先建立一個。
- 將 Filestore CSI 驅動程式或 Compute Engine 永久磁碟 CSI 驅動程式部署到叢集。
- 建立 Cloud KMS 金鑰環和金鑰版本 (如果沒有可用的金鑰環和金鑰版本)。
- 將金鑰存取權授予 Filestore 服務帳戶。
- 建立 StorageClass,讓 Kubernetes 佈建的磁碟自動使用該 Cloud KMS 金鑰加密。如要瞭解如何操作,請參閱下節說明。
建立參照 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_NAMEinstance-encryption-kms-key欄位必須是金鑰的完整資源識別碼,該金鑰會用來加密新的 Filestore 執行個體。instance-encryption-kms-key中的值區分大小寫 (例如:keyRings和cryptoKeys)。如果使用不正確的值來佈建新磁碟區,會導致invalidResourceUsage錯誤。- 您無法將
instance-encryption-kms-key參數新增至現有的StorageClass物件。不過,您可以刪除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_NAMEdisk-encryption-kms-key欄位必須是金鑰的完整資源識別碼,該金鑰會用來加密新磁碟。disk-encryption-kms-key中的值區分大小寫 (例如:keyRings和cryptoKeys)。如果使用不正確的值來佈建新磁碟區,會導致invalidResourceUsage錯誤。- 您無法將
disk-encryption-kms-key參數新增至現有的StorageClass物件。不過,您可以刪除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。 - 您的金鑰 ID 緊接在
disk-encryption-kms-key後面。
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,您必須先建立 Pod 來使用 PVC,才能驗證 PVC。將下列內容複製到名為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 保護的永久磁碟與 GKE 叢集搭配使用。
移除 CMEK 保護機制
使用 Cloud KMS 金鑰加密永久磁碟後,加密作業會永久生效。即使刪除或停用 Cloud KMS 金鑰,也無法從該特定磁碟移除加密金鑰。如要變更加密金鑰或從 Persistent Disk 中移除 CMEK 保護,唯一方法是根據現有磁碟的快照建立新的 Persistent Disk。詳情請參閱「從永久磁碟中移除 Cloud KMS 加密金鑰」。
無法從 Filestore 執行個體移除 CMEK 加密。
GKE 和 CMEK 組織政策
GKE 支援CMEK 組織政策 (搶先版),可要求採用 CMEK 保護措施,並限制您可使用哪些 Cloud KMS 金鑰進行 CMEK 保護。
如果 container.googleapis.com 位於 constraints/gcp.restrictNonCmekServices 限制的服務政策清單中,且您未啟用 CMEK 保護措施,GKE 會拒絕建立下列資源:Deny
- 新叢集和節點集區
- 新的 Filestore 執行個體和永久磁碟
在機構政策中設定 constraints/gcp.restrictNonCmekCryptoKeyProjects 限制後,GKE 只會建立受 CMEK 保護的資源,且這些資源會使用允許的專案、資料夾或機構中的加密金鑰。