服务器客户端库的安全性

使用 Firestore 的服务器客户端库时,您可以使用身份和访问权限管理 (IAM) 来管理对您的资源的访问权限。 IAM 允许您为特定 Google Cloud Platform 资源指定更细化的访问权限,同时防止对其他资源的不必要访问。本页面介绍 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
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 delete 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) 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
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
对所有 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.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 备份恢复到新的数据库。此角色还可用于创建新数据库,不一定需要从备份恢复。

自定义角色

如果预定义角色不能满足您的独特业务需求,您可以使用指定的权限定义自己的自定义角色:

权限

下表列出了 Firestore 支持的权限。

数据库权限名称 说明
datastore.databases.get 开始或回滚事务。
datastore.databases.import 将实体导入到数据库中。
datastore.databases.export 从数据库中导出实体。
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 从备份恢复数据库。

角色更改延迟时间

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_idproject_number,请参阅识别项目

请使用 Google Cloud CLI 而不是 Google Cloud 控制台,因为在默认情况下,firebaserules.system 角色在控制台中处于隐藏状态。

后续步骤