聯絡。
本頁面說明如何使用您在 Cloud Key Management Service (Cloud KMS) 中管理的金鑰,加密儲存在 Google Kubernetes Engine (GKE) 控制層中的資料。您應已熟悉 etcd、GKE 叢集架構和 Cloud KMS 等概念。
本頁說明 GKE 中一組選用控制層功能,可讓您執行驗證控制層安全狀態等工作,或使用您管理的金鑰在控制層中設定加密和憑證簽署。詳情請參閱「關於 GKE 控制層授權」。
根據預設, Google Cloud 會對受管理控制層套用各種安全措施。 本頁說明選用功能,可協助您進一步瞭解或控管 GKE 控制層。
關於控制層開機磁碟和 etcd 加密
根據預設,GKE 會使用其管理的加密金鑰,加密控制平面節點的開機磁碟、儲存 etcd 資料的磁碟,以及 etcd 的 Google Cloud 內部 Google Cloud作業備份。如要進一步瞭解這項預設加密功能,請參閱預設靜態資料加密。您可以選擇使用您透過 Cloud KMS 管理的加密金鑰,加密這些資源。如要瞭解詳情,請參閱「控制層開機磁碟和 etcd 加密」。
您可以在 Cloud KMS 中建立金鑰,供 GKE 用於加密控制平面資源。建立這些資源時,請注意下列事項:
- 您可以為叢集中的所有金鑰使用一個金鑰環,不論每個金鑰的用途為何。如果您有用於其他用途的現有金鑰環,例如設定自己的憑證授權單位,則可將該金鑰環用於本指南。
- 建議您在與叢集相同的 Google Cloud 位置建立金鑰,以獲得更佳的延遲時間。
- 在大多數情況下,您可以使用「軟體」Cloud KMS 金鑰防護等級。您也可以搭配 Cloud HSM 使用硬體金鑰。
- 您必須指定
--purpose
標記和encryption
值,因為這些金鑰用於對稱式加密。 - 請勿修改金鑰刪除的預設時間長度。
搭配其他 GKE 控制層授權功能使用
GKE 控制層授權提供下列與自管金鑰相關的功能,您必須在建立叢集時一併啟用:
- 加密控制層元件 (本頁面)
- 自行執行憑證授權單位 (CA) 和金鑰
您只能在建立新的 GKE 叢集時啟用這些功能。您無法更新現有叢集來使用這些功能。如要在同一個叢集中使用這兩項功能,請按照這兩份指南中的所有程序,設定金鑰和 CA,然後執行叢集建立指令,啟用這兩組功能,如「建立叢集」一節所述。
事前準備
開始之前,請確認你已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
,取得最新版本。
- 請確認金鑰專案中,有叢集的 Cloud KMS 金鑰環。您可以使用叢集位置中的任何現有金鑰環。如要建立新金鑰環,請參閱「建立金鑰環」。
-
Enable the Cloud Key Management Service API.
識別專案
建議您使用個別的 Google Cloud 專案,如下所示:
- 金鑰專案:包含所有金鑰。
- 叢集專案:內含 GKE 叢集。
您可以選擇使用同一個專案來管理金鑰和 GKE 叢集,但建議您使用不同的專案,讓管理金鑰和加密作業的團隊與管理叢集的團隊分開。
必要角色和權限
如要取得執行自有加密金鑰所需的權限,請管理員授予下列 IAM 角色:
-
建立 Cloud KMS 金鑰:
金鑰專案的 Cloud KMS 管理員 (
roles/cloudkms.admin
) -
建立 GKE 叢集:
叢集專案的 Kubernetes Engine 叢集管理員 (
roles/container.clusterAdmin
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
需求條件
叢集必須執行 GKE 1.31.1-gke.1846000 以上版本。
限制
- 您只能在建立叢集時設定開機磁碟和 etcd 加密金鑰。
如果是地區 Standard 模式叢集和 Autopilot 叢集,您建立叢集的區域必須有容量,才能在該區域的至少三個區域中,使用 Hyperdisk Balanced 的機密模式。
如果是可用區 Standard 模式叢集,叢集可用區必須具備 Hyperdisk Balanced 容量。如需容量方面的協助,請與 Cloud Customer Care 團隊聯絡。
GKE 僅支援 Cloud KMS 金鑰。您無法使用其他 Kubernetes KMS 提供者或其他加密提供者。
系統不支援 Cloud External Key Manager (Cloud EKM) 金鑰。
您無法存取或操作 etcd 的 Google Cloud 內部 作業備份,這些備份僅供災難復原使用。
系統不支援多區域金鑰環。您必須使用區域金鑰環。
您可使用 GKE 控制層授權的區域和可用區,取決於是否要使用特定功能,如下所示:
- 如要使用客戶管理的加密金鑰加密控制層開機磁碟,叢集必須位於下列其中一個區域:
asia-east1
asia-northeast1
asia-southeast1
europe-west1
europe-west4
us-central1
us-east1
us-east4
us-east5
us-south1
us-west1
us-west3
us-west4
- 如要搭配使用機密 GKE 節點和 GKE 控制層授權,叢集必須位於支援 Hyperdisk Balanced 機密模式的區域。
如果您未使用這些功能,則可以在任何 Google Cloud 位置使用 GKE 控制層授權。
- 如要使用客戶管理的加密金鑰加密控制層開機磁碟,叢集必須位於下列其中一個區域:
建立金鑰
在本節中,您將為控制層中的開機磁碟和 etcd 磁碟建立加密金鑰,並為 etcd 的內部作業備份建立獨立的加密金鑰。 Google Cloud您可以使用一個金鑰環來保存所有這些金鑰,以及叢集的任何其他金鑰。
為控制層開機磁碟和 etcd 磁碟建立加密金鑰:
gcloud kms keys create KCP_DISK_KEY_NAME \ --keyring=KEYRING_NAME \ --location=LOCATION \ --purpose="encryption" \ --protection-level=PROTECTION_LEVEL \ --project=KEY_PROJECT_ID
更改下列內容:
KCP_DISK_KEY_NAME
:控制平面啟動磁碟和 etcd 磁碟的加密金鑰名稱。KEYRING_NAME
:用於保存叢集加密金鑰的金鑰環名稱。LOCATION
:金鑰環的位置。 Google Cloud 這必須與叢集位置相同。如要查看地區清單,請在 Cloud KMS 位置表格中篩選「地區」。PROTECTION_LEVEL
:金鑰的防護等級,例如software
或hsm
。KEY_PROJECT_ID
:金鑰專案的專案 ID。
建立 etcd 內部備份加密金鑰:
gcloud kms keys create ETCD_BACKUP_KEY_NAME \ --keyring=KEYRING_NAME \ --location=LOCATION \ --purpose="encryption" \ --protection-level=PROTECTION_LEVEL \ --project=KEY_PROJECT_ID
將
ETCD_BACKUP_KEY_NAME
替換為 etcd 內部備份加密金鑰的名稱。
將 IAM 角色授予 GKE 服務代理
在本節中,您會將所建立金鑰的 IAM 角色授予叢集專案中的 GKE 服務代理程式。GKE 服務代理程式需要這些角色,才能使用這些金鑰加密對應的控制層資源。
找出叢集專案編號:
gcloud projects describe CLUSTER_PROJECT_ID \ --format='value(projectNumber)'
將
CLUSTER_PROJECT_ID
替換為 GKE 叢集專案的專案 ID。輸出結果會與下列內容相似:
1234567890
將啟動磁碟和 etcd 磁碟的加密金鑰的「Cloud KMS CryptoKey Encrypter/Decrypter」(Cloud KMS 加密編譯金鑰加密者/解密者) (
roles/cloudkms.cryptoKeyEncrypterDecrypter
) 角色授予叢集專案中的 GKE 服務代理人:gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \ --location=LOCATION \ --keyring=KEYRING_NAME \ --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \ --project=KEY_PROJECT_ID
更改下列內容:
KCP_DISK_KEY_NAME
:磁碟加密金鑰的名稱。LOCATION
:金鑰的 Google Cloud 位置。KEYRING_NAME
:包含加密金鑰的金鑰環名稱。CLUSTER_PROJECT_NUMBER
:叢集專案的數值專案編號,您在上一個步驟中已找到該編號。KEY_PROJECT_ID
:金鑰專案的專案 ID。
在叢集專案中,將啟動磁碟和 etcd 磁碟的加密金鑰 Cloud KMS CryptoKey Encrypter/Decrypter Via Delegation (
roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation
) 角色授予 GKE 服務代理人:gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \ --location=LOCATION \ --keyring=KEYRING_NAME \ --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation \ --project=KEY_PROJECT_ID
在叢集專案中,將開機磁碟和 etcd 磁碟的加密金鑰的「Cloud KMS 金鑰使用者」角色授予 GKE 服務代理程式,以進行金鑰輪替:
gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \ --location=LOCATION \ --keyring=KEYRING_NAME \ --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \ --role=roles/container.cloudKmsKeyUser \ --project=KEY_PROJECT_ID
在叢集專案中,將 etcd 內部備份加密金鑰的 Cloud KMS CryptoKey 加密者 (
roles/cloudkms.cryptoKeyEncrypter
) 角色授予 GKE 服務代理人:gcloud kms keys add-iam-policy-binding ETCD_BACKUP_KEY_NAME \ --location=LOCATION \ --keyring=KEYRING_NAME \ --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \ --role=roles/cloudkms.cryptoKeyEncrypter \ --project=KEY_PROJECT_ID
將
ETCD_BACKUP_KEY_NAME
替換為 etcd 作業備份加密金鑰的名稱。授予
roles/cloudkms.cryptoKeyEncrypter
角色後,GKE 就無法代表您執行資料庫還原作業,而且發生資料庫問題時,還原功能所需的時間會大幅增加。如要允許 GKE 為您執行還原作業,請改為授予roles/cloudkms.cryptoKeyEncrypterDecrypter
角色。
在叢集中使用加密金鑰
本節說明如何找出加密金鑰的路徑。
找出磁碟加密金鑰的路徑:
gcloud kms keys describe KCP_DISK_KEY_NAME \ --keyring=KEYRING_NAME \ --location=LOCATION \ --project=KEY_PROJECT_ID \ --format="value(name)"
更改下列內容:
KCP_DISK_KEY_NAME
:控制平面開機磁碟和 etcd 磁碟的加密金鑰名稱。KEYRING_NAME
:包含金鑰的金鑰環名稱。LOCATION
:金鑰的 Google Cloud 位置。KEY_PROJECT_ID
:金鑰專案的專案 ID。
輸出結果會與下列內容相似:
projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/disk-encryption-key
找出 etcd 內部備份加密金鑰的路徑:
gcloud kms keys describe ETCD_BACKUP_KEY_NAME \ --keyring=KEYRING_NAME \ --location=LOCATION \ --project=KEY_PROJECT_ID \ --format="value(name)"
將
ETCD_BACKUP_KEY_NAME
替換為 etcd 作業備份加密金鑰的名稱。輸出結果會與下列內容相似:
projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/etcd-backup-encryption-key
建立叢集
在本節中,您將建立叢集,並根據要設定的 GKE 控制層授權功能,指定不同選項。您只能在建立叢集時,為叢集設定這些功能。下列指令會建立 Autopilot 模式叢集。如要改為建立標準模式叢集,請使用相同的旗標搭配 gcloud container clusters create
指令。
如要建立叢集,設定磁碟加密並執行您自己的 CA 和服務帳戶簽署金鑰,請按照下列步驟操作:
- 請按照「執行自己的憑證授權單位和金鑰」一文中的指示,完成所有金鑰和 CA 設定步驟。
- 按照「在新叢集上設定 CA 和金鑰」一文中的說明,找出各個服務帳戶金鑰和 CA 的路徑。
建立叢集:
gcloud container clusters create-auto CLUSTER_NAME \ --location=LOCATION \ --project=CLUSTER_PROJECT_ID \ --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \ --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY \ --service-account-signing-keys=PATH_TO_SIGNING_KEY_VERSION \ --service-account-verification-keys=PATH_TO_VERIFICATION_KEY_VERSION \ --cluster-ca=PATH_TO_CLUSTER_CA \ --etcd-peer-ca=PATH_TO_ETCD_PEER_CA \ --etcd-api-ca=PATH_TO_ETCD_API_CA \ --aggregation-ca=PATH_TO_AGGREGATION_CA
更改下列內容:
CLUSTER_NAME
:新叢集的名稱。LOCATION
:新叢集的位置。CLUSTER_PROJECT_ID
:叢集專案的專案 ID。PATH_TO_DISK_KEY
:磁碟加密金鑰的路徑,如本頁面先前的步驟所述。PATH_TO_ETCD_BACKUP_KEY
:etcd 內部備份加密金鑰的路徑,來自本頁面先前的步驟。PATH_TO_SIGNING_KEY_VERSION
:Cloud KMS 中 Kubernetes ServiceAccount 簽署金鑰版本的路徑。PATH_TO_VERIFICATION_KEY_VERSION
:Kubernetes ServiceAccount 驗證金鑰版本在 Cloud KMS 中的路徑。PATH_TO_CLUSTER_CA
:叢集 CA 集區的路徑。PATH_TO_ETCD_PEER_CA
:etcd 對等互連 CA 集區的路徑。PATH_TO_ETCD_API_CA
:etcd API CA 集區的路徑。PATH_TO_AGGREGATION_CA
:匯總 CA 集區的路徑。
如要建立叢集,並只使用本指南中建立的金鑰設定磁碟加密,請執行下列指令:
gcloud container clusters create-auto CLUSTER_NAME \ --location=LOCATION \ --project=CLUSTER_PROJECT_ID \ --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \ --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY
更改下列內容:
CLUSTER_NAME
:新叢集的名稱。LOCATION
:新叢集的位置。CLUSTER_PROJECT_ID
:叢集專案的專案 ID。PATH_TO_DISK_KEY
:先前步驟中的磁碟加密金鑰路徑。PATH_TO_ETCD_BACKUP_KEY
:先前步驟中 etcd 內部備份加密金鑰的路徑。
您也可以在建立新的標準模式叢集時,指定所有這些標記。
驗證加密金鑰狀態
本節說明如何驗證叢集建立期間使用的加密金鑰。您可以使用 Cloud Logging 或 Google Cloud CLI 執行這項驗證。
使用 Logging 驗證金鑰
如要使用 Logging 驗證金鑰,請按照下列步驟操作:
前往 Google Cloud 控制台的「Logs Explorer」頁面:
指定下列查詢,取得叢集建立記錄:
resource.type="gke_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.location="CLUSTER_LOCATION" protoPayload.serviceName="container.googleapis.com" protoPayload.methodName=~"google.container.v(1|1alpha1|1beta1).ClusterManager.CreateCluster" protoPayload.request.cluster.userManagedKeysConfig:*
點選「執行查詢」
在輸出內容中,確認叢集建立參數包含的金鑰路徑對應至您在 Cloud KMS 中設定的金鑰,如下列範例所示:
# lines omitted for clarity
userManagedKeysConfig: {
controlPlaneDiskEncryptionKey: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KCP_DISK_KEY_NAME"
gkeopsEtcdBackupEncryptionKey: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/ETCD_BACKUP_KEY_NAME"
}
使用 gcloud CLI 驗證金鑰
如要使用 gcloud CLI 驗證加密金鑰,請執行下列操作:
如要取得磁碟加密金鑰,請執行下列指令:
gcloud container clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(userManagedKeysConfig.controlPlaneDiskEncryptionKey)"
如要取得 etcd 內部備份加密金鑰,請執行下列指令:
gcloud container clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(userManagedKeysConfig.gkeopsEtcdBackupEncryptionKey)"