使用客戶自行管理的加密金鑰 (CMEK)

本頁說明如何執行與 Cloud Firestore 相關的客戶管理的加密金鑰 (CMEK) 相關工作。如要進一步瞭解 CMEK 的一般資訊,包括何時啟用 CMEK 以及原因,請參閱 Cloud KMS 說明文件

準備 CMEK 金鑰

您必須先完成下列步驟,才能建立受 CMEK 保護的 Cloud Firestore 資料庫:

  1. 要求存取 Cloud Firestore CMEK 功能
  2. 建立 (或擷取) Cloud Firestore 服務代理
  3. 建立 CMEK 金鑰
  4. 為該金鑰設定 IAM 設定

針對每個將包含受 CMEK 保護的 Cloud Firestore 資料庫的專案,完成下列步驟。如果日後建立新的 CMEK 金鑰,請務必為該金鑰設定 IAM 設定。

要求存取權

建立 Cloud Firestore 服務代理前,請填寫這份表單,申請 CMEK 功能的存取權。

建立 Cloud Firestore 服務代理

建立 CMEK 金鑰前,您必須先擁有 Cloud Firestore 服務代理,這是 Cloud Firestore 用來存取金鑰的 Google 代管服務帳戶類型。

執行 services identity create 指令,建立服務代理,讓 Cloud Firestore 代表您存取 CMEK 金鑰。如果服務帳戶尚不存在,這項指令會建立服務帳戶,然後顯示該帳戶。

gcloud beta services identity create \
    --service=firestore.googleapis.com \
    --project FIRESTORE_PROJECT

FIRESTORE_PROJECT 替換為您打算用於 Cloud Firestore 資料庫的專案。

這項指令會顯示服務代理 ID,其格式類似電子郵件地址。請記下輸出電子郵件字串,因為您會在後續步驟中使用。

Service identity created:
service-xxx@gcp-sa-firestore.iam.gserviceaccount.com

建立金鑰

您可以使用直接在 Cloud KMS 中建立的金鑰,或是透過 Cloud External Key Manager 提供的外部代管金鑰。

Cloud KMS 金鑰位置必須與要搭配使用的 Cloud Firestore 資料庫位置相同。

  • 對於區域資料庫位置,請使用相同的位置名稱做為金鑰環、金鑰和資料庫,因為位置名稱具有一對一的對應關係。

    舉例來說,如果您想在 us-west1 中建立受 CMEK 保護的資料庫,請在 us-west1 中建立金鑰環和金鑰。

  • 如要使用多區域資料庫位置,請使用 KMS 多區域位置的位置名稱:

    • 請使用 Cloud KMS us 多區域位置,針對 Cloud Firestore nam5 多區域位置。
    • 請使用 Cloud KMS europe 多區域位置,針對 Cloud Firestore eur3 多區域位置。

在您要管理金鑰的 Google Cloud 專案中,完成下列步驟:

  1. 啟用 Cloud KMS API

  2. 使用下列任一選項建立金鑰環和金鑰:

設定金鑰的 IAM 設定

主控台

如要將 Cloud KMS 角色授予服務代理,請按照下列步驟操作。如果您想要更精細的權限,也可以在金鑰或金鑰環層級授予權限。

  1. 前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面。

    前往「IAM」頁面

  2. 按一下 [新增]。

  3. 輸入 Cloud Firestore 服務代理的電子郵件格式 ID。

  4. 選取「Cloud KMS CryptoKey Encrypter/Decrypter」角色。

  5. 按一下 [儲存]

gcloud

cloudkms.cryptoKeyEncrypterDecrypter 角色授予服務代理:

gcloud kms keys add-iam-policy-binding KMS_KEY \
--keyring KMS_KEYRING\
--location KMS_LOCATION \
--member serviceAccount:SERVICE_AGENT_EMAIL \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project KMS_PROJECT

請依指示取代下列項目:

  • KMS_KEY 與您指派給金鑰的名稱
  • KMS_KEYRING 替換為包含金鑰的 KMS 金鑰環
  • KMS_LOCATION 與包含金鑰環的區域
  • SERVICE_AGENT_EMAIL,其中包含您要授予存取權的服務代理的電子郵件格式 ID
  • KMS_PROJECT 與包含金鑰的專案

終端機應會顯示類似以下的回應:

Updated IAM policy for key KMS_KEY.
bindings:
- members:
- serviceAccount:
service-{project-number}@gcp-sa-firestore.iam.gserviceaccount.com
role: roles/cloudkms.cryptoKeyEncrypterDecrypter

建立支援 CMEK 的資料庫

建立及設定 CMEK 金鑰後,您就可以建立受 CMEK 保護的資料庫。受 Google 預設加密保護的現有 Cloud Firestore 資料庫無法轉換為使用 CMEK。

您只能在建立支援 CMEK 的資料庫時選擇加密類型和金鑰。

主控台

  1. 前往 Google Cloud 控制台的「資料庫」頁面。

    前往「資料庫」頁面

  2. 按一下 [Create Database] (建立資料庫)。

  3. 選取資料庫模式。按一下「繼續」

  4. 在「Configure your database」(設定資料庫) 頁面中,輸入資料庫 ID。

  5. 選取位置。

  6. 按一下「顯示加密選項」,然後選取「Cloud KMS 金鑰」

  7. 選取或輸入要用於資料庫的 CMEK 金鑰資源名稱。

  8. 鍵清單僅限於目前的 Google Cloud 專案和您選取的資料庫位置。如要使用其他 Google Cloud 專案的金鑰,請點選「切換專案」或「手動輸入金鑰」

  9. 如果系統提示您將金鑰權限授予 Cloud Firestore 服務帳戶,請按一下「授予」。如要建立 CMEK 資料庫,您的 Cloud Firestore 服務帳戶必須具備 cloudkms.cryptoKeyEncrypterDecrypter 角色。

  10. 選取行動和網路用戶端的安全性規則。

  11. 按一下 [Create Database] (建立資料庫)。

建立資料庫後,您可以查看「資料庫詳細資料」,確認資料庫是否已啟用 CMEK:

  • 如果資料庫受到 CMEK 保護,加密類型欄位會顯示「客戶管理」,而「加密金鑰」欄位會列出用於保護這個資料庫的對應 Cloud KMS 和金鑰版本。
  • 如果資料庫未受 CMEK 保護,則「加密類型」欄位會顯示為「Google 管理」

gcloud

使用 Google Cloud CLI 建立支援 CMEK 的資料庫前,請先安裝最新版本並授權 gcloud CLI。詳情請參閱「安裝 gcloud CLI」一文。

gcloud firestore databases create --location=FIRESTORE_DATABASE_LOCATION \
      --database=DATABASE_ID \
      --kms-key-name=KMS_KEY_NAME \
      --project=FIRESTORE_PROJECT

請依指示取代下列項目:

  • FIRESTORE_DATABASE_LOCATION,另有 Cloud Firestore 個資料庫位置
  • DATABASE_ID 與資料庫 ID
  • KMS_KEY_NAME 改成您指派給金鑰的名稱。請使用金鑰的完整資源名稱,格式如下:

    projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

  • FIRESTORE_PROJECT 與要用於 Cloud Firestore 資料庫的專案

REST API

HTTP 要求:

POST https://firestore.googleapis.com/v1/projects/{FIRESTORE_PROJECT}/databases

在要求主體中,在 cmek_config.kms_key_name 欄位中設定 CMEK。

設為 Cloud KMS 金鑰的完整資源 ID。只有與此資料庫相同位置的索引鍵才可使用。

這個值應為 Cloud KMS 金鑰資源 ID,格式為 projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

如要進一步瞭解其他欄位,請參閱 database create 頁面

要求範例:

curl -X POST 'https://firestore.googleapis.com/v1/projects/FIRESTORE_PROJECT/databases?databaseId={DATABASE_ID}' \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-type: application/json" \
-d '{
  "type":"FIRESTORE_NATIVE",
  "locationId":"{FIRESTORE_DATABASE_LOCATION}",
  "cmekConfig": {
    "kmsKeyName":"projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID"
  }
}'

Firebase CLI

如要建立支援 CMEK 的資料庫,請使用 KMS Key Name 欄位。如果未指定 --kms-key-name 參數,Cloud Firestore 預設會建立非 CMEK 資料庫。

firebase firestore:databases:create DATABASE_ID
--location LOCATION
--kms-key-name projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
--project FIRESTORE_PROJECT

請依指示取代下列項目:

  • DATABASE_ID 替換為資料庫的 ID
  • LOCATION 與資料庫位置
  • KMS_PROJECT 與包含 CMEK 金鑰的專案
  • KMS_LOCATION 替換為包含 CMEK 金鑰和金鑰環的位置
  • KMS_KEYRING_ID 替換為 CMEK 金鑰環的 ID
  • FIRESTORE_PROJECT 與要用於 Cloud Firestore 資料庫的專案

確認 Cloud Firestore 資料庫已透過 Firebase CLI 受到保護:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

回應訊息中會顯示下列 CMEK 資訊:

  • 「KMS Key Name」欄位會提供用於加密 Cloud Firestore CMEK 資料庫的完整金鑰資源名稱。
  • 「Active Key Versions」欄位會列出目前由此 CMEK 資料庫使用的所有金鑰版本金鑰輪替期間,您可以擁有多個有效金鑰版本。

Terraform

如要建立支援 CMEK 的資料庫,請使用 google_firestore_database 資源。如需更多資訊和範例,請參閱 google_firestore_database

resource "google_firestore_database" "database" {
  project     = "FIRESTORE_PROJECT"
  name        = "DATABASE_ID"
  location_id = "FIRESTORE_DATABASE_LOCATION"
  type        = "DATABASE_TYPE"

  cmek_config {
    kms_key_name = "KMS_KEY_NAME"
  }

}

取代下列內容:

  • FIRESTORE_PROJECT 與要用於 Cloud Firestore 資料庫的專案
  • DATABASE_ID 與資料庫 ID
  • FIRESTORE_DATABASE_LOCATION,另有 Cloud Firestore 個資料庫位置
  • DATABASE_TYPE 搭配 FIRESTORE_NATIVE 為原生模式,搭配 DATASTORE_MODE 為 Datastore 模式。
  • KMS_KEY_NAME 改成您指派給金鑰的名稱。請使用金鑰的完整資源名稱,格式如下:

    projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

存取受 CMEK 保護的資料庫

傳送至 CMEK 保護資料庫的所有讀取、寫入和查詢作業,應與 Google 預設加密資料庫的作業相同。舉例來說,您不需要為每個要求提供金鑰。

還原受 CMEK 保護的資料庫

從備份還原受 CMEK 保護的資料庫前,請先確認下列事項:

  • 決定要將資料庫還原為 CMEK 加密、Google 的預設加密 (非 CMEK),還是與備份相同的加密機制。
  • 準備用於加密備份的金鑰 (主要版本) 和金鑰版本。同時啟用金鑰和金鑰版本。

gcloud

將受 CMEK 保護的資料庫還原為 CMEK 加密

如要還原為 CMEK 加密,請搭配選用的 encryption-typekms-key-name 標記執行 gcloud firestore databases restore 指令,為還原的資料庫設定加密類型。如果您未指定加密類型,還原的資料庫會使用與備份相同的加密設定。

  gcloud firestore databases restore
  --encryption-type=customer-managed-encryption
  --kms-key-name=KMS_KEY_NAME

KMS_KEY_NAME 替換為您指派給金鑰的名稱。請使用金鑰的完整資源名稱,格式如下:

projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

將受 CMEK 保護的資料庫還原為預設加密

如要還原為 Google 的預設加密機制 (非 CMEK),請按照下列方式設定 encryption-type 標記:

  gcloud firestore databases restore
  --encryption-type=google-default-encryption

將受 CMEK 保護的資料庫還原為與備份相同的加密類型

如要還原為與備份相同的加密類型,請按照下列方式設定 encryption-type 標記:

  gcloud firestore databases restore --encryption-type=use-source-encryption

Firebase CLI

將受 CMEK 保護的資料庫還原為 CMEK 加密

如要還原為 CMEK 加密,請使用選用的 encryption-typekms-key-name 標記。如果您未指定加密類型,還原的資料庫會使用與備份相同的加密設定。

firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type CUSTOMER_MANAGED_ENCRYPTION \
--kms-key-name projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID \
--project FIRESTORE_PROJECT

取代下列內容:

  • DATABASE_ID 替換為資料庫的 ID
  • FIRESTORE_PROJECT 與要用於 Cloud Firestore 資料庫的專案
  • FIRESTORE_LOCATIONCloud Firestore 資料庫的位置
  • BACKUP_ID 替換為備份檔案的 ID
  • KMS_PROJECT 與包含 CMEK 金鑰的專案
  • KMS_LOCATION 替換為包含 CMEK 金鑰和金鑰環的位置
  • KMS_KEYRING_ID 替換為 CMEK 金鑰環的 ID

確認已還原的 Cloud Firestore 資料庫是否已使用 CMEK 加密:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

將受 CMEK 保護的資料庫還原為預設加密

如要還原為 Google 的預設加密機制 (非 CMEK),請按照下列方式設定 encryption-type 標記:

firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type GOOGLE_DEFAULT_ENCRYPTION \
--project FIRESTORE_PROJECT

請依指示取代下列項目:

  • DATABASE_ID 替換為資料庫的 ID
  • FIRESTORE_PROJECT 與要用於 Cloud Firestore 資料庫的專案
  • FIRESTORE_LOCATIONCloud Firestore 資料庫的位置
  • BACKUP_ID 替換為備份檔案的 ID

將受 CMEK 保護的資料庫還原為與備份相同的加密類型

如要還原為與備份相同的加密類型,請按照下列方式設定 encryption-type 標記:

firebase firestore:databases:restore \
--database DATABASE_IDD \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type USE_SOURCE_ENCRYPTION

請依指示取代下列項目:

  • DATABASE_ID 替換為資料庫的 ID
  • FIRESTORE_PROJECT 與要用於 Cloud Firestore 資料庫的專案
  • FIRESTORE_LOCATIONCloud Firestore 資料庫的位置
  • BACKUP_ID 替換為備份檔案的 ID

查看目前使用的金鑰

gcloud

您可以使用 databases describe gcloud CLI 指令確認資料庫 CMEK 設定:

gcloud firestore databases describe --database=DATABASE_ID --project=FIRESTORE_PROJECT

您應該會在回應的 cmekConfig 欄位中看到類似以下的 CMEK 資訊:

cmekConfig:
    activeKeyVersion:
    - projects/PROJECT_ID/locations/us/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
    kmsKeyName: projects/PROJECT_ID/locations/us/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME
  locationId: nam5
  name: projects/PROJECT_ID/databases/DATABASE_ID

回應中包含以下資訊:

  • kmsKeyName:用於加密受 CMEK 保護的資料庫的金鑰完整金鑰資源名稱。
  • activeKeyVersion:列出目前由 CMEK 保護資料庫使用的所有金鑰版本金鑰輪替期間,您可以擁有多個有效金鑰版本。在金鑰輪替期間,舊金鑰版本和新金鑰版本都必須可用。請等到舊金鑰版本不再顯示在 activeKeyVersion 欄位中,再停用該版本。

REST API

HTTP 要求:

GET https://firestore.googleapis.com/v1/{name=projects/FIRESTORE_PROJECT/databases/DATABASE_ID}

在要求主體中,在 cmek_config.kms_key_name 欄位中設定 CMEK。設為 Cloud KMS 金鑰的完整資源 ID。只允許與此資料庫相同位置的索引鍵。

這個值應為 Cloud KMS 金鑰資源 ID,格式為 projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

如要進一步瞭解其他欄位,請參閱 database create 頁面

要求和回應範例:

curl 'https://firestore.googleapis.com/v1/projects/FIRESTORE_PROJECT/databases/{DATABASE_ID}' \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-type: application/json"

----------------------------------------- Response --------------------------------------------
{
  "name": "projects/FIRESTORE_PROJECT/databases/{DATABASE_ID}",
  "locationId": "{FIRESTORE_DATABASE_LOCATION}",
  "type": "FIRESTORE_NATIVE",
  "cmekConfig": {
    "kmsKeyName": "projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}",
    "activeKeyVersion": [
      "projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}/cryptoKeyVersions/1"
    ]
  },
  ……
}

停用金鑰

如要停用與資料庫相關聯的金鑰,請完成下列步驟:

  1. 查看資料庫所使用的金鑰版本
  2. 停用正在使用的這些金鑰版本
  3. 等待變更生效,然後檢查是否無法再存取資料。變更通常會在幾分鐘內生效,但也可能需要 3 小時才會生效。

當資料庫使用的鍵遭到停用時,您會收到 FAILED_PRECONDITION 例外狀況,並在錯誤訊息中看到其他詳細資料,例如:

{
  "error": {
    "code": 400,
    "message": "The customer-managed encryption key required by the requested resource is not accessible. Error reason:  generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist).",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "detail": "The customer-managed encryption key required by the requested resource is not accessible. Error reason:  generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist)"
      }
    ]
  }
}

啟用金鑰

如要重新啟用與資料庫相關聯的金鑰,請完成下列步驟:

  1. 查看資料庫所使用的金鑰版本
  2. 啟用這些正在使用的金鑰版本
  3. 等待變更生效,然後檢查是否無法再存取資料。變更通常會在幾分鐘內生效,但也可能需要 3 小時才會生效。

查看 Cloud KMS 金鑰的稽核記錄

啟用 Cloud KMS 資料存取稽核記錄前,請先熟悉 Cloud 稽核記錄

Cloud KMS 資料存取稽核記錄會顯示 Cloud Firestore 或任何其他已設定為使用 CMEK 金鑰的產品,何時向 Cloud KMS 發出加密/解密呼叫。Cloud Firestore 不會針對每個資料要求發出加密/解密呼叫,而是維持一個定期檢查金鑰的輪詢器。輪詢結果會顯示在稽核記錄中。

您可以在 Google Cloud 控制台中設定稽核記錄並與其互動:

  1. 請確認專案中的 Cloud KMS API 已啟用記錄功能

  2. 前往 Google Cloud 控制台的 Cloud Logging

    前往 Cloud Logging

  3. 將下列程式碼新增至查詢建構工具,即可將記錄項目限制在 Cloud KMS 金鑰:

    resource.type="cloudkms_cryptokey"
    resource.labels.key_ring_id = KMS_KEYRING
    resource.labels.crypto_key_id = KMS_KEY
    resource.labels.location=KMS_LOCATION
    

    取代下列內容:

    • KMS_KEY 替換為 CMEK 金鑰名稱
    • KMS_KEYRING 替換為包含金鑰的 KMS 金鑰環
    • KMS_LOCATION 替換為金鑰和金鑰環的位置

    記錄會顯示每個資料庫每五分鐘的記錄項目。記錄項目如下所示:

    Info 2021-03-20 08:02:24.869 EDT Cloudkms.googleapis.com Decrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com
    audit_log, method: "Decrypt", principal_email: "service-1234567891011@gcp-sa-firestore.iam.gserviceaccount.com"
    
    Info 2021-03-20 08:02:24.913 EDT Cloudkms.googleapis.com Encrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com
    audit_log, method: "Encrypt", principal_email: "service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com"
    

如要進一步瞭解如何解讀稽核記錄,請參閱「瞭解稽核記錄」。

設定 CMEK 機構政策

如要為貴機構的 Cloud Firestore 資料庫指定加密法規遵循要求,請使用 CMEK 機構政策限制

要求使用 CMEK 保護

請設定 constraints/gcp.restrictNonCmekServices,要求 CMEK 才能建立 Cloud Firestore 資料庫。將限制設為 deny,並將 firestore.googleapis.com 新增至拒絕清單,例如:

 gcloud resource-manager org-policies deny gcp.restrictNonCmekServices  is:firestore.googleapis.com --project=FIRESTORE_PROJECT

FIRESTORE_PROJECT 替換為要限制的專案。

如要進一步瞭解如何設定機構政策,請參閱「建立及編輯政策」。

政策生效後,如果您嘗試在受影響的專案下建立非 CMEK 資料庫,就會收到 FAILED_PRECONDITION 例外狀況和錯誤訊息。舉例來說,例外狀況如下所示:

{
  "error": {
    "code": 400,
    "message": "Constraint 'constraints/gcp.restrictNonCmekServices' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'firestore.googleapis.com'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/gcp.restrictNonCmekServices",
            "subject": "orgpolicy:projects/FIRESTORE_PROJECT",
            "description": "Constraint 'constraints/gcp.restrictNonCmekServices' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'firestore.googleapis.com'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
          }
        ]

限制 CMEK 金鑰的使用

如要限制用於 CMEK 保護措施的 Cloud KMS 金鑰,請設定 constraints/gcp.restrictCmekCryptoKeyProjects 限制。

做為清單限制,可接受的值是資源階層指標 (例如 projects/PROJECT_IDunder:folders/FOLDER_IDunder:organizations/ORGANIZATION_ID)。如要使用這項限制,請設定資源階層指標清單,並將限制設為「允許」。這項設定會限制支援的服務,因此只能從列出的專案、資料夾和機構中選取 CMEK 金鑰。在設定的服務中建立受 CMEK 保護的資源時,如果沒有來自其中一個允許資源的 Cloud Firestore 金鑰,要求就不會成功。

以下範例只允許指定專案中 CMEK 保護資料庫的 ALLOWED_KEY_PROJECT_ID 金鑰:

gcloud resource-manager org-policies allow gcp.restrictCmekCryptoKeyProjects \
under:projects/ALLOWED_KEY_PROJECT_ID \
--project=FIRESTORE_PROJECT

政策生效後,如果您違反限制,系統會傳送 FAILED_PRECONDITION 例外狀況和錯誤訊息。例外狀況如下所示:

{
  "error": {
    "code": 400,
    "message": "Constraint 'constraints/gcp.restrictCmekCryptoKeyProjects' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'projects/{NOT_ALLOWED_KEY_PROJECT}'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/gcp.restrictCmekCryptoKeyProjects",
            "subject": "orgpolicy:projects/FIRESTORE_PROJECT",
            "description": "Constraint 'constraints/gcp.restrictCmekCryptoKeyProjects' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'projects/{NOT_ALLOWED_KEY_PROJECT}'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
          }
        ]
      }
    ]
  }
}

後續步驟