为扩展程序设置适当的访问权限

对于要执行指定操作的扩展程序,Firebase 会通过服务帐号向所安装的扩展程序的每个实例授予对项目及其数据的受限访问权限。

什么是服务帐号?

服务帐号是一种特殊类型的 Google 用户帐号。它代表对 Google 服务执行已获授权的 API 调用的非人类用户。

在扩展程序安装期间,Firebase 会在项目中为该扩展程序创建一个服务帐号。每个已安装的扩展程序实例都有自己的服务帐号。如果卸载了某个扩展程序实例,Firebase 会删除该扩展程序的服务帐号。

为扩展程序创建的服务帐号采用以下格式:

ext-extension-instance-id@project-id.iam.gserviceaccount.com

Firebase 通过将特定角色(一组权限)分配给扩展程序的服务帐号,来限制该扩展程序对项目及其数据的访问权限。构建扩展程序时,您需要确定运行扩展程序所需的角色,然后在 extension.yaml 文件中列出这些角色以及扩展程序需要它们的原因(请参阅本页底部的示例)。

确定扩展程序需要哪些角色

构建扩展程序时,您需要确定运行扩展程序所需的访问权限级别。

在安装过程中,Firebase CLI 会提示用户接受每个角色所授予的访问权限级别。如果您的扩展程序请求的角色超出其实际需要,则用户不太可能会安装该扩展程序。

  1. 确定扩展程序是否与产品交互:

    • 如果扩展程序要与产品交互,那么您需要向扩展程序授予对该产品的访问权限

      例如,如果扩展程序将数据写入到实时数据库实例,则扩展程序需要一个实时数据库角色(具体来说就是 firebasedatabase.admin

    • 如果扩展程序只侦听产品中的触发事件,则该扩展程序需要与该产品关联的角色

      例如,如果扩展程序在实时数据库实例发生写入事件时触发(但不向数据库写入任何内容),则扩展程序需要实时数据库角色

  2. 在确定要与扩展程序进行交互的产品之后,您需要确定每个具体交互需要哪个角色。某些产品提供不同的角色,具体取决于所执行的操作或操作组。

    例如,假设扩展程序与 Cloud Storage 存储桶进行交互。storage.objectCreator 角色将允许扩展程序在 Cloud Storage 存储桶中创建对象,但该角色不允许扩展程序查看、删除或覆盖对象。若要使扩展程序能够执行这些额外的操作,您需要改为分配 storage.objectAdmin 角色。

请参阅本页底部的部分,查看您可以为自己的扩展程序服务帐号分配的所有受支持的角色。要了解每个角色的说明及授予的权限,请参阅 Firebase 文档Google Cloud 文档。您还可以在 Google Cloud 控制台的 IAM 和管理面板中查找角色。

如何向扩展程序分配角色

extension.yaml 文件的 roles 部分列出运行扩展程序所需的 IAM 角色。

以下示例展示了侦听指定 Firebase 实时数据库路径的扩展程序示例。触发后,扩展程序会更新用户帐号电子邮件(与 Firebase Authentication 进行交互)并发送通知(与 Firebase Cloud Messaging 进行交互)。请注意以下事项:

  • 即使扩展程序通过实时数据库事件触发,系统也不会列出 firebasedatabase.admin 角色(侦听不算交互)
  • 由于扩展程序与 Authentication 和 Cloud Messaging 进行交互,因此扩展程序需要一些角色才能访问这些产品(分别为 firebaseauth.adminfirebasenotifications.admin)。
# extension.yaml
...

# Roles assigned to the extension's service account by Firebase during installation
roles:
  - role: firebaseauth.admin
    reason: Required to update the email address of the user account

  - role: firebasenotifications.admin
    reason: Required to send a notification that the email address has been updated

...

extension.yaml 文件中,使用以下字段为扩展程序的服务帐号分配角色:

字段 类型 说明
role
(必填)
字符串 运行扩展程序所需的 IAM 角色的名称
reason
(必填)
字符串

简要说明该扩展程序需要该角色授予的访问权限的原因

请务必提供足够详细的说明,以便用户了解扩展程序将如何使用该角色。

resource
(选填)
string

应将此角色添加到哪个资源的 IAM 政策。如果省略,则默认为 projects/${project_id}

支持的值包括 projects/*projects/*/buckets/*

缩小角色授予的权限范围

扩展程序应遵循最小权限原则,并且仅请求访问所需资源。您可以使用 role.resource 字段限制扩展程序的访问权限范围。例如,如果您的扩展程序需要向 Cloud Storage 存储桶写入对象,您可以使用以下角色:

roles:
  - role: storage.objectCreator
    reason: Needed in order to write
    resource: projects/${PROJECT_ID}/buckets/${STORAGE_BUCKET}

这样,扩展程序将只能访问所需的存储桶,而无权访问同一项目中的其他存储桶。

此字段支持设置项目 (projects/{project_id}) 和存储桶 (projects/{project_id}/buckets/{bucket_id})。

扩展程序支持的角色

下表列出了能够与 Firebase 产品进行交互的受支持的 IAM 角色。该表中的大多数角色都是 Firebase 产品级角色,但有些角色由 Google Cloud(具体来讲是 Cloud FirestoreCloud Storage)直接管理。

Firebase 产品

如果扩展程序与以下服务进行交互… 分配其中一种角色…
Cloud Firestore datastore.importExportAdmin
datastore.indexAdmin
datastore.owner
datastore.user
datastore.viewer
Cloud Storage for Firebase storage.admin
storage.objectAdmin
storage.objectCreator
storage.objectViewer
Firebase App Distribution firebaseappdistro.admin
firebaseappdistro.viewer
Firebase Authentication firebaseauth.admin
firebaseauth.viewer
Firebase A/B Testing firebaseabt.admin
firebaseabt.viewer
Firebase Cloud Messaging firebasenotifications.admin
firebasenotifications.viewer
Firebase Crashlytics firebasecrashlytics.admin
firebasecrashlytics.viewer
Firebase Hosting firebasehosting.admin
firebasehosting.viewer
Firebase In-App Messaging firebaseinappmessaging.admin
firebaseinappmessaging.viewer
Firebase ML firebaseml.admin
firebaseml.viewer
Firebase Performance Monitoring firebaseperformance.viewer
firebaseperformance.reader
firebaseperformance.writer
Firebase Realtime Database firebasedatabase.admin
firebasedatabase.viewer
安全规则 firebaserules.viewer
firebaserules.developer
firebaserules.deployer
Google Analytics(分析) firebaseanalytics.admin
firebaseanalytics.viewer

Google Cloud 产品

如需了解这些角色,请参阅 Google Cloud 文档

如果扩展程序与以下服务进行交互… 分配其中一种角色…
Actions actions.Admin
actions.Viewer
Apigee apigee.analyticsAgent
apigee.analyticsEditor
apigee.analyticsViewer
apigee.apiCreator
apigee.deployer
apigee.developerAdmin
apigee.readOnlyAdmin
apigee.synchronizerManager
App Engine appengine.appAdmin
appengine.appViewer
appengine.codeViewer
appengine.deployer
appengine.serviceAdmin
AutoML automl.editor
automl.predictor
automl.viewer
BigQuery bigquery.connectionAdmin
bigquery.connectionUser
bigquery.dataEditor
bigquery.dataOwner
bigquery.dataViewer
bigquery.jobUser
bigquery.metadataViewer
bigquery.readSessionUser
bigquery.user
Cloud Bigtable bigtable.reader
bigtable.user
bigtable.viewer
Billing billing.viewer
Hangout Chats chat.owner
chat.reader
Cloud Asset cloudasset.owner
cloudasset.viewer
Cloud Data Fusion datafusion.admin
datafusion.viewer
Cloud Debugger clouddebugger.agent
clouddebugger.user
Cloud Functions cloudfunctions.invoker
cloudfunctions.viewer
Cloud IAP iap.admin
iap.httpsResourceAccessor
iap.settingsAdmin
iap.tunnelResourceAccessor
Cloud IoT cloudiot.deviceController
cloudiot.editor
cloudiot.provisioner
cloudiot.viewer
Stackdriver Profiler cloudprofiler.agent
cloudprofiler.user
Cloud Scheduler cloudscheduler.admin
cloudscheduler.jobRunner
cloudscheduler.viewer
Cloud Security Scanner cloudsecurityscanner.editor
cloudsecurityscanner.runner
cloudsecurityscanner.viewer
Cloud SQL cloudsql.client
cloudsql.editor
cloudsql.viewer
Cloud Trace cloudtrace.admin
cloudtrace.agent
cloudtrace.user
Dataflow dataflow.developer
dataflow.viewer
dataflow.worker
Dialogflow dialogflow.admin
dialogflow.client
dialogflow.reader
Cloud Data Loss Prevention dlp.reader
dlp.user
Error Reporting errorreporting.user
errorreporting.viewer
errorreporting.writer
Eventarc eventarc.publisher
eventarc.eventReceiver
Cloud Filestore file.editor
file.viewer
Logging logging.configWriter
logging.logWriter
logging.privateLogViewer
logging.viewer
Machine Learning Engine ml.developer
ml.jobOwner
ml.modelOwner
ml.modelUser
ml.operationOwner
ml.viewer
Monitoring monitoring.editor
monitoring.metricWriter
monitoring.viewer
AI Notebooks notebooks.admin
notebooks.viewer
Pub/Sub pubsub.editor
pubsub.publisher
pubsub.subscriber
pubsub.viewer
Memorystore Redis redis.editor
redis.viewer
Cloud Run run.invoker
Source source.reader
source.writer
Cloud Spanner spanner.databaseAdmin
spanner.databaseReader
spanner.databaseUser
spanner.viewer
Service Usage serviceusage.apiKeysMetadataViewer
Cloud Storage Transfer Service storagetransfer.user
storagetransfer.viewer
Cloud Transcoder transcoder.admin
transcoder.viewer
Vertex AI aiplatform.user
其他 identitytoolkit.admin
identitytoolkit.viewer