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.
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.
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 rolstorage.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
yfirebasenotifications.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
Los valores admitidos son |
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 |