Seguridad para las bibliotecas cliente del servidor

Cuando usas las bibliotecas cliente del servidor para Firestore, puedes administrar los recursos con administración de identidades y accesos (IAM). IAM te permite otorgar acceso más detallado a recursos Google Cloud específicos y evita el acceso no deseado a otros recursos. En esta página, se describen las funciones y los permisos de IAM para Firestore. Para ver una descripción detallada de IAM, lee la documentación de IAM.

IAM te permite adoptar el principio de seguridad de menor privilegio, de manera que solo otorgues el acceso necesario a tus recursos.

IAM te permite configurar políticas para controlar quién (usuario) tiene qué (función) permiso para qué recursos. Las políticas de IAM asignan una o más funciones a un usuario, lo que le otorga ciertos permisos. Por ejemplo, puedes asignar la función datastore.indexAdmin a un usuario, lo que le permite crear, modificar, borrar, mostrar o ver índices.

Permisos y funciones

En esta sección, se resumen los permisos y las funciones que admite Firestore.

Permisos obligatorios para los métodos de API

La siguiente tabla muestra los permisos que debe tener el emisor para ejecutar cada acción:

Método Permisos necesarios
projects.databases.documents
batchGet datastore.entities.get
Actualización o transformación de batchWrite con la condición previa exists configurada como false datastore.entities.create
Actualización o transformación de batchWrite con la condición previa exists configurada como true datastore.entities.create
Actualización o transformación de batchWrite sin condición previa datastore.entities.create
datastore.entities.update
beginTransaction datastore.databases.get
Actualización o transformación de commit con la condición previa exists configurada como false datastore.entities.create
Actualización o transformación de commit con la condición previa exists configurada como true datastore.entities.update
Actualización o transformación de commit sin condición previa datastore.entities.create
datastore.entities.update
Borrar commit datastore.entities.delete
createDocument datastore.entities.create
delete datastore.entities.delete
get datastore.entities.get
list datastore.entities.get
datastore.entities.list
listCollectionIds datastore.entities.list
partitionQuery datastore.entities.get
datastore.entities.list
patch datastore.entities.update
rollback datastore.databases.get
runAggregationQuery datastore.entities.get
datastore.entities.list
runQuery datastore.entities.get
datastore.entities.list
Actualización o transformación de write (RPC) con la condición previa exists configurada como false datastore.entities.create
Actualización o transformación de write (RPC) con la condición previa exists configurada como true datastore.entities.update
Actualización o transformación de write (RPC) sin condición previa datastore.entities.create
datastore.entities.update
Borrar write (RPC) datastore.entities.delete
projects.databases.indexes
create datastore.indexes.create
delete datastore.indexes.delete
get datastore.indexes.get
list datastore.indexes.list
projects.databases
create datastore.databases.create

Si tu solicitud de create contiene un valor de tags, se requieren los siguientes permisos adicionales:

  • datastore.databases.createTagBinding

Si deseas verificar si las vinculaciones de etiquetas se establecieron correctamente enumerándolas, se requieren los siguientes permisos adicionales:

  • datastore.databases.listTagBindings
  • datastore.databases.listEffectiveTags
delete datastore.databases.delete
get datastore.databases.getMetadata
list datastore.databases.list
patch datastore.databases.update
restablecer datastore.backups.restoreDatabase
projects.locations
get datastore.locations.get
list datastore.locations.list
projects.databases.backupschedules
get datastore.backupSchedules.get
list datastore.backupSchedules.list
create datastore.backupSchedules.create
update datastore.backupSchedules.update
borrar datastore.backupSchedules.delete
projects.locations.backups
get datastore.backups.get
list datastore.backups.list
borrar datastore.backups.delete

Funciones predefinidas

Con la IAM, cada método de API en Firestore exige que la cuenta que envía la solicitud a la API tenga los permisos apropiados para usar el recurso. Para otorgar los permisos, se configuran políticas que asignan funciones a un usuario, un grupo o una cuenta de servicio. Además de las funciones básicas, propietario, editor y lector, puedes otorgar funciones de Firestore a los usuarios del proyecto.

En la siguiente tabla, se muestran las funciones de IAM para Firestore. Puedes asignar varias funciones a un usuario, un grupo o una cuenta de servicio.

Función Permisos Descripción
roles/datastore.owner appengine.applications.get

datastore.*

resourcemanager.projects.get
resourcemanager.projects.list
Acceso completo a Firestore.
roles/datastore.user appengine.applications.get

datastore.databases.get
datastore.databases.getMetadata
datastore.databases.list
datastore.entities.*
datastore.indexes.list
datastore.namespaces.get
datastore.namespaces.list
datastore.statistics.get
datastore.statistics.list

resourcemanager.projects.get
resourcemanager.projects.list
Acceso de lectura y escritura a los datos de una base de datos de Firebase. Pensado para programadores de aplicaciones y cuentas de servicio.
roles/datastore.viewer appengine.applications.get

datastore.databases.get
datastore.databases.getMetadata
datastore.databases.list
datastore.entities.get
datastore.entities.list
datastore.indexes.get
datastore.indexes.list
datastore.namespaces.get
datastore.namespaces.list
datastore.statistics.get
datastore.statistics.list

resourcemanager.projects.get
resourcemanager.projects.list

datastore.insights.get
Acceso de lectura a todos los recursos de Firestore.
roles/datastore.importExportAdmin appengine.applications.get
datastore.databases.export
datastore.databases.getMetadata
datastore.databases.import
datastore.operations.cancel
datastore.operations.get
datastore.operations.list
resourcemanager.projects.get
resourcemanager.projects.list
Acceso total para administrar importaciones y exportaciones.
roles/datastore.bulkAdmin resourcemanager.projects.get
resourcemanager.projects.list
datastore.databases.getMetadata
datastore.databases.bulkDelete
datastore.operations.cancel
datastore.operations.get
datastore.operations.list
Tiene acceso completo para administrar operaciones masivas.
roles/datastore.indexAdmin appengine.applications.get

datastore.databases.getMetadata

datastore.indexes.*

resourcemanager.projects.get
resourcemanager.projects.list
Acceso completo para administrar definiciones de índices.
roles/datastore.keyVisualizerViewer datastore.databases.getMetadata
datastore.keyVisualizerScans.get
datastore.keyVisualizerScans.list
resourcemanager.projects.get
resourcemanager.projects.list
Tiene acceso completo a los análisis de Key Visualizer.
roles/datastore.backupSchedulesViewer datastore.backupSchedules.get
datastore.backupSchedules.list
Tiene acceso de lectura a las programaciones de copias de seguridad en una base de datos de Firestore.
roles/datastore.backupSchedulesAdmin datastore.backupSchedules.get
datastore.backupSchedules.list
datastore.backupSchedules.create
datastore.backupSchedules.update
datastore.backupSchedules.delete
datastore.databases.list
datastore.databases.getMetadata
Acceso completo a las programaciones de copias de seguridad en una base de datos de Firestore.
roles/datastore.backupsViewer datastore.backups.get
datastore.backups.list
Tiene acceso de lectura a la información de copias de seguridad en una ubicación de Firestore.
roles/datastore.backupsAdmin datastore.backups.get
datastore.backups.list
datastore.backups.delete
Acceso completo a las copias de seguridad en una ubicación de Firestore
roles/datastore.restoreAdmin datastore.backups.get
datastore.backups.list
datastore.backups.restoreDatabase
datastore.databases.list
datastore.databases.create
datastore.databases.getMetadata
datastore.operations.list
datastore.operations.get
Capacidad para restablecer una copia de seguridad de Firestore en una base de datos nueva Este rol también permite crear bases de datos nuevas, no necesariamente a partir de una copia de seguridad.
roles/datastore.statisticsViewer resourcemanager.projects.get
resourcemanager.projects.list
datastore.databases.getMetadata
datastore.insights.get
datastore.keyVisualizerScans.get
datastore.keyVisualizerScans.list
datastore.statistics.list
datastore.statistics.get
Tiene acceso de lectura a los análisis de Observaciones, Estadísticas y Key Visualizer.

Funciones personalizadas

Si los roles predefinidos no responden a tus requisitos comerciales, puedes definir tus propios roles personalizados con los permisos que especifiques:

Roles obligatorios para crear y administrar etiquetas

Si alguna etiqueta está representada en las acciones de creación o restablecimiento, se requieren algunos roles. Consulta Crea y administra etiquetas para obtener más detalles sobre cómo crear pares clave-valor de etiquetas antes de asociarlos a los recursos de la base de datos.

Se requieren los siguientes permisos.

Visualiza etiquetas
  • datastore.databases.listTagBindings
  • datastore.databases.listEffectiveTags
Administra etiquetas en los recursos

Se requiere el siguiente permiso para el recurso de base de datos al que adjuntas el valor de la etiqueta.

  • datastore.databases.createTagBinding

Permisos

En la siguiente tabla, se enumeran los permisos que admite Firestore.

Nombre del permiso de la base de datos Descripción
datastore.databases.get Inicia o revierte una transacción.
datastore.databases.import Importa entidades a una base de datos.
datastore.databases.export Exporta entidades de una base de datos.
datastore.databases.bulkDelete Borra entidades de forma masiva de una base de datos.
datastore.databases.getMetadata Lee metadatos de una base de datos.
datastore.databases.list Enumera las bases de datos de un proyecto.
datastore.databases.create Crea una base de datos.
datastore.databases.update Actualiza una base de datos.
datastore.databases.delete Borra una base de datos.
datastore.databases.createTagBinding Crea una vinculación de etiquetas para una base de datos.
datastore.databases.deleteTagBinding Borra una vinculación de etiqueta para una base de datos.
datastore.databases.listTagBindings Enumera todas las vinculaciones de etiquetas de una base de datos.
datastore.databases.listEffectiveTagBindings Enumera las vinculaciones de etiquetas efectivas para una base de datos.
Nombre del permiso de la entidad Descripción
datastore.entities.create Crea un documento.
datastore.entities.delete Borra un documento.
datastore.entities.get Lee un documento.
datastore.entities.list Enumera los nombres de los documentos de un proyecto.
(datastore.entities.get es obligatorio para acceder a los datos del documento).
datastore.entities.update Actualiza un documento.
Nombre del permiso de índice Descripción
datastore.indexes.create Crea un índice.
datastore.indexes.delete Borra un índice.
datastore.indexes.get Lee metadatos de un índice.
datastore.indexes.list Muestra los índices de un proyecto.
datastore.indexes.update Actualiza un índice.
Nombre del permiso de la operación Descripción
datastore.operations.cancel Cancela una operación de larga duración.
datastore.operations.delete Borra una operación de larga duración.
datastore.operations.get Obtiene el último estado de una operación de larga duración.
datastore.operations.list Muestra las operaciones de larga duración.
Nombre del permiso de proyecto Descripción
resourcemanager.projects.get Busca recursos en el proyecto.
resourcemanager.projects.list Muestra los proyectos propios.
Nombre del permiso de ubicación Descripción
datastore.locations.get Obtén detalles sobre la ubicación de una base de datos. Obligatorio para crear una nueva base de datos.
datastore.locations.list Enumera las ubicaciones de las bases de datos disponibles. Obligatorio para crear una nueva base de datos.
Nombre del permiso de Key Visualizer Descripción
datastore.keyVisualizerScans.get Obtén detalles sobre los análisis de Key Visualizer.
datastore.keyVisualizerScans.list Enumera los análisis de Key Visualizer disponibles.
Nombre del permiso de la programación de copias de seguridad Descripción
datastore.backupSchedules.get Obtiene detalles sobre una programación de copias de seguridad.
datastore.backupSchedules.list Enumera los programas de copias de seguridad disponibles.
datastore.backupSchedules.create Crea una programación de copias de seguridad.
datastore.backupSchedules.update Actualiza una programación de copia de seguridad.
datastore.backupSchedules.delete Borra una programación de copia de seguridad.
Nombre del permiso de la copia de seguridad Descripción
datastore.backups.get Obtiene detalles sobre una copia de seguridad.
datastore.backups.list Enumera las copias de seguridad disponibles.
datastore.backups.delete Borra una copia de seguridad.
datastore.backups.restoreDatabase Restablece una base de datos a partir de una copia de seguridad.
Nombre del permiso de Insights Descripción
datastore.insights.get Obtén estadísticas sobre un recurso

Latencia del cambio de funciones

Firestore almacena los permisos de IAM en caché durante 5 minutos, por lo que un cambio de función tarda hasta 5 minutos en aplicarse.

Administra IAM de Firestore

Puedes obtener y configurar políticas de IAM con la Google Cloud consola, la API de IAM o la herramienta de línea de comandos degcloud. Consulta cómo otorgar, cambiar y revocar el acceso de los miembros del proyecto para ver detalles.

Configura permisos de acceso condicional

Puedes usar las condiciones de IAM para definir y aplicar el control de acceso condicional.

Por ejemplo, la siguiente condición asigna a un principal el rol datastore.user hasta una fecha especificada:

{
  "role": "roles/datastore.user",
  "members": [
    "user:travis@example.com"
  ],
  "condition": {
    "title": "Expires_December_1_2023",
    "description": "Expires on December 1, 2023",
    "expression":
      "request.time < timestamp('2023-12-01T00:00:00.000Z')"
  }
}

Si quieres obtener información para definir condiciones de IAM para el acceso temporal, consulta Configura el acceso temporal.

Si quieres obtener información para configurar condiciones de IAM para el acceso a una o más bases de datos, consulta Cómo configurar condiciones de acceso a la base de datos.

Dependencia de las reglas de seguridad en IAM

Las reglas de seguridad de Firestore para clientes de dispositivos móviles o la Web dependen de la siguiente vinculación de IAM y la cuenta de servicio:

Cuenta de servicio Función de IAM
service-project_number@firebase-rules.iam.gserviceaccount.com roles/firebaserules.system

Firebase configura esta cuenta de servicio de forma automática. Si quitas la función firebaserules.system de esta cuenta de servicio, las reglas de seguridad rechazarán todas las solicitudes. Para restablecer esta vinculación de IAM, usa el siguiente comando de la CLI de gcloud:

gcloud projects add-iam-policy-binding project_id \
--member=serviceAccount:service-project_number@firebase-rules.iam.gserviceaccount.com \
--role=roles/firebaserules.system

Para determinar el project_id y el project_number, consulta Identifica proyectos.

Usa Google Cloud CLI en lugar de la consola de Google Cloud , ya que el rol defirebaserules.systemestá oculto en la consola de forma predeterminada.

¿Qué sigue?