Configurar el acceso adecuado para una extensión

Para que una extensión realice sus acciones 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 un usuario no humano que puede realizar llamadas API autorizadas a 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 elimina la cuenta de servicio de la extensión.

Las cuentas de servicio creadas para extensiones tienen el formato:

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

Firebase limita el acceso de una extensión a un proyecto y sus datos asignando roles específicos (paquetes de permisos) a la cuenta de servicio de la extensión. Cuando crea una extensión, determina qué roles requiere su extensión para operar, luego enumera estos roles y la razón por la que su extensión necesita estos roles en su archivo extension.yaml (vea el ejemplo al final de esta página).

Determine qué roles requiere su extensión

Cuando crea su extensión, determina el nivel de acceso que su extensión requiere para funcionar.

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

  1. Determine si su extensión interactúa con un producto:

    • Si su extensión interactúa con un producto , entonces debe darle acceso a su extensión a ese producto.

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

    • Si su extensión solo escucha un evento desencadenante de un producto , entonces su extensión no necesita una función asociada con ese producto.

      Por ejemplo, si su extensión se activa al escribir en una instancia de Realtime Database (pero no escribe nada en la base de datos), entonces su extensión no necesita una función de Realtime Database.

  2. Una vez que haya determinado con qué productos interactúa su extensión, debe decidir qué función se requiere para esa interacción específica. Algunos productos ofrecen diferentes roles según la acción o conjunto de acciones realizadas.

    Por ejemplo, digamos que su extensión interactúa con un depósito de Cloud Storage. La función storage.objectCreator permitiría a la extensión crear un objeto en un depósito de Cloud Storage, pero esa función no permitiría que la extensión vea, elimine o sobrescriba objetos. Para permitir que la extensión realice esas acciones adicionales, debe asignar la función storage.objectAdmin .

Consulte la sección en la parte inferior de esta página para ver todos los roles admitidos que puede asignar a la cuenta de servicio de su extensión. Para obtener información sobre la descripción de cada función y los permisos otorgados, visita la documentación de Firebase o la documentación de Google Cloud . También puedes buscar roles en el panel de administración e IAM de la consola de Google Cloud.

Cómo asignar roles a una extensión

Enumere las funciones de IAM necesarias para que su extensión funcione en la sección roles de su archivo extension.yaml .

A continuación se muestra un ejemplo de una extensión que escucha una ruta de base de datos Firebase Realtime especificada. 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). Observe lo siguiente:

  • Aunque la extensión se activa a partir de un evento de Realtime Database, la función firebasedatabase.admin no aparece en la lista (escuchar no se considera una interacción ).
  • Dado que la extensión interactúa con la autenticación y la mensajería en la nube, la extensión 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 su archivo extension.yaml , use los siguientes campos para asignar una función a la cuenta de servicio de una extensión:

Campo Tipo Descripción
role
(requerido)
cadena Nombre del rol de IAM que necesita la extensión para operar
reason
(requerido)
cadena

Breve descripción del motivo por el cual la extensión necesita el acceso otorgado por el rol

Asegúrese de proporcionar suficientes detalles para que el usuario pueda comprender cómo la extensión utiliza la función.

resource
(opcional)
cadena

A qué política de IAM del recurso se debe agregar este rol. Si se omite, el valor predeterminado es projects/${project_id} .

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

Reducir el alcance de los roles.

Las extensiones deben seguir el principio de privilegio mínimo y solo solicitar acceso a los recursos que necesitan. Puede limitar el alcance de acceso de una extensión utilizando el campo role.resource . Por ejemplo, si tu extensión necesita escribir objetos en un depósito de Cloud Storage, puedes usar la siguiente función:

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 depósito que necesita y no a otros en el mismo proyecto.

Este campo admite proyectos ( projects/{project_id} ) y depósitos de almacenamiento ( projects/{project_id}/buckets/{bucket_id} ).

Roles admitidos para extensiones

En la siguiente tabla se enumeran las funciones de IAM admitidas para interactuar con los productos de Firebase. La mayoría de los roles en esta tabla son roles a nivel de producto de Firebase , pero algunos son administrados directamente por Google Cloud (específicamente, Cloud Firestore y Cloud Storage ).

Productos de base de fuego

Si su extensión interactúa con... Asigna uno de estos roles...
Tienda de fuego en la nube almacén de datos.importExportAdmin
almacén de datos.indexAdmin
almacén de datos.propietario
almacén de datos.usuario
almacén de datos.visor
Almacenamiento en la nube para Firebase almacenamiento.admin
almacenamiento.objectAdmin
almacenamiento.objectCreator
almacenamiento.objectViewer
Distribución de aplicaciones Firebase firebaseappdistro.admin
firebaseappdistro.viewer
Autenticación de base de fuego firebaseauth.admin
firebaseauth.visor
Pruebas A/B de Firebase firebaseabt.admin
firebaseabt.visor
Mensajería en la nube de Firebase notificaciones de base de fuego.admin
firebasenotifications.visor
Crashlytics de base de fuego firebasecrashlytics.admin
firebasecrashlytics.viewer
Alojamiento base de fuego firebasehosting.admin
firebasehosting.visor
Mensajería en la aplicación de Firebase firebaseinappmessaging.admin
firebaseinappmessaging.viewer
ML de base de fuego firebaseml.admin
firebaseml.visor
Monitoreo del rendimiento de Firebase firebaserendimiento.viewer
FirebasePerformance.lector
firebaserendimiento.escritor
Base de datos en tiempo real de Firebase base de datos basada en fuego.admin
firebasedatabase.viewer
Reglas de seguridad firebaserules.visor
firebaserules.desarrollador
firebaserules.deployer
Google analitico firebaseanalytics.admin
firebaseanalytics.visor

Productos de Google Cloud

Obtenga información sobre estos roles en la documentación de Google Cloud .

Si su extensión interactúa con... Asigna uno de estos roles...
Comportamiento acciones.Admin
acciones.Visor
apigeo apigee.analyticsAgente
apigee.analyticsEditor
apigee.analyticsViewer
apigee.apiCreador
apigee.deployer
apigee.desarrolladorAdmin
apigee.readOnlyAdmin
apigee.synchronizerManager
Motor de aplicaciones appengine.appAdmin
appengine.appViewer
appengine.codeViewer
appengine.deployer
appengine.servicioAdmin
AutoML editor automático
predictor.automl
visor.automl
Gran consulta bigquery.connectionAdmin
bigquery.connectionUsuario
bigquery.dataEditor
bigquery.dataPropietario
bigquery.dataViewer
bigquery.jobUsuario
bigquery.metadataViewer
bigquery.readSessionUser
bigquery.usuario
Mesa grande en la nube lector de tabla grande
bigtable.usuario
bigtable.visor
Facturación visor.de facturación
Chats de Hangouts chat.propietario
chat.lector
Activo de la nube propietario de cloudasset
visor.cloudasset
Fusión de datos en la nube datafusion.admin
visor.datafusion
Depurador de la nube agente.clouddebugger
usuario.clouddebugger
Funciones de la nube funciones en la nube.invoker
funciones en la nube.viewer
IAP en la nube iap.admin
iap.httpsResourceAccessor
iap.settingsAdmin
iap.tunnelResourceAccessor
IoT en la nube cloudiot.deviceController
cloudiot.editor
cloudiot.provisioner
cloudiot.visor
Perfilador de Stackdriver agente.cloudprofiler
usuario.cloudprofiler
Programador de la nube cloudcheduler.admin
cloudcheduler.jobRunner
visor.cloudscheduler
Escáner de seguridad en la nube cloudsecurityscanner.editor
cloudsecurityscanner.runner
visor.cloudsecurityscanner.viewer
SQL en la nube nubesql.cliente
nubesql.editor
visor.cloudsql
Seguimiento de la nube nubetrace.admin
agente.cloudtrace
usuario.cloudtrace
Flujo de datos flujo de datos.desarrollador
flujo de datos.visor
flujo de datos.trabajador
Flujo de diálogo flujo de diálogo.admin
flujo de diálogo.cliente
lector de flujo de diálogo
Prevención de pérdida de datos en la nube lector dlp
dlp.usuario
Error al reportar errorreporting.usuario
errorreporting.viewer
errorreporting.escritor
Eventarc eventarc.editor
eventarc.eventReceiver
Almacén de archivos en la nube archivo.editor
visor.de.archivos
Inicio sesión logging.configEscritor
logging.logWriter
registro.privateLogViewer
logging.viewer
Motor de aprendizaje automático ml.desarrollador
ml.jobPropietario
ml.modelPropietario
ml.modelUsuario
ml.operaciónPropietario
ml.visor
Supervisión monitorización.editor
monitoreo.metricWriter
monitorización.visor
Cuadernos de IA cuadernos.admin
cuadernos.visor
Pub/Sub pubsub.editor
pubsub.editor
pubsub.suscriptor
pubsub.visor
Tienda de memoria Redis redis.editor
redis.visor
Ejecutar en la nube ejecutar.invoker
Fuente lector.fuente
fuente.escritor
Llave de nube llave inglesa.databaseAdmin
llave inglesa.databaseReader
llave inglesa.base de datosUsuario
llave inglesa.visor
Uso del servicio serviceusage.apiKeysMetadataViewer
Servicio de transferencia de almacenamiento en la nube almacenamientotransfer.usuario
almacenamientotransfer.viewer
Transcodificador en la nube transcodificador.admin
transcodificador.visor
IA de vértice aiplatform.usuario
Otro kit de herramientas de identidad.admin
kit de herramientas de identidad.visor