服务器客户端库的安全性

使用 Firestore 的服务器客户端库时,您可以使用身份和访问权限管理 (IAM) 来管理对您的资源的访问权限。IAM 允许您为特定 Google Cloud Platform 资源指定更细化的访问权限,同时防止对其他资源的不必要访问。本页面介绍 Firestore 的 IAM 权限和角色。如需更详细的 Cloud IAM 说明,请参阅 IAM 文档

IAM 允许您采用最小权限安全原则,因此您只需授予对您的资源的必要访问权限即可。

IAM 允许您通过设置 IAM 策略来控制谁(用户)哪些资源具有什么(角色)权限。您可以使用 IAM 策略向用户授予一个或多个角色,给予用户某些权限。例如,您可以向用户授予 datastore.indexAdmin 角色,允许用户创建、修改、删除、列出或查看索引。

权限和角色

本部分概况了 Firestore 支持的权限和角色。

所需权限

下表列出了调用者执行各个操作所必需的权限:

方法 所需权限
projects.databases.documents
batchGet datastore.entities.get
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
patch datastore.entities.update
rollback datastore.databases.get
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

角色

有了 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.entities.*
datastore.indexes.list
datastore.namespaces.get
datastore.namespaces.list

resourcemanager.projects.get
resourcemanager.projects.list
对 Firestore 数据库中的数据的读/写访问权限。适用于应用开发者和服务帐号。
roles/datastore.viewer appengine.applications.get

datastore.databases.get
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.indexAdmin appengine.applications.get

datastore.indexes.*

resourcemanager.projects.get
resourcemanager.projects.list
拥有索引定义的完全管理权限。

权限

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

数据库权限名称 说明
datastore.databases.get 开始或回滚事务。
从数据库中读取元数据。
实体权限名称 说明
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 更新索引。
项目权限名称 说明
resourcemanager.projects.get 浏览项目中的资源。
resourcemanager.projects.list 列出拥有的项目。

角色更改延迟时间

Firestore 会将 IAM 权限缓存 5 分钟,因此角色更改最多需要 5 分钟才会生效。

管理 Firestore IAM

您可以使用 Google Cloud Console、IAM API 或 gcloud 命令行工具来获取和设置 IAM 政策。如需了解详情,请参阅授予、更改和撤消项目成员的访问权限

IAM 的安全规则依赖关系

适用于移动设备/网页客户端的 Firestore 安全规则依赖于以下服务帐号和 IAM 绑定:

服务帐号 IAM 角色
service-project_number@firebase-rules.iam.gserviceaccount.com roles/firebaserules.system

Firebase 会自动为您设置此服务帐号。如果您从此服务帐号中移除 firebaserules.system 角色,您的安全规则将拒绝所有请求。要恢复此 IAM 绑定,请使用以下 gcloud 工具命令:

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

请使用 gcloud 命令行工具(而非 Cloud Console),因为在默认情况下,firebaserules.system 角色在 Console 中处于隐藏状态。

后续步骤