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.
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.
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ónstorage.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
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 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 Los valores admitidos son |
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 |