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

本頁說明如何執行與 Cloud Firestore客戶自行管理的加密金鑰 (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 服務代理程式,這是 Google 代管的服務帳戶類型,Cloud Firestore用於存取金鑰。

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

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. 選擇 雲端 KMS 加密金鑰加密器/解密器 角色。

  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. 配置您的資料庫頁面,輸入資料庫 ID。

  5. 選取位置。

  6. 按一下 顯示加密選項,然後選擇 雲端 KMS 金鑰

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

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

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

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

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

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

  • 如果您的資料庫受 CMEK 保護,則 加密類型 欄位顯示為 客戶管理,而 加密金鑰 欄位列出對應的雲端 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 金鑰名稱」欄位。如果您不指定 --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 金鑰名稱」欄位會提供用於加密 Cloud Firestore CMEK 資料庫的完整金鑰資源名稱。
  • 「有效金鑰版本」欄位會列出這個 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 加密,請執行 gcloud firestore databases restore 指令,並使用可選的 encryption-typekms-key-name 標誌來設定還原資料庫的加密類型。如果您不指定加密類型,則還原的資料庫將使用與備份相同的加密配置。

  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_LOCATION 以及您的 Cloud 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_LOCATION 以及您的 Cloud 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_LOCATION 以及您的 Cloud Firestore 資料庫的位置
  • BACKUP_ID 替換為備份 ID

複製受 CMEK 保護的資料庫

複製受 CMEK 保護的資料庫前,請注意下列事項:

  • 決定是否要將資料庫複製為 CMEK 加密、Google 的預設加密(非 CMEK)或與來源資料庫相同的加密方式。
  • 準備金鑰 (主要版本) 和用於加密來源資料庫的金鑰版本。啟用金鑰和金鑰版本。

gcloud

將受 CMEK 保護的資料庫複製到 CMEK 加密

若要複製到 CMEK 加密,請執行 gcloud firestore databases clone 指令,並使用可選的 encryption-typekms-key-name 標誌來設定複製資料庫的加密類型。如未指定加密類型,複製的資料庫會採用與來源資料庫相同的加密設定。

gcloud firestore databases clone \
--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 clone \
--encryption-type=google-default-encryption

將受 CMEK 保護的資料庫複製到與來源資料庫相同的加密類型。

如要複製到與來源資料庫相同的加密類型,請依下列方式設定 encryption-type 標記:

gcloud firestore databases clone \
--encryption-type=use-source-encryption

如果未指定 --encryption-type,這也是預設行為。

Firebase CLI

將受 CMEK 保護的資料庫複製到 CMEK 加密資料庫

若要複製到 CMEK 加密,請執行 firebase firestore:databases:clone 命令,並可選擇性地使用 encryption-typekms-key-name 標誌來配置複製資料庫的加密類型。如未指定加密類型,複製的資料庫會採用與來源資料庫相同的加密設定。

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--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 旗標:

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=GOOGLE_DEFAULT_ENCRYPTION

將受 CMEK 保護的資料庫複製到與來源資料庫相同的加密類型。

如要複製到與來源資料庫相同的加密類型,請依下列方式設定 encryption-type 標記:

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=USE_SOURCE_ENCRYPTION

如果未指定 --encryption-type,這也是預設行為。

查看使用中的關鍵訊息

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 金鑰的稽核記錄

在啟用雲端 KMS 資料存取稽核日誌之前,您應該熟悉 雲端稽核日誌

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

您可以在 Google Cloud 控制台 中設定和操作審核日誌:

  1. 請確保專案中的 Cloud KMS API 已啟用 logging

  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」,要求建立「Cloud Firestore」資料庫時必須使用 CMEK。將限制設為 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."
          }
        ]
      }
    ]
  }
}

後續步驟