Administra e implementa las reglas de seguridad de Firebase

Usa Firebase CLI

Edita y también implementa las reglas con Firebase CLI. Mediante la CLI puedes mantener tus reglas bajo el control de versiones con el código de la aplicación y, además, implementar reglas como parte del proceso de implementación existente.

Genera un archivo de configuración

Cuando configuras tu proyecto de Firebase con Firebase CLI, creas un archivo de configuración .rules en el directorio del proyecto. Usa el siguiente comando para comenzar la configuración del proyecto de Firebase:

Cloud Firestore

// Set up Firestore in your project directory, creates a .rules file
firebase init firestore

Realtime Database

// Set up Realtime Database in your project directory, creates a .rules file
firebase init database

Storage

// Set up Storage in your project directory, creates a .rules file
firebase init storage

Edita y actualiza tus reglas

Edita las reglas directamente en el archivo de configuración .rules. Asegúrate de que las modificaciones que realices en Firebase CLI se reflejen en Firebase console o de realizar actualizaciones de forma coherente con Firebase console o Firebase CLI. De lo contrario, es posible que reemplaces las actualizaciones realizadas en Firebase console.

Prueba tus actualizaciones

Usa el emulador de Firebase para probar las actualizaciones de forma local y confirmar que las reglas de la app exhiben el comportamiento que deseas.

Implementa tus actualizaciones

Una vez que termines de actualizar y probar tus reglas, impleméntalas en la producción. Usa los siguientes comandos para implementar de manera selectiva tus reglas solas o hacerlo como parte de tu proceso de implementación normal.

Cloud Firestore

// Deploy your .rules file
firebase deploy --only firestore:rules

Realtime Database

// Deploy your .rules file
firebase deploy --only database

Storage

// Deploy your .rules file
firebase deploy --only storage

Usa Firebase console

También puedes realizar la edición y la implementación de reglas desde Firebase console.

Edita y actualiza tus reglas

  1. Abre Firebase console y selecciona el proyecto.
  2. A continuación, selecciona Database o Storage desde la navegación del producto.
  3. Database: Selecciona una base de datos y haz clic en Reglas para navegar hacia el editor de reglas.
  4. Storage: Haz clic en Reglas para navegar hacia el editor de reglas.
  5. Edita tus reglas directamente en el editor.

Prueba tus actualizaciones

Puedes probar el comportamiento de las reglas directamente en Firebase console, con el simulador de reglas. Abre la pantalla del simulador en el editor de reglas, modifica la configuración y haz clic en Ejecutar. Busca el mensaje de confirmación en la parte superior del editor.

Implementa tus actualizaciones

Una vez que estés satisfecho con las actualizaciones, haz clic en Publicar.

Usa el SDK de Admin

Puedes usar el SDK de Admin para Node.js a fin de crear, implementar y administrar reglas de seguridad de manera programática. Con este acceso programático, puedes hacer lo siguiente:

  • Implementa herramientas personalizadas, secuencias de comandos, paneles y canalizaciones de CI/CD para administrar las reglas.
  • Administra reglas con más facilidad en varios proyectos de Firebase.

Cuando se actualizan las reglas de manera programática, es muy importante evitar los cambios no deseados en el control de acceso de la app. Escribe el código del SDK de Admin con la seguridad en mente, especialmente cuando actualices o implementes reglas.

Otro punto importante que se debe tener en cuenta es que las reglas de seguridad de Firebase tardan varios minutos en implementarse por completo. Cuando uses el SDK de Admin para implementar reglas, asegúrate de evitar las condiciones de carrera en las que la app se basa inmediatamente en las reglas cuya implementación aún no se completó. Si tu caso práctico requiere actualizaciones frecuentes para las reglas de control de acceso, considera las soluciones que usan Cloud Firestore, que está diseñado para reducir las condiciones de carrera a pesar de las actualizaciones frecuentes.

También ten en cuenta estos límites:

  • El tamaño de las reglas deben ser menor que 64 KiB de texto codificado en UTF-8 cuando se serializan.
  • Un proyecto puede tener un máximo de 2,500 conjuntos de reglas implementados. Una vez que se alcanza este límite, debes borrar algunos conjuntos de reglas antiguos antes de crear otros nuevos.

Crea e implementa conjuntos de reglas de Storage o Cloud Firestore

Un flujo de trabajo típico para administrar reglas de seguridad con el SDK de Admin podría incluir los tres pasos discretos siguientes:

  1. Crear un archivo de reglas (opcional)
  2. Crear un conjunto de reglas
  3. Lanzar o implementar el nuevo conjunto de reglas

El SDK proporciona un método para combinar estos pasos en una sola llamada a la API para las reglas de seguridad de Storage y Cloud Firestore. Por ejemplo:

    const source = `service cloud.firestore {
      match /databases/{database}/documents {
        match /carts/{cartID} {
          allow create: if request.auth != null && request.auth.uid == request.resource.data.ownerUID;
          allow read, update, delete: if request.auth != null && request.auth.uid == resource.data.ownerUID;
        }
      }
    }`;
    // Alternatively, load rules from a file
    // const fs = require('fs');
    // const source = fs.readFileSync('path/to/firestore.rules', 'utf8');

    await admin.securityRules().releaseFirestoreRulesetFromSource(source);

Este mismo patrón funciona para las reglas de Storage con releaseFirestoreRulesetFromSource().

Como alternativa, puedes crear el archivo de reglas como un objeto en la memoria, crear el conjunto de reglas y, luego, implementar el conjunto de reglas por separado para controlar mejor estos eventos. Por ejemplo:

    const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
    const rs = await admin.securityRules().createRuleset(rf);
    await admin.securityRules().releaseFirestoreRuleset(rs);

Actualiza conjuntos de reglas de Realtime Database

Para actualizar los conjuntos de reglas de Realtime Database con el SDK de Admin, usa los métodos getRules() y setRules() de admin.database. Puedes recuperar conjuntos de reglas en formato JSON o una string con comentarios incluidos.

Usa el siguiente código para actualizar un conjunto de reglas:

    const source = `{
      "rules": {
        "scores": {
          ".indexOn": "score"
            "$uid": {
            ".read": "$uid == auth.uid",
            ".write": "$uid == auth.uid"
          }
        }
      }
    }`;
    await admin.database().setRules(source);

Administra conjuntos de reglas

Para ayudar a administrar conjuntos de reglas grandes, el SDK de Admin te permite enumerar todas las reglas existentes con admin.securityRules().listRulesetMetadata. Por ejemplo:

    const allRulesets = [];
    let pageToken = null;
    while (true) {
      const result = await admin.securityRules().listRulesetMetadata(pageToken: pageToken);
      allRulesets.push(...result.rulesets);
      pageToken = result.nextPageToken;
      if (!pageToken) {
        break;
      }
    }

Para conjuntos de reglas muy grandes que, con el tiempo, alcanzan el límite de 2,500 reglas, puedes crear una lógica para borrar las más antiguas en un ciclo de tiempo fijo. Usa el siguiente ejemplo para borrar TODOS los conjuntos de reglas implementados durante más de 30 días:

    const thirtyDays = new Date(Date.now() - THIRTY_DAYS_IN_MILLIS);
    const promises = [];
    allRulesets.forEach((rs) => {
      if (new Date(rs.crateTime) < thirtyDays) {
        promises.push(admin.securityRules().deleteRuleset(rs.name));
      }
    });
    await Promise.all(promises);
    console.log(`Deleted ${promises.length} rulesets.`);