Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

Gérer et déployer les règles de sécurité Firebase

Utiliser l'interface de ligne de commande Firebase

Modifiez et déployez des règles à l'aide de la CLI Firebase . L'utilisation de la CLI vous permet de garder vos règles sous contrôle de version avec votre code d'application et de déployer des règles dans le cadre de votre processus de déploiement existant.

Générer un fichier de configuration

Lorsque vous configurez votre projet Firebase à l'aide de la CLI Firebase, vous créez un fichier de configuration .rules dans votre répertoire de projet. Utilisez la commande suivante pour commencer à configurer votre projet Firebase :

Cloud Firestore

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

Base de données en temps réel

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

Stockage en ligne

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

Modifier et mettre à jour vos règles

Modifiez vos règles directement dans le fichier de configuration .rules . Assurez-vous que toutes les modifications que vous apportez dans la CLI Firebase sont reflétées dans la console Firebase, ou que vous effectuez systématiquement des mises à jour à l'aide de la console Firebase ou de la CLI Firebase. Sinon, vous risquez d'écraser les mises à jour effectuées dans la console Firebase.

Testez vos mises à jour

Utilisez l' émulateur Firebase pour tester vos mises à jour localement et confirmez que les règles de votre application présentent le comportement souhaité.

Déployez vos mises à jour

Une fois que vous avez mis à jour et testé vos règles, déployez-les en production. Utilisez les commandes suivantes pour déployer sélectivement vos règles seules ou les déployer dans le cadre de votre processus de déploiement normal.

Cloud Firestore

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

Base de données en temps réel

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

Stockage en ligne

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

Utiliser la console Firebase

Vous pouvez également modifier et déployer des règles à partir de la console Firebase.

Modifier et mettre à jour vos règles

  1. Ouvrez la console Firebase et sélectionnez votre projet.
  2. Ensuite, sélectionnez Realtime Database , Cloud Firestore ou Storage dans la navigation du produit, puis cliquez sur Rules pour accéder à l'éditeur de règles.
  3. Modifiez vos règles directement dans l'éditeur.

Testez vos mises à jour

Vous pouvez tester le comportement de vos règles directement dans la console Firebase, en utilisant le simulateur de règles . Ouvrez l'écran Simulateur dans l'éditeur de règles, modifiez les paramètres et cliquez sur Exécuter . Recherchez le message de confirmation en haut de l'éditeur.

Déployez vos mises à jour

Une fois que vous êtes convaincu que vos mises à jour correspondent à vos attentes, cliquez sur Publier .

Utiliser le SDK d'administration

Vous pouvez utiliser le SDK Admin pour Node.js pour créer, gérer et déployer des règles de sécurité par programmation. Avec cet accès par programmation, vous pouvez :

  • Implémentez des outils personnalisés, des scripts, des tableaux de bord et des pipelines CI/CD pour gérer les règles.
  • Gérez plus facilement les règles sur plusieurs projets Firebase.

Lors de la mise à jour des règles par programmation, il est très important d'éviter d'apporter des modifications involontaires au contrôle d'accès de votre application. Écrivez votre code SDK Admin en gardant la sécurité à l'esprit, en particulier lors de la mise à jour ou du déploiement de règles.

Une autre chose importante à garder à l'esprit est que les règles de sécurité Firebase prennent plusieurs minutes pour se déployer complètement. Lorsque vous utilisez le SDK Admin pour déployer des règles, veillez à éviter les conditions de concurrence dans lesquelles votre application repose immédiatement sur des règles dont le déploiement n'est pas encore terminé. Si votre cas d'utilisation nécessite des mises à jour fréquentes des règles de contrôle d'accès, envisagez des solutions utilisant Cloud Firestore, qui est conçue pour réduire les conditions de concurrence malgré les mises à jour fréquentes.

Notez également ces limites :

  • Les règles doivent être inférieures à 64 Kio de texte encodé en UTF-8 lorsqu'elles sont sérialisées.
  • Un projet peut avoir au plus 2500 ensembles de règles déployés au total. Une fois cette limite atteinte, vous devez supprimer certains anciens jeux de règles avant d'en créer de nouveaux.

Créer et déployer des ensembles de règles Cloud Storage ou Cloud Firestore

Un workflow type de gestion des règles de sécurité avec le SDK Admin peut comprendre trois étapes distinctes :

  1. Créer un fichier de règles (facultatif)
  2. Créer un ensemble de règles
  3. Publier ou déployer le nouvel ensemble de règles

Le SDK fournit une méthode pour combiner ces étapes en un seul appel d'API pour les règles de sécurité Cloud Storage et Cloud Firestore. Par example:

    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);

Ce même modèle fonctionne pour les règles Cloud Storage avec releaseFirestoreRulesetFromSource() .

Vous pouvez également créer le fichier de règles en tant qu'objet en mémoire, créer l'ensemble de règles et déployer l'ensemble de règles séparément pour un contrôle plus étroit de ces événements. Par example:

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

Mettre à jour les ensembles de règles de la base de données en temps réel

Pour mettre à jour les ensembles de règles Realtime Database avec le SDK Admin, utilisez les getRules() et setRules() de admin.database . Vous pouvez récupérer des ensembles de règles au format JSON ou sous forme de chaîne avec des commentaires inclus.

Pour mettre à jour un ensemble de règles :

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

Gérer les ensembles de règles

Pour faciliter la gestion de grands ensembles de règles, le SDK Admin vous permet de répertorier toutes les règles existantes avec admin.securityRules().listRulesetMetadata . Par example:

    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;
      }
    }

Pour les très grands ensembles de règles qui atteignent la limite de 2500 règles au fil du temps, vous pouvez créer une logique pour supprimer les règles les plus anciennes sur un cycle de temps fixe. Par exemple, pour supprimer TOUS les ensembles de règles déployés pendant plus de 30 jours :

    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.`);