為 Secret Manager 啟用客戶自行管理的加密金鑰

根據預設,Secret Manager 會加密靜態儲存的客戶內容。Secret Manager 會為您處理加密作業,您不必採取任何其他動作。這項做法稱為「Google 預設加密」

如要控管加密金鑰,您可以在 Cloud KMS 中使用客戶自行管理的加密金鑰 (CMEK),搭配 Secret Manager 等整合 CMEK 的服務。使用 Cloud KMS 金鑰可控管保護等級、位置、輪換時間表、使用權限和存取權,以及加密範圍。 使用 Cloud KMS 還能追蹤金鑰用量、查看稽核記錄,以及控管金鑰生命週期。 您可以在 Cloud KMS 中控制及管理用來保護資料的對稱金鑰加密金鑰 (KEK),而不是由 Google 擁有及管理這些金鑰。

使用 CMEK 設定資源後,存取 Secret Manager 資源的體驗與使用 Google 預設加密機制類似。如要進一步瞭解加密選項,請參閱客戶管理的加密金鑰 (CMEK)

Secret Manager 提供多項工具,可供您在應用程式中儲存、管理及存取機密資料。

使用 Cloud KMS Autokey 的 CMEK

您可以手動建立 CMEK 來保護 Secret Manager 資源,也可以使用 Cloud KMS Autokey。使用 Autokey 時,系統會在 Secret Manager 中建立資源時,視需要產生金鑰環和金鑰。 如果服務代理尚未建立,系統會建立服務代理,並授予必要的 Identity and Access Management (IAM) 角色,供服務代理使用金鑰進行加密和解密作業。詳情請參閱「Autokey 總覽」。

使用 Terraform 或 REST API 建立資源時,Secret Manager 僅與 Cloud KMS Autokey 相容。

如要瞭解如何使用手動建立的 CMEK 保護 Secret Manager 資源,請參閱本頁面的「使用 CMEK 進行自動複製」和「使用 CMEK 進行使用者管理複製」一節。

如要瞭解如何使用 Cloud KMS Autokey 建立的 CMEK 保護 Secret Manager 資源,請參閱「搭配 Secret Manager 資源使用 Autokey」。

Secret Manager 中的 CMEK 運作方式

在將密鑰版本寫入特定位置的永久儲存空間之前,Secret Manager 會使用專屬的資料加密金鑰 (DEK) 加密資料。然後,這個 DEK 會以副本專屬金鑰 (稱為金鑰加密金鑰 (KEK)) 加密,該金鑰由 Secret Manager 服務擁有。

在 Secret Manager 中使用 CMEK 時,KEK 稱為 CMEK 金鑰,是您在 Cloud KMS 中管理的對稱金鑰。CMEK 金鑰必須與加密的密碼版本副本位於相同 Google Cloud 位置。您也可以在 CMEK 政策中使用 Cloud EKM 金鑰進行加密和解密。

本指南會逐步說明如何設定 Secret Manager,以便使用 CMEK。 如要進一步瞭解 CMEK,包括啟用時機和原因,請參閱 Cloud Key Management Service 說明文件

限制

CMEK 僅適用於 Secret Manager v1 API 和 Google Cloud CLI。

事前準備

您可以選擇將所有資源儲存在同一個專案中,也可以將密鑰和金鑰儲存在不同的專案中。請參閱 Cloud KMS 職責區隔,進一步瞭解這項決策。

如要設定 Secret Manager 和 Cloud KMS,請完成下列事前準備工作:

  • Secret Manager:

    • 建立或使用現有專案來存放 Secret Manager 資源。
    • 如有需要,請完成 Secret Manager 快速入門指南「設定 Secret Manager」一節中的步驟。
  • Cloud KMS:

    • 建立或使用現有專案來存放 Cloud KMS 資源。
    • 如有需要,請啟用 Cloud KMS API

將下列變數設為 Secret Manager 和 Cloud KMS 專案的專案 ID。

This is an editable variable. Set it to your Secret Manager project ID and the
value will be used in all commands on this page.
SM_PROJECT_ID

This is an editable variable. Set it to your Cloud KMS project ID and the value
will be used in all commands on this page.
KMS_PROJECT_ID

向 Google Cloud進行驗證:

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud auth login

建立服務代理身分

您需要為每個需要客戶管理加密金鑰的專案建立服務代理身分。

如要使用 Google Cloud CLI 建立服務身分,請執行下列指令:

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud beta services identity create \
    --service "secretmanager.googleapis.com" \
    --project "SM_PROJECT_ID"

這會傳回下列格式的服務身分名稱:

service-PROJECT_NUMBER@gcp-sa-secretmanager.iam.gserviceaccount.com

儲存服務身分名稱:

The following variable is editable. Click on it to update the value, and it will
be reflected throughout this documentation page.

SM_SERVICE_IDENTITY

您將授予這項服務身分存取權,以便使用 CMEK Cloud KMS 金鑰加密及解密密鑰。

使用自動複製功能的 CMEK

本節涵蓋透過自動複製政策設定的密鑰。

如要使用自動複製政策的密鑰,CMEK 金鑰必須位於 global Cloud KMS 多區域。如果您使用 Cloud EKM 金鑰,則無法將密鑰設為自動複製,因為 global區域不支援 Cloud EKM 金鑰。如要進一步瞭解如何使用 Cloud EKM 金鑰,請參閱「將 Cloud EKM 金鑰新增至 CMEK 政策」。

global Cloud KMS 區域中建立對稱 Cloud KMS 金鑰,或使用現有金鑰。這個範例會建立名為 secret-manager-cmek 的新金鑰環,然後在其中建立名為 my-cmek-key 的新金鑰。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud kms keyrings create "secret-manager-cmek" \
    --project "KMS_PROJECT_ID" \
    --location "global"
gcloud kms keys create "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

授予 Secret Manager 服務身分存取權,以便使用 CMEK 金鑰加密及解密。這項指令會將 my-cmek-key Cloud KMS 金鑰的 Cloud KMS 加密者/解密者角色 (roles/cloudkms.cryptoKeyEncrypterDecrypter) 授予服務身分。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud kms keys add-iam-policy-binding "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

建立具有自動複製功能的密鑰。CMEK 金鑰的資源名稱會儲存為密鑰的中繼資料。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud secrets create "SECRET_ID" \
    --replication-policy "automatic" \
    --kms-key-name "projects/KMS_PROJECT_ID/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key" \
    --project "SM_PROJECT_ID"

API

這些範例使用 curl 示範如何使用 API。您可以使用 gcloud auth print-access-token 產生存取權杖。 在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

replication.automatic.customerManagedEncryption.kmsKeyName 的值設為 CMEK 金鑰的資源名稱。

curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets?secretId=SECRET_ID" \
    --request "POST" \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --data-binary @- <<EOF
{
  "replication":{
    "automatic":{
      "customerManagedEncryption":{
        "kmsKeyName": "projects/KMS_PROJECT_ID/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
      }
    }
  }
}
EOF

現在,只要服務身分有權存取 CMEK 金鑰,系統每次在該密碼中建立密碼版本時,都會先使用金鑰自動加密密碼版本的酬載,再寫入永久儲存空間。如果服務身分失去存取權或金鑰無法使用,嘗試建立新的密鑰版本或存取現有版本時,系統會傳回錯誤。

新增密鑰版本。請注意,您並未指定 Cloud KMS 金鑰的資源名稱,而是從密碼的中繼資料讀取。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

echo -n "SECRET_DATA" | gcloud secrets versions add "SECRET_ID" \
    --project "SM_PROJECT_ID" \
    --data-file -

即使呼叫端沒有直接存取權可使用 CMEK 金鑰,系統仍會建立密鑰版本。讀取或寫入密鑰時,負責加密及解密密鑰的是 Secret Manager 的服務身分,而非呼叫端。

同樣地,您不需要直接存取 CMEK 金鑰,即可存取密鑰。服務身分會存取金鑰,並代表您加密或解密密碼。

存取您剛建立的密鑰版本:

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud secrets versions access "latest" \
    --project "SM_PROJECT_ID" \
    --secret "SECRET_ID"

更新 CMEK 設定

global Cloud KMS 多區域中建立新的對稱 KMS 金鑰。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud kms keys create "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

授予 Secret Manager 服務身分使用新 CMEK 金鑰加密及解密的權限。這項指令會將 my-other-key Cloud KMS 金鑰的 Cloud KMS 加密者 / 解密者角色 (roles/cloudkms.cryptoKeyEncrypterDecrypter) 授予服務身分。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud kms keys add-iam-policy-binding "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

如要修改密鑰的 CMEK 設定,請使用新的 Cloud KMS 金鑰資源名稱更新密鑰的複寫。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud secrets replication update "SECRET_ID" \
    --set-kms-key "projects/KMS_PROJECT_ID/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-other-key" \
    --project "SM_PROJECT_ID"

API

這些範例使用 curl 示範如何使用 API。您可以使用 gcloud auth print-access-token 產生存取權杖。 在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets/SECRET_ID?updateMask=replication" \
    --request "PATCH" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --header "Content-Type: application/json" \
    --data-binary @- <<EOF
{
  "replication": {
    "automatic":{
      "customerManagedEncryption":{
        "kmsKeyName": "projects/KMS_PROJECT_ID/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-other-key"
      }
    }
  }
}
EOF

搭配使用者管理複製功能的 CMEK

本節說明以使用者管理複寫政策設定的密鑰。使用使用者管理複製政策時,您可以控管密鑰的儲存 Google Cloud 位置 。密鑰一律可從每個 Google Cloud 位置存取。

如果密鑰採用使用者管理的複製政策,則必須使用與密鑰版本儲存位置完全對應的 Cloud KMS 金鑰。本指南中的範例會將密鑰儲存在兩個不同的位置:us-east1 和 us-central1。存取密鑰的要求會路由至其中一個位置。

在兩個區域中,分別建立金鑰環和用途為加密的 Cloud KMS 金鑰,或使用現有金鑰。這個範例會建立名為 "secret-manager-cmek" 的新金鑰環,然後在每個區域中建立名為 "my-cmek-key" 的金鑰。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud kms keyrings create "secret-manager-cmek" \
    --project "KMS_PROJECT_ID" \
    --location "us-east1"
gcloud kms keys create "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"
gcloud kms keyrings create "secret-manager-cmek" \
    --project "KMS_PROJECT_ID" \
    --location "us-central1"
gcloud kms keys create "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

為 Secret Manager 服務身分授予使用 CMEK 金鑰加密及解密的權限,方法是為每個 CMEK 金鑰個別授予 Cloud KMS 加密者/解密者角色 (roles/cloudkms.cryptoKeyEncrypterDecrypter),或是為專案中的所有金鑰授予這個角色。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud kms keys add-iam-policy-binding "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"
gcloud kms keys add-iam-policy-binding "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

建立啟用 CMEK 的密鑰,並使用使用者管理的複寫功能。CMEK 金鑰的資源名稱會儲存為密鑰的中繼資料。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

cat <<EOF > ./replication-policy.json
{
  "userManaged":{
    "replicas":[
      {
        "location":"us-east1",
        "customerManagedEncryption":{
          "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
        }
      },
      {
        "location":"us-central1",
        "customerManagedEncryption":{
          "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
        }
      }
    ]
  }
}
EOF
gcloud secrets create "my-ummr-secret" \
    --replication-policy-file ./replication-policy.json \
    --project "SM_PROJECT_ID"

API

這些範例使用 curl 示範如何使用 API。您可以使用 gcloud auth print-access-token 產生存取權杖。 在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

replication.userManaged.replicas.customerManagedEncryption.kmsKeyName 的值設為 CMEK 金鑰的資源名稱。

curl "https://secretmanager.googleapis.com/v1/projects/SM_PROJECT_ID/secrets?secretId=my-ummr-secret" \
--request "POST" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ACCESS_TOKEN" \
--data-binary @- <<EOF
{
  "replication":{
    "userManaged":{
      "replicas":[
        {
          "location":"us-east1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
          }
        },
        {
          "location":"us-central1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
          }
        }
      ]
    }
  }
}
EOF

現在,只要服務身分有權存取 CMEK 金鑰,系統每次在該密碼中建立密碼版本時,都會先使用金鑰自動加密密碼版本的酬載,再寫入永久儲存空間。如果服務身分失去存取權或金鑰無法使用,嘗試建立新的密鑰版本或存取現有版本時,系統會傳回錯誤。

新增密鑰版本。請注意,您並未指定 Cloud KMS 金鑰的資源名稱,而是從密碼的中繼資料讀取。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

echo -n "SECRET_DATA" | gcloud secrets versions add "my-ummr-secret" \
    --project "SM_PROJECT_ID" \
    --data-file -

即使呼叫端沒有直接存取權可使用 CMEK 金鑰,系統仍會建立密鑰版本。讀取或寫入密鑰時,負責加密及解密密鑰的是 Secret Manager 的服務身分,而非呼叫端。

同樣地,您不需要直接存取 CMEK 金鑰,即可存取密鑰。服務身分會存取金鑰,並代表您加密或解密密碼。

存取您剛建立的密鑰版本。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud secrets versions access "latest" \
    --project "SM_PROJECT_ID" \
    --secret "my-ummr-secret"

更新 CMEK 設定

在與密鑰相同的區域中,建立兩個新的對稱 KMS 金鑰。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud kms keys create "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"
gcloud kms keys create "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

授予 Secret Manager 服務身分使用新 CMEK 金鑰加密及解密的權限。這項指令會將 my-other-key Cloud KMS 金鑰的 Cloud KMS 加密者 / 解密者角色 (roles/cloudkms.cryptoKeyEncrypterDecrypter) 授予服務身分。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud kms keys add-iam-policy-binding "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"
gcloud kms keys add-iam-policy-binding "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

如要修改密鑰的 CMEK 設定,請使用新的 Cloud KMS 金鑰資源名稱更新密鑰的複寫。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud secrets replication update "my-ummr-secret" \
    --set-kms-key "projects/KMS_PROJECT_ID/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key" \
    --location us-east1 \
    --project "SM_PROJECT_ID"
gcloud secrets replication update "my-ummr-secret" \
    --set-kms-key "projects/KMS_PROJECT_ID/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key" \
    --location us-central1 \
    --project "SM_PROJECT_ID"

如要同時更新密碼中的多個金鑰,可以透過檔案取得及設定複製政策。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud secrets replication get "my-ummr-secret" \
    --project "SM_PROJECT_ID" \
    --format=json > ./replication-policy.json

在偏好的編輯器中更新檔案,反映所需的 CMEK 設定。然後設定新政策:

gcloud secrets replication set "my-ummr-secret" \
    --replication-policy-file ./replication-policy.json \
    --project "SM_PROJECT_ID"

API

這些範例使用 curl 示範如何使用 API。您可以使用 gcloud auth print-access-token 產生存取權杖。 在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets/my-ummr-secret?updateMask=replication" \
    --request "PATCH" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --header "Content-Type: application/json" \
    --data-binary @- <<EOF
{
  "replication":{
    "userManaged":{
      "replicas":[
        {
          "location":"us-east1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key"
          }
        },
        {
          "location":"us-central1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key"
          }
        }]
      }
    }
  }
EOF

查看密鑰版本 CMEK 設定

如要檢查密碼版本的相關中繼資料,包括密碼版本是否已啟用 CMEK,以及 CMEK 金鑰版本的資源名稱,請查看其相關中繼資料。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud secrets versions describe "latest" \
    --secret "SECRET_ID" \
    --project "SM_PROJECT_ID"

API

這些範例使用 curl 示範如何使用 API。您可以使用 gcloud auth print-access-token 產生存取權杖。 在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

curl "https://secretmanager.googleapis.com/v1/projects/SM_PROJECT_ID/secrets/SECRET_ID/versions/latest" \
    --request "GET" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --header "Content-Type: application/json"

這會傳回用於加密密鑰版本的金鑰版本的完整 Cloud KMS 資源名稱。

{
  "name": "projects/PROJECT_NUMBER/secrets/SECRET_ID/versions/1",
  "createTime": "2021-07-...",
  "state": "ENABLED",
  "replicationStatus": {
    "automatic": {
      "customerManagedEncryption": {
        "kmsKeyVersionName": "projects/KMS_PROJECT_ID/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key/cryptoKeyVersions/1"
      }
    }
  }
}

將 Cloud EKM 金鑰新增至 CMEK 政策

本節說明如何將 Cloud EKM 金鑰新增至 CMEK 政策。完成這些步驟後,即可使用 Cloud EKM 金鑰加密或解密密鑰。

由於 Cloud EKM 目前不支援global多區域,因此 Cloud EKM 金鑰只能用於設定使用者管理複寫的密鑰。

us-central1 Cloud KMS 區域 (或 global 以外的任何區域) 中建立對稱金鑰。這個範例會建立名為 secret-manager-cmek-ekm 的新金鑰環,然後在金鑰環上建立名為 my-ekm-key 的新金鑰。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

建立新的金鑰環:

gcloud kms keyrings create "secret-manager-cmek-ekm" \
  --project "KMS_PROJECT_ID" \
  --location "us-central1"

在該金鑰環中建立金鑰:

gcloud kms keys create "my-ekm-key" \
  --keyring "secret-manager-cmek-ekm" \
  --location "us-central1" \
  --purpose "encryption" \
  --protection-level "external" \
  --skip-initial-version-creation \
  --default-algorithm "external-symmetric-encryption"

接著,使用金鑰的外部 URI 建立 my-ekm-key 的新版本。 如要進一步瞭解 Cloud EKM 金鑰的外部 URI,請參閱建立外部金鑰

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud kms keys versions create \
  --key "my-ekm-key" \
  --keyring "secret-manager-cmek-ekm" \
  --location "us-central1" \
  --external-key-uri EXTERNAL_KEY_URI \
  --primary

授予 Secret Manager 服務身分存取權,以便使用外部金鑰加密及解密。這項指令會將 Cloud KMS 加密者 / 解密者角色 (roles/cloudkms.cryptoKeyEncrypterDecrypter) 授予 my-ekm-key 的服務身分。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud kms keys add-iam-policy-binding "my-ekm-key" \
  --project "KMS_PROJECT_ID" \
  --location "us-central1" \
  --keyring "secret-manager-cmek-ekm" \
  --member "serviceAccount:SM_SERVICE_IDENTITY" \
  --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

建立啟用 CMEK 的密鑰,並使用 Cloud EKM 金鑰。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

cat <<EOF > ./replication-policy.json
{
  "userManaged":{
    "replicas":[
      {
        "location":"us-central1",
        "customerManagedEncryption":{
          "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-central1/keyRings/secret-manager-cmek-ekm/cryptoKeys/my-ekm-key"
        }
      }
    ]
  }
}
EOF
gcloud secrets create "my-ekm-secret" \
    --replication-policy-file ./replication-policy.json \
    --project "SM_PROJECT_ID"

現在,只要服務身分有權存取金鑰,每次在 my-ekm-secret 中建立密鑰版本時,系統都會先使用 Cloud EKM 金鑰自動加密密鑰版本的酬載,再將其寫入永久儲存空間。如果服務身分失去存取權或金鑰無法使用,嘗試建立新的密鑰版本或存取現有版本時,系統會傳回錯誤。

新增密鑰版本。請注意,金鑰的資源名稱是從密碼的中繼資料讀取。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

echo -n "SECRET_DATA" | gcloud secrets versions add "my-ekm-secret" \
    --project "SM_PROJECT_ID" \
    --data-file -

即使呼叫端沒有直接存取金鑰的權限,系統仍會建立密鑰版本。讀取或寫入密鑰時,負責加密及解密密鑰的是 Secret Manager 的服務身分,而不是呼叫端。

存取您剛建立的密鑰版本。服務身分會在這裡存取金鑰,並代表您加密或解密密鑰。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud secrets versions access "latest" \
  --project "SM_PROJECT_ID" \
  --secret "my-ekm-secret"

停用 CMEK

更新複寫政策,從密鑰中移除 CMEK 設定。

gcloud

如要在指令列上使用 Secret Manager,請先安裝或升級至 Google Cloud CLI 378.0.0 以上版本。在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

gcloud secrets replication update "SECRET_ID" --remove-cmek \
    --project "SM_PROJECT_ID"

API

這些範例使用 curl 示範如何使用 API。您可以使用 gcloud auth print-access-token 產生存取權杖。 在 Compute Engine 或 GKE 上,您必須使用 cloud-platform 範圍進行驗證

curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets/SECRET_ID?updateMask=replication" \
    --request "PATCH" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --header "Content-Type: application/json" \
    --data-binary @- <<EOF
{
  "replication":{
    "automatic":{}
  }
}
EOF

後續步驟

  • 進一步瞭解 CMEK