本頁說明如何執行與與 MongoDB 相容的 Cloud Firestore 適用的客戶自行管理的加密金鑰 (CMEK) 相關工作。如要進一步瞭解 CMEK,包括啟用時機和原因,請參閱 Cloud KMS 說明文件。
準備 CMEK 金鑰
如要建立受 CMEK 保護的與 MongoDB 相容的 Cloud Firestore 資料庫,請先完成下列步驟:
- 要求存取與 MongoDB 相容的 Cloud Firestore CMEK 功能。
- 建立 (或擷取) 與 MongoDB 相容的 Cloud Firestore 服務代理程式。
- 建立 CMEK 金鑰。
- 設定該金鑰的 IAM 設定。
請針對每個包含 CMEK 保護的 Cloud Firestore (與 MongoDB 相容) 資料庫的專案,完成下列步驟。如果之後建立新的 CMEK 金鑰,請務必為該金鑰設定 IAM 設定。
要求存取權
建立與 MongoDB 相容的 Cloud Firestore 服務代理程式前,請填寫存取權要求表單,要求存取 CMEK 功能。
建立與 MongoDB 相容的 Cloud Firestore 服務代理程式
建立 CMEK 金鑰前,您必須擁有 Cloud Firestore with MongoDB compatibility 服務代理程式,這是 Google 管理的服務帳戶類型,Cloud Firestore with MongoDB compatibility 會使用這類帳戶存取金鑰。
執行 services identity create 指令,建立服務代理程式。Cloud Firestore 與 MongoDB 相容性會使用這個代理程式,代表您存取 CMEK 金鑰。如果服務帳戶尚不存在,這個指令會建立服務帳戶,然後顯示該帳戶。
gcloud beta services identity create \
--service=firestore.googleapis.com \
--project FIRESTORE_PROJECT
將 FIRESTORE_PROJECT
替換為您打算用於與 MongoDB 相容的 Cloud Firestore 資料庫的專案。
該指令會顯示服務代理程式 ID,格式類似電子郵件地址。請記下輸出內容中的電子郵件字串,因為後續步驟會用到。
Service identity created:
service-xxx@gcp-sa-firestore.
建立金鑰
您可以直接在 Cloud KMS 中建立金鑰,也可以使用透過 Cloud External Key Manager 提供的外部代管金鑰。
Cloud KMS 金鑰位置必須與要搭配使用的 Cloud Firestore (與 MongoDB 相容) 資料庫位置相同。
如果是區域資料庫位置,請為金鑰環、金鑰和資料庫使用相同的位置名稱,因為位置名稱具有一對一的對應關係。
舉例來說,如要在
us-west1
中建立受 CMEK 保護的資料庫,請在us-west1
中建立金鑰環和金鑰。如要使用多區域資料庫位置,請使用 KMS 多區域位置的位置名稱:
使用 Cloud KMS
us
多區域位置,做為 Cloud Firestore 與 MongoDB 相容性nam5
多區域位置。使用 Cloud KMS
europe
多區域位置,做為 Cloud Firestore 與 MongoDB 相容性eur3
多區域位置。
在要管理金鑰的 Google Cloud 專案中,完成下列步驟:
使用下列其中一種方式建立金鑰環和金鑰:
- 直接在 Cloud KMS 中建立金鑰環和金鑰。
- 使用外部代管金鑰。建立外部金鑰,然後建立 Cloud EKM 金鑰,透過 Cloud KMS 提供金鑰。
設定金鑰的 IAM 設定
主控台
如要將 Cloud KMS 角色授予服務代理,請按照下列步驟操作。如要降低精細度,您也可以在金鑰或金鑰環層級授予權限。
前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面。
按一下 [新增]。
輸入與 MongoDB 相容的 Cloud Firestore 服務代理程式 ID,格式為電子郵件地址。
選取「Cloud KMS CryptoKey Encrypter/Decrypter」(Cloud KMS 加密編譯金鑰加密者/解密者) 角色。
按一下 [儲存]。
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.
role: roles/cloudkms.cryptoKeyEncrypterDecrypter
建立已啟用 CMEK 的資料庫
建立及設定 CMEK 金鑰後,即可建立受 CMEK 保護的資料庫。如果現有的 Cloud Firestore 與 MongoDB 相容資料庫受到 Google 預設加密保護,就無法轉換為使用 CMEK。
只有在建立啟用 CMEK 的資料庫時,才能選擇加密類型和金鑰。
主控台
前往 Google Cloud 控制台的「資料庫」頁面。
點選「建立 Firestore 資料庫」。
輸入資料庫 ID。
選取 Enterprise 版本。
選取資料庫位置。
按一下「顯示加密選項」,然後選取「Cloud KMS 金鑰」。
選取或輸入要用於資料庫的 CMEK 金鑰資源名稱。
索引鍵清單僅限於目前的 Google Cloud 專案和您選取的資料庫位置。如要使用其他 Google Cloud 專案的金鑰,請按一下「切換專案」或「手動輸入金鑰」。
如果系統提示您將金鑰權限授予 Cloud Firestore with MongoDB compatibility 服務帳戶,請按一下「授予」。如要建立 CMEK 資料庫,您必須授予 Cloud Firestore 與 MongoDB 相容服務帳戶
cloudkms.cryptoKeyEncrypterDecrypter
角色。為行動和網路用戶端選取安全性規則。
按一下 [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 \
--edition=enterprise \
--kms-key-name=KMS_KEY_NAME \
--project=FIRESTORE_PROJECT
更改下列內容:
FIRESTORE_DATABASE_LOCATION
,並提供資料庫位置DATABASE_ID
,並提供資料庫的 IDKMS_KEY_NAME
改成您指派給金鑰的名稱。請使用金鑰的完整資源名稱,格式如下:projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
FIRESTORE_PROJECT
,以便用於與 MongoDB 相容的 Cloud Firestore 資料庫
存取受 CMEK 保護的資料庫
傳送至受 CMEK 保護資料庫的所有讀取、寫入和查詢作業,都應與 Google 預設加密資料庫的作業相同。舉例來說,您不需要為每個要求提供金鑰。
還原受 CMEK 保護的資料庫
從備份還原受 CMEK 保護的資料庫前,請注意下列事項:
- 決定要將資料庫還原為 CMEK 加密、Google 的預設加密 (非 CMEK),還是與備份相同的加密。
準備好金鑰 (主要版本) 和用於加密備份的金鑰版本。啟用金鑰和金鑰版本。
gcloud
將受 CMEK 保護的資料庫還原為 CMEK 加密狀態
如要還原為 CMEK 加密,請執行 gcloud firestore databases restore
命令,並使用選用的 encryption-type
和 kms-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-type
和 kms-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
,以便用於與 MongoDB 相容的 Cloud Firestore 資料庫FIRESTORE_LOCATION
,並提供與 MongoDB 相容的 Cloud Firestore 資料庫位置BACKUP_ID
,並提供備份 IDKMS_PROJECT
,其中包含您的 CMEK 金鑰KMS_LOCATION
,其中包含 CMEK 金鑰和金鑰環的位置- 將
KMS_KEYRING_ID
替換為 CMEK 金鑰環的 ID
確認還原的 Cloud Firestore 與 MongoDB 相容資料庫已採用 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
,以便用於與 MongoDB 相容的 Cloud Firestore 資料庫FIRESTORE_LOCATION
,並提供與 MongoDB 相容的 Cloud Firestore 資料庫位置BACKUP_ID
,並提供備份 ID
將受 CMEK 保護的資料庫還原為與備份相同的加密類型
如要還原為與備份相同的加密類型,請按照下列方式設定 encryption-type
標記:
firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type USE_SOURCE_ENCRYPTION
更改下列內容:
- 將
DATABASE_ID
替換為資料庫的 ID FIRESTORE_PROJECT
,以便用於與 MongoDB 相容的 Cloud Firestore 資料庫FIRESTORE_LOCATION
,並提供與 MongoDB 相容的 Cloud Firestore 資料庫位置BACKUP_ID
,並提供備份 ID
複製受 CMEK 保護的資料庫
複製受 CMEK 保護的資料庫前,請注意下列事項:
- 決定要將資料庫複製到 CMEK 加密、Google 預設加密 (非 CMEK),還是與來源資料庫相同的加密機制。
準備金鑰 (主要版本) 和用於加密來源資料庫的金鑰版本。啟用金鑰和金鑰版本。
gcloud
將受 CMEK 保護的資料庫複製到 CMEK 加密
如要複製到 CMEK 加密,請執行 gcloud alpha firestore databases clone 指令,並使用選用的 encryption-type
和 kms-key-name
旗標,為複製的資料庫設定加密類型。如未指定加密類型,複製的資料庫會採用與來源資料庫相同的加密設定。
gcloud alpha 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 alpha firestore databases clone \
--encryption-type=google-default-encryption
將受 CMEK 保護的資料庫複製到與來源資料庫相同的加密類型
如要複製到與來源資料庫相同的加密類型,請依下列方式設定 encryption-type
旗標:
gcloud alpha firestore databases clone \
--encryption-type=use-source-encryption
查看使用的金鑰
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
回應會包含下列資訊:
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"
回應範例:
{
"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"
]
},
...
}
停用金鑰
如要停用與資料庫相關聯的金鑰,請完成下列步驟:
- 查看資料庫使用的金鑰版本
- 停用這些金鑰版本
- 等待變更生效,並確認資料是否無法再存取。變更通常會在幾分鐘內生效,但也可能需要 3 小時。
如果資料庫使用的金鑰遭到停用,您應該會收到 INVALID_ARGUMENT
例外狀況,錯誤訊息中會提供額外詳細資料,例如:
{
"error": {
"code": 400,
"message": "Failed: (InvalidArgument) The customer-managed encryption key required by the requested resource is not accessible. Error reason: projects/{FIRESTORE_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}/cryptoKeyVersions/1 is not enabled, current state is: DISABLED.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.DebugInfo",
"detail": "Failed: (InvalidArgument) The customer-managed encryption key required by the requested resource is not accessible. Error reason: projects/{FIRESTORE_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}/cryptoKeyVersions/1 is not enabled, current state is: DISABLED."
}
]
}
}
啟用金鑰
如要重新啟用與資料庫相關聯的金鑰,請完成下列步驟:
- 查看資料庫使用的金鑰版本
- 啟用這些金鑰版本
- 等待變更生效,並確認資料是否無法再存取。變更通常會在幾分鐘內生效,但也可能需要 3 小時。
查看 Cloud KMS 金鑰的稽核記錄
啟用 Cloud KMS 資料存取稽核記錄前,請先熟悉 Cloud 稽核記錄。
Cloud KMS 資料存取稽核記錄會顯示 Cloud Firestore MongoDB 相容性或任何其他設定為使用 CMEK 金鑰的產品,何時對 Cloud KMS 進行加密或解密呼叫。與 MongoDB 相容的 Cloud Firestore 不會在每個資料要求中發出加密或解密呼叫,而是維護輪詢器,定期檢查金鑰。輪詢結果會顯示在稽核記錄中。
您可以在 Google Cloud 控制台中設定及使用稽核記錄:
請確認專案中的 Cloud KMS API 已啟用記錄功能。
前往 Google Cloud 控制台中的 Cloud Logging。
在查詢建構工具中新增下列程式碼,將記錄項目限制為 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. audit_log, method: "Decrypt", principal_email: "service-1234567891011@gcp-sa-firestore." 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. audit_log, method: "Encrypt", principal_email: "service-123456789123@gcp-sa-firestore."
- 將
如要瞭解如何解讀稽核記錄,請參閱「瞭解稽核記錄」。
設定 CMEK 機構政策
如要為機構中與 MongoDB 相容的 Cloud Firestore 資料庫指定加密法規遵循要求,請使用 CMEK 機構政策限制。
要求使用 CMEK 保護措施
設定 constraints/gcp.restrictNonCmekServices
,要求建立與 MongoDB 相容的 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_ID
、under:folders/FOLDER_ID
和 under:organizations/ORGANIZATION_ID
)。如要使用這項限制,請設定資源階層指標清單,並將限制設為「允許」。這項設定會限制支援的服務,因此只能從列出的專案、資料夾和機構中選擇 CMEK 金鑰。如要透過已設定的服務建立受 CMEK 保護的資源,必須使用其中一個允許資源的 Cloud Firestore (與 MongoDB 相容) 金鑰,否則要求會失敗。
以下範例只允許使用 ALLOWED_KEY_PROJECT_ID 中的金鑰,保護指定專案中的 CMEK 資料庫:
gcloud resource-manager org-policies allow gcp.restrictCmekCryptoKeyProjects \
under:projects/<var>ALLOWED_KEY_PROJECT_ID</var> \
--project=<var>FIRESTORE_PROJECT</var>
政策生效後,如果違反限制,您會收到 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."
}
]
}
]
}
}