服务器客户端库的安全性
使用 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
|
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.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) 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_id 和 project_number,请参阅识别项目。
请使用 Google Cloud CLI 而不是 Google Cloud 控制台,因为在默认情况下,firebaserules.system
角色在控制台中处于隐藏状态。