服务器客户端库的安全性
使用 Firestore 的服务器客户端库时,您可以使用身份和访问权限管理 (IAM) 来管理对您的资源的访问权限。 借助 IAM,您可以为特定 Google Cloud 资源指定更细化的访问权限,同时防止对其他资源进行不必要的访问。本页面介绍 Firestore 的 IAM 权限和角色。如需详细了解 IAM,请参阅 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 delete | 
datastore.entities.delete | 
createDocument | 
datastore.entities.create | 
delete | 
datastore.entities.delete | 
get | 
datastore.entities.get | 
list | 
datastore.entities.getdatastore.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) delete | 
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 | 
| 恢复 | datastore.backups.restoreDatabase | 
clone | 
datastore.databases.clone如果您的  
 如果您想通过列出绑定来验证标记绑定是否已成功设置,则需要以下额外权限: 
  | 
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.getdatastore.*resourcemanager.projects.getresourcemanager.projects.list | 
     对 Firestore 的完全访问权限。 | 
roles/datastore.user | 
  appengine.applications.getdatastore.databases.getdatastore.databases.getMetadatadatastore.databases.listdatastore.entities.*datastore.indexes.listdatastore.namespaces.getdatastore.namespaces.listdatastore.statistics.getdatastore.statistics.listresourcemanager.projects.getresourcemanager.projects.list | 
对 Firestore 数据库中的数据的读/写访问权限。适用于应用开发者和服务账号。 | 
roles/datastore.viewer | 
appengine.applications.getdatastore.databases.getdatastore.databases.getMetadatadatastore.databases.listdatastore.entities.getdatastore.entities.listdatastore.indexes.getdatastore.indexes.listdatastore.namespaces.getdatastore.namespaces.listdatastore.statistics.getdatastore.statistics.listresourcemanager.projects.getresourcemanager.projects.listdatastore.insights.get | 
对所有 Firestore 资源的读取访问权限。 | 
roles/datastore.importExportAdmin | 
appengine.applications.getdatastore.databases.exportdatastore.databases.getMetadatadatastore.databases.importdatastore.operations.canceldatastore.operations.getdatastore.operations.listresourcemanager.projects.getresourcemanager.projects.list | 
拥有管理导入和导出的完整访问权限。 | 
roles/datastore.bulkAdmin | 
resourcemanager.projects.getresourcemanager.projects.listdatastore.databases.getMetadatadatastore.databases.bulkDeletedatastore.operations.canceldatastore.operations.getdatastore.operations.list | 
拥有管理批量操作的完整权限。 | 
roles/datastore.indexAdmin | 
appengine.applications.getdatastore.databases.getMetadatadatastore.indexes.*datastore.operations.listdatastore.operations.getresourcemanager.projects.getresourcemanager.projects.list | 
拥有索引定义的完全管理权限。 | 
roles/datastore.keyVisualizerViewer | 
datastore.databases.getMetadatadatastore.keyVisualizerScans.getdatastore.keyVisualizerScans.listresourcemanager.projects.getresourcemanager.projects.list | 
拥有对 Key Visualizer 扫描结果的完整访问权限。 | 
roles/datastore.backupSchedulesViewer | 
  datastore.backupSchedules.getdatastore.backupSchedules.list | 
拥有对 Firestore 数据库中备份时间表的读取权限。 | 
roles/datastore.backupSchedulesAdmin | 
  datastore.backupSchedules.getdatastore.backupSchedules.listdatastore.backupSchedules.createdatastore.backupSchedules.updatedatastore.backupSchedules.deletedatastore.databases.listdatastore.databases.getMetadata | 
拥有对 Firestore 数据库中的备份时间表的完整访问权限。 | 
roles/datastore.backupsViewer | 
  datastore.backups.getdatastore.backups.list | 
拥有对 Firestore 位置中的备份信息的读取权限。 | 
roles/datastore.backupsAdmin | 
  datastore.backups.getdatastore.backups.listdatastore.backups.delete | 
拥有对 Firestore 位置中的备份的完整访问权限。 | 
roles/datastore.restoreAdmin | 
  datastore.backups.getdatastore.backups.listdatastore.backups.restoreDatabasedatastore.databases.listdatastore.databases.createdatastore.databases.getMetadatadatastore.operations.listdatastore.operations.get | 
能够将 Firestore 备份恢复到新数据库中。此角色还让您能够创建新数据库,但不一定是通过从备份进行恢复来创建。 | 
roles/datastore.cloneAdmin | 
  datastore.databases.clonedatastore.databases.listdatastore.databases.createdatastore.databases.getMetadatadatastore.operations.listdatastore.operations.get | 
能够将 Firestore 数据库克隆到新数据库中。此角色还让您能够创建新数据库,但不一定是通过克隆来实现。 | 
roles/datastore.statisticsViewer | 
  resourcemanager.projects.getresourcemanager.projects.listdatastore.databases.getMetadatadatastore.insights.getdatastore.keyVisualizerScans.getdatastore.keyVisualizerScans.listdatastore.statistics.listdatastore.statistics.get | 
拥有对分析洞见、统计数据和 Key Visualizer 扫描的读取权限。 | 
自定义角色
如果预定义角色不能满足您的业务需求,您可以使用指定的权限定义自己的自定义角色:
创建和管理标记所需的角色
如果在创建或恢复操作中表示任何标记,则需要某些角色。如需详细了解如何在将标记键值对与数据库资源相关联之前创建这些标记键值对,请参阅创建和管理标记。
以下列出的权限是必需的。
查看代码
datastore.databases.listTagBindingsdatastore.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.clone | 
克隆数据库。 | |
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 Conditions 来定义和强制执行条件式访问权限控制。
例如,以下条件会为主账号分配 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 Conditions,请参阅配置临时访问权限。
如需了解如何为访问一个或多个数据库配置 IAM Conditions,请参阅配置数据库访问条件。
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 角色在控制台中处于隐藏状态。