伺服器用戶端程式庫的安全性
使用 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 |
beginTransaction |
datastore.databases.get |
commit 更新或轉換,並將存在前提條件設為 false |
datastore.entities.create |
commit 更新或轉換,並將存在前提條件設為 true |
datastore.entities.update |
commit 更新或轉換,不需任何前提條件 |
datastore.entities.create |
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 |
patch |
datastore.entities.update |
rollback |
datastore.databases.get |
runAggregationQuery |
datastore.entities.get |
runQuery |
datastore.entities.get |
write (RPC) 更新或轉換,並將存在前提條件設為 false |
datastore.entities.create |
write (RPC) 更新或轉換,並將存在前提條件設為 true |
datastore.entities.update |
write (RPC) 更新或轉換,不需任何前提條件 |
datastore.entities.create |
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 如果
如要列出繫結來確認標記繫結是否設定成功,您必須具備下列額外權限:
|
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_id 和 project_number,請參閱「識別專案」。
請使用 Google Cloud CLI,而非 Google Cloud 控制台,因為firebaserules.system
角色預設會在控制台中隱藏。