伺服器用戶端程式庫的安全性

使用 Firestore 的伺服器用戶端程式庫時,您可以透過身分與存取權管理 (IAM) 服務,管理資源的存取權。IAM 可讓您以更精細的方式授予特定 Google Cloud 資源的存取權,避免其他資源遭到未經授權者擅自存取。本頁面說明 Firestore 的 IAM 權限和角色。如需 IAM 的詳細說明,請參閱 IAM 說明文件

IAM 可讓您採取最低權限的安全性原則,僅將必要的資源存取權限授予使用者。

設定 IAM 政策之後,即可控管哪些使用者具備何種角色權限,可以存取哪些資源。身分與存取權管理政策可將一或多個角色授予使用者,讓對方擁有特定權限。舉例來說,您可以將 datastore.indexAdmin 角色授予使用者,讓該使用者能夠建立、修改、刪除、列出或查看索引。

權限與角色

本節概述 Firestore 支援的權限與角色。

API 方法的所需權限

下表列出呼叫者執行各項操作時必須具備的權限:

方法 所需權限
projects.databases.documents
batchGet datastore.entities.get
batchWrite 更新或轉換,並將存在前提條件設為 false datastore.entities.create
batchWrite 更新或轉換,並將存在前提條件設為 true datastore.entities.create
batchWrite 更新或轉換,不需任何前提條件 datastore.entities.create
datastore.entities.update
beginTransaction datastore.databases.get
commit 更新或轉換,並將存在前提條件設為 false datastore.entities.create
commit 更新或轉換,並將存在前提條件設為 true datastore.entities.update
commit 更新或轉換,不需任何前提條件 datastore.entities.create
datastore.entities.update
commit 刪除 datastore.entities.delete
createDocument datastore.entities.create
delete datastore.entities.delete
get datastore.entities.get
list datastore.entities.get
datastore.entities.list
listCollectionIds datastore.entities.list
partitionQuery datastore.entities.get
datastore.entities.list
patch datastore.entities.update
rollback datastore.databases.get
runAggregationQuery datastore.entities.get
datastore.entities.list
runQuery datastore.entities.get
datastore.entities.list
write (RPC) 更新或轉換,並將存在前提條件設為 false datastore.entities.create
write (RPC) 更新或轉換,並將存在前提條件設為 true datastore.entities.update
write (RPC) 更新或轉換,不需任何前提條件 datastore.entities.create
datastore.entities.update
write (RPC) 刪除 datastore.entities.delete
projects.databases.indexes
create datastore.indexes.create
delete datastore.indexes.delete
get datastore.indexes.get
list datastore.indexes.list
projects.databases
create datastore.databases.create

如果 create 要求包含 tags 值,則必須具備下列額外權限:

  • datastore.databases.createTagBinding

如要列出繫結來確認標記繫結是否設定成功,您必須具備下列額外權限:

  • datastore.databases.listTagBindings
  • datastore.databases.listEffectiveTags
delete datastore.databases.delete
get datastore.databases.getMetadata
list datastore.databases.list
patch datastore.databases.update
restore datastore.backups.restoreDatabase
projects.locations
get datastore.locations.get
list datastore.locations.list
projects.databases.backupschedules
get datastore.backupSchedules.get
list datastore.backupSchedules.list
create datastore.backupSchedules.create
update datastore.backupSchedules.update
刪除 datastore.backupSchedules.delete
projects.locations.backups
get datastore.backups.get
list datastore.backups.list
刪除 datastore.backups.delete

預先定義的角色

若使用 IAM,Firestore 中的每一種 API 方法均要求提出 API 要求的帳戶必須具備使用該項資源的適當權限。只要設定政策將角色授予使用者、群組或服務帳戶,即可授予權限。除了原始角色 (即擁有者、編輯者和檢視者) 外,您還可以將 Firestore 角色授予專案使用者。

下表列出 Firestore IAM 角色。您可以將多個角色授予使用者、群組或服務帳戶。

角色 權限 說明
roles/datastore.owner appengine.applications.get

datastore.*

resourcemanager.projects.get
resourcemanager.projects.list
具備 Firestore 的完整存取權。
roles/datastore.user appengine.applications.get

datastore.databases.get
datastore.databases.getMetadata
datastore.databases.list
datastore.entities.*
datastore.indexes.list
datastore.namespaces.get
datastore.namespaces.list
datastore.statistics.get
datastore.statistics.list

resourcemanager.projects.get
resourcemanager.projects.list
在 Firestore 資料庫讀取/寫入資料的存取權。適用於應用程式開發人員和服務帳戶。
roles/datastore.viewer appengine.applications.get

datastore.databases.get
datastore.databases.getMetadata
datastore.databases.list
datastore.entities.get
datastore.entities.list
datastore.indexes.get
datastore.indexes.list
datastore.namespaces.get
datastore.namespaces.list
datastore.statistics.get
datastore.statistics.list

resourcemanager.projects.get
resourcemanager.projects.list

datastore.insights.get
具備所有 Firestore 資源的讀取權限。
roles/datastore.importExportAdmin appengine.applications.get
datastore.databases.export
datastore.databases.getMetadata
datastore.databases.import
datastore.operations.cancel
datastore.operations.get
datastore.operations.list
resourcemanager.projects.get
resourcemanager.projects.list
具備匯入及匯出項目的完整管理權限。
roles/datastore.bulkAdmin resourcemanager.projects.get
resourcemanager.projects.list
datastore.databases.getMetadata
datastore.databases.bulkDelete
datastore.operations.cancel
datastore.operations.get
datastore.operations.list
具備管理批次作業的完整存取權。
roles/datastore.indexAdmin appengine.applications.get

datastore.databases.getMetadata

datastore.indexes.*

resourcemanager.projects.get
resourcemanager.projects.list
具備管理索引定義的完整權限。
roles/datastore.keyVisualizerViewer datastore.databases.getMetadata
datastore.keyVisualizerScans.get
datastore.keyVisualizerScans.list
resourcemanager.projects.get
resourcemanager.projects.list
具備 Key Visualizer 掃描結果的完整存取權。
roles/datastore.backupSchedulesViewer datastore.backupSchedules.get
datastore.backupSchedules.list
具備 Firestore 資料庫備份排程的讀取權限。
roles/datastore.backupSchedulesAdmin datastore.backupSchedules.get
datastore.backupSchedules.list
datastore.backupSchedules.create
datastore.backupSchedules.update
datastore.backupSchedules.delete
datastore.databases.list
datastore.databases.getMetadata
具備 Firestore 資料庫備份排程的完整存取權。
roles/datastore.backupsViewer datastore.backups.get
datastore.backups.list
具備 Firestore 位置備份資訊的讀取權限。
roles/datastore.backupsAdmin datastore.backups.get
datastore.backups.list
datastore.backups.delete
具備 Firestore 位置中備份的完整存取權。
roles/datastore.restoreAdmin datastore.backups.get
datastore.backups.list
datastore.backups.restoreDatabase
datastore.databases.list
datastore.databases.create
datastore.databases.getMetadata
datastore.operations.list
datastore.operations.get
能夠將 Firestore 備份還原至新資料庫。這個角色也能建立新資料庫,不一定要從備份還原。
roles/datastore.statisticsViewer resourcemanager.projects.get
resourcemanager.projects.list
datastore.databases.getMetadata
datastore.insights.get
datastore.keyVisualizerScans.get
datastore.keyVisualizerScans.list
datastore.statistics.list
datastore.statistics.get
具備深入分析資訊、統計資料和 Key Visualizer 掃描作業的讀取權限。

自訂角色

如果預先定義的角色無法滿足您的業務需求,您可以使用自訂角色,並設定這些角色的權限:

建立及管理標記所需的角色

如果任何標籤出現在建立或還原動作中,則需要某些角色。如要進一步瞭解如何建立標記鍵/值組合,然後將其與資料庫資源建立關聯,請參閱「建立及管理標記」。

必須具備下列權限。

查看代碼
  • datastore.databases.listTagBindings
  • datastore.databases.listEffectiveTags
管理資源標記

您必須具備下列權限,才能為資料庫資源附加標記值。

  • datastore.databases.createTagBinding

權限

下表列出 Firestore 支援的權限。

資料庫權限名稱 說明
datastore.databases.get 開始或復原交易。
datastore.databases.import 將實體匯入資料庫。
datastore.databases.export 自資料庫匯出實體。
datastore.databases.bulkDelete 從資料庫大量刪除實體。
datastore.databases.getMetadata 自資料庫讀取中繼資料。
datastore.databases.list 列出專案中的資料庫。
datastore.databases.create 建立資料庫。
datastore.databases.update 更新資料庫。
datastore.databases.delete 刪除資料庫。
datastore.databases.createTagBinding 為資料庫建立標記繫結。
datastore.databases.deleteTagBinding 刪除資料庫的標記繫結。
datastore.databases.listTagBindings 列出資料庫的所有標記繫結。
datastore.databases.listEffectiveTagBindings 列出資料庫的有效標記繫結。
實體權限名稱 說明
datastore.entities.create 建立文件。
datastore.entities.delete 刪除文件。
datastore.entities.get 閱讀文件。
datastore.entities.list 列出專案中的文件名稱。
(您必須擁有 datastore.entities.get 才能存取文件資料)。
datastore.entities.update 更新文件。
索引權限名稱 說明
datastore.indexes.create 建立索引。
datastore.indexes.delete 刪除索引。
datastore.indexes.get 自索引讀取中繼資料。
datastore.indexes.list 列出專案中的索引。
datastore.indexes.update 更新索引。
作業權限名稱 說明
datastore.operations.cancel 取消長時間執行的作業。
datastore.operations.delete 刪除長時間執行的作業。
datastore.operations.get 取得長時間執行的作業的最新狀態。
datastore.operations.list 列出長時間執行的作業。
專案權限名稱 說明
resourcemanager.projects.get 瀏覽專案中的資源。
resourcemanager.projects.list 列出擁有的專案。
位置存取權名稱 說明
datastore.locations.get 取得資料庫位置的詳細資料。建立新資料庫時必須提供。
datastore.locations.list 列出可用的資料庫位置。建立新資料庫時必須提供。
Key Visualizer 權限名稱 說明
datastore.keyVisualizerScans.get 取得 Key Visualizer 掃描的詳細資料。
datastore.keyVisualizerScans.list 列出可用的 Key Visualizer 掃描作業。
備份排程權限名稱 說明
datastore.backupSchedules.get 取得備份排程的詳細資料。
datastore.backupSchedules.list 列出可用的備份排程。
datastore.backupSchedules.create 建立備份時間表。
datastore.backupSchedules.update 更新備份排程。
datastore.backupSchedules.delete 刪除備份排程。
備份權限名稱 說明
datastore.backups.get 取得備份的詳細資料。
datastore.backups.list 列出可用的備份。
datastore.backups.delete 刪除備份。
datastore.backups.restoreDatabase 從備份還原資料庫。
洞察權限名稱 說明
datastore.insights.get 取得資源的深入分析

角色變更延遲

Firestore 快取 IAM 權限的時間是 5 分鐘,因此,角色變更約需 5 分鐘才會生效。

管理 Firestore IAM

您可以使用 Google Cloud 主控台、IAM API 或 gcloud 指令列工具取得及設定 IAM 政策。詳情請參閱授予、變更及撤銷專案成員存取權限的說明

設定條件式存取權限

您可以使用 IAM 條件定義及強制執行條件式存取權控管。

舉例來說,下列條件會指派主體 datastore.user 角色,直到指定日期為止:

{
  "role": "roles/datastore.user",
  "members": [
    "user:travis@example.com"
  ],
  "condition": {
    "title": "Expires_December_1_2023",
    "description": "Expires on December 1, 2023",
    "expression":
      "request.time < timestamp('2023-12-01T00:00:00.000Z')"
  }
}

如要瞭解如何定義暫時存取權的 IAM 條件,請參閱設定暫時存取權

如要瞭解如何為一或多個資料庫的存取權設定 IAM 條件,請參閱「設定資料庫存取條件」。

安全規則對 IAM 的依附元件

行動/網路用戶端的 Firestore 安全性規則取決於下列服務帳戶和 IAM 繫結:

服務帳戶 IAM 角色
service-project_number@firebase-rules.iam.gserviceaccount.com roles/firebaserules.system

Firebase 會自動為您設定這個服務帳戶。如果從這個服務帳戶移除 firebaserules.system 角色,安全規則就會拒絕所有要求。如要還原這項 IAM 繫結,請使用下列 gcloud CLI 指令:

gcloud projects add-iam-policy-binding project_id \
--member=serviceAccount:service-project_number@firebase-rules.iam.gserviceaccount.com \
--role=roles/firebaserules.system

如要判斷 project_idproject_number,請參閱「識別專案」。

請使用 Google Cloud CLI,而非 Google Cloud 控制台,因為firebaserules.system 角色預設會在控制台中隱藏。

後續步驟