Configura el acceso adecuado para una extensión

Para que una extensión pueda realizar las acciones que tiene especificadas, Firebase otorga a cada instancia de una extensión instalada acceso limitado al proyecto y sus datos a través de una cuenta de servicio.

¿Qué es una cuenta de servicio?

Una cuenta de servicio es un tipo especial de cuenta de usuario de Google. Representa a un usuario no humano que puede realizar llamadas autorizadas a la API para usar los servicios de Google.

Durante la instalación de una extensión, Firebase crea una cuenta de servicio para la extensión en el proyecto. Cada instancia instalada de una extensión tiene su propia cuenta de servicio. Si se desinstala una instancia de extensión, Firebase borra la cuenta de servicio correspondiente.

Las cuentas de servicio creadas para las extensiones tienen el siguiente formato:

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

Firebase limita el acceso de las extensiones a los proyectos y sus datos mediante la asignación de funciones (conjuntos de permisos) específicas a las cuentas de servicio correspondientes. Cuando creas una extensión, debes determinar qué funciones requiere para funcionar y, luego, enumerarlas en el archivo extension.yaml junto con los motivos por los cuales la extensión las necesita (consulta el ejemplo en la parte inferior de esta página).

Determina qué funciones necesita tu extensión

Cuando compilas una extensión, debes determinar el nivel de acceso que requiere para funcionar.

Durante la instalación, Firebase CLI le solicita al usuario que acepte el nivel de acceso otorgado por cada rol. Si la extensión solicita más funciones de las que realmente necesita, es menos probable que los usuarios la instalen.

  1. Determina si tu extensión interactúa con un producto:

    • Si la extensión interactúa con un producto, debes darle acceso a ese producto.

      Por ejemplo, si tu extensión escribe datos en una instancia de Realtime Database, tu extensión necesita un rol Realtime Database (específicamente, firebasedatabase.admin).

    • Si tu extensión solo detecta los eventos de activación de un producto, entonces no necesita una función asociada con ese producto.

      Por ejemplo, si la extensión se activa cuando se escriben datos en una instancia de Realtime Database (pero no realiza escrituras en la base de datos), entonces no necesita un rol de Realtime Database.

  2. Después de determinar con qué productos interactúa la extensión, debes decidir qué función se requiere para esa interacción específica. Algunos productos ofrecen diferentes funciones según la acción o el conjunto de acciones realizadas.

    Por ejemplo, supongamos que la extensión interactúa con un bucket de Cloud Storage. El rol storage.objectCreator permitiría que la extensión create objetos en un bucket de Cloud Storage, pero no permitiría que consulte, borre o reemplace objetos. Para permitir que la extensión realice esas acciones adicionales, debes asignar el rol storage.objectAdmin en su lugar.

Consulta la sección en la parte inferior de esta página para ver todas las funciones compatibles que puedes asignar a la cuenta de servicio de la extensión. Para obtener información sobre la descripción y los permisos de cada función, consulta la documentación de Firebase o Google Cloud. También puedes buscar funciones en el panel IAM y administración de Google Cloud Console.

Cómo asignar funciones a una extensión

En la sección roles del archivo extension.yaml, enumera las funciones de IAM necesarias para que la extensión funcione.

Este es un ejemplo de una extensión que escucha una ruta de acceso de Firebase Realtime Database. Cuando se activa, la extensión actualiza el correo electrónico de una cuenta de usuario (interacción con Firebase Authentication) y envía una notificación (interacción con Firebase Cloud Messaging). Observa lo siguiente:

  • Aunque la extensión se activa a partir de un evento de Realtime Database, no se enumera el rol firebasedatabase.admin (la detección no se considera una interacción).
  • Dado que la extensión interactúa con Authentication y Cloud Messaging, requiere roles para acceder a esos productos (firebaseauth.admin y firebasenotifications.admin, respectivamente).
# 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

...

En el archivo extension.yaml, usa los siguientes campos para asignar una función a la cuenta de servicio de una extensión:

Campo Tipo Descripción
role
(obligatorio)
string Nombre de la función de IAM que necesita la extensión para operar
reason
(obligatorio)
string

Es una descripción breve del motivo por el que la extensión necesita el acceso que otorga el rol.

Asegúrate de proporcionar suficientes detalles para que los usuarios comprendan cómo la extensión usará el rol.

resource
(opcional)
string

Es la política de IAM del recurso a la que se debe agregar este rol. Si se omite, el valor predeterminado es projects/${project_id}.

Los valores admitidos son projects/* y projects/*/buckets/*.

Reduce el permiso de los roles

Las extensiones deben seguir el principio de privilegio mínimo y solo solicitar acceso a los recursos que necesitan. Usa el campo role.resource para limitar el permiso de acceso de una extensión. Por ejemplo, si la extensión necesita escribir objetos en un bucket de Cloud Storage, puedes usar el siguiente rol:

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

Esto permite que la extensión acceda solo al bucket que necesita y no a otros del mismo proyecto.

En este campo, se admiten proyectos (projects/{project_id}) y buckets de almacenamiento (projects/{project_id}/buckets/{bucket_id}).

Roles admitidos para las extensiones

En la siguiente tabla se enumeran las funciones de IAM que pueden interactuar con los productos de Firebase. La mayoría de los roles de esta tabla son Roles a nivel de producto de Firebase, pero Google Cloud administra algunas directamente (específicamente, Cloud Firestore y Cloud Storage).

Productos de Firebase

Producto con el que interactúa la extensión Roles que puedes asignar (elige uno)
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
Reglas de seguridad firebaserules.viewer
firebaserules.developer
firebaserules.deployer
Google Analytics firebaseanalytics.admin
firebaseanalytics.viewer

Productos de Google Cloud

Obtén más información sobre estos roles en la documentación de Google Cloud.

Producto con el que interactúa la extensión Roles que puedes asignar (elige uno)
Acciones 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
Facturación billing.viewer
Hangouts Chat chat.owner
chat.reader
Recursos de nube 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
Supervisión monitoring.editor
monitoring.metricWriter
monitoring.viewer
AI Notebooks notebooks.admin
notebooks.viewer
Pub/Sub pubsub.editor
pubsub.publisher
pubsub.subscriber
pubsub.viewer
Redis para Memorystore redis.editor
redis.viewer
Cloud Run run.invoker
Fuente source.reader
source.writer
Cloud Spanner spanner.databaseAdmin
spanner.databaseReader
spanner.databaseUser
spanner.viewer
Service Usage serviceusage.apiKeysMetadataViewer
Servicio de transferencia de almacenamiento de Cloud storagetransfer.user
storagetransfer.viewer
Cloud Transcoder transcoder.admin
transcoder.viewer
Vertex AI aiplatform.user
Otro identitytoolkit.admin
identitytoolkit.viewer