Verwalten und implementieren Sie Firebase-Sicherheitsregeln

Firebase stellt Ihnen mehrere Tools zur Verwaltung Ihrer Regeln zur Verfügung, die jeweils in bestimmten Fällen nützlich sind und jeweils dieselbe Back-End-Firebase-Sicherheitsregel-Verwaltungs-API verwenden.

Unabhängig davon, welches Tool zum Aufrufen verwendet wird, die Verwaltungs-API:

  • Nimmt eine Regelquelle auf: eine Reihe von Regeln, normalerweise eine Codedatei, die Firebase Security Rules-Anweisungen enthält.
  • Speichert die aufgenommene Quelle als unveränderlichen Regelsatz .
  • Verfolgt die Bereitstellung jedes Regelsatzes in einer Version . Dienste, die Firebase Security Rules unterstützen, suchen nach der Version eines Projekts, um jede Anfrage für eine gesicherte Ressource auszuwerten.
  • Bietet die Möglichkeit, syntaktische und semantische Tests eines Regelsatzes auszuführen.

Verwenden Sie die Firebase-CLI

Mit der Firebase-CLI können Sie lokale Quellen hochladen und Releases bereitstellen. Mit der Firebase Local Emulator Suite der CLI können Sie vollständige lokale Tests von Quellen durchführen.

Mit der CLI können Sie Ihre Regeln mit Ihrem Anwendungscode unter Versionskontrolle halten und Regeln als Teil Ihres bestehenden Bereitstellungsprozesses bereitstellen.

Generieren Sie eine Konfigurationsdatei

Wenn Sie Ihr Firebase-Projekt mit der Firebase-CLI konfigurieren, erstellen Sie eine .rules Konfigurationsdatei in Ihrem Projektverzeichnis. Verwenden Sie den folgenden Befehl, um mit der Konfiguration Ihres Firebase-Projekts zu beginnen:

Cloud Firestore

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

Echtzeitdatenbank

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

Cloud-Speicher

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

Bearbeiten und aktualisieren Sie Ihre Regeln

Bearbeiten Sie Ihre Regelquelle direkt in der .rules Konfigurationsdatei.

Stellen Sie sicher, dass alle Änderungen, die Sie in der Firebase-CLI vornehmen, in der Firebase-Konsole widergespiegelt werden oder dass Sie regelmäßig Aktualisierungen entweder über die Firebase-Konsole oder die Firebase-CLI vornehmen. Andernfalls überschreiben Sie möglicherweise alle in der Firebase-Konsole vorgenommenen Aktualisierungen.

Testen Sie Ihre Updates

Die Local Emulator Suite bietet Emulatoren für alle Produkte, die Sicherheitsregeln unterstützen. Die Sicherheitsregel-Engine für jeden Emulator führt sowohl eine syntaktische als auch eine semantische Bewertung der Regeln durch und geht damit über die syntaktischen Tests hinaus, die die Sicherheitsregel-Verwaltungs-API bietet.

Wenn Sie mit der CLI arbeiten, ist die Suite ein hervorragendes Tool zum Testen von Firebase-Sicherheitsregeln. Verwenden Sie die Local Emulator Suite , um Ihre Updates lokal zu testen und zu bestätigen, dass die Regeln Ihrer App das gewünschte Verhalten zeigen.

Stellen Sie Ihre Updates bereit

Nachdem Sie Ihre Regeln aktualisiert und getestet haben, stellen Sie die Quellen in der Produktion bereit.

Verknüpfen Sie für Cloud Firestore-Sicherheitsregeln .rules Dateien mit Ihren Standard- und zusätzlichen benannten Datenbanken, indem Sie Ihre firebase.json Datei überprüfen und aktualisieren.

Verwenden Sie die folgenden Befehle, um Ihre Regeln gezielt einzeln oder als Teil Ihres normalen Bereitstellungsprozesses bereitzustellen.

Cloud Firestore

// Deploy rules for all databases configured in your firebase.json
firebase deploy --only firestore:rules
// Deploy rules for the specified database configured in your firebase.json firebase deploy --only firestore:<databaseId>

Echtzeitdatenbank

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

Cloud-Speicher

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

Verwenden Sie die Firebase-Konsole

Sie können Regelquellen auch bearbeiten und sie als Releases über die Firebase-Konsole bereitstellen. Syntaktische Tests werden durchgeführt, während Sie in der Benutzeroberfläche der Firebase-Konsole bearbeiten, und semantische Tests sind über den Rules Playground verfügbar.

Bearbeiten und aktualisieren Sie Ihre Regeln

  1. Öffnen Sie die Firebase-Konsole und wählen Sie Ihr Projekt aus.
  2. Wählen Sie dann in der Produktnavigation „Echtzeitdatenbank“ , „Cloud Firestore“ oder „Speicher“ aus und klicken Sie dann auf „Regeln“ , um zum Regeleditor zu navigieren.
  3. Bearbeiten Sie Ihre Regeln direkt im Editor.

Testen Sie Ihre Updates

Zusätzlich zum Testen der Syntax in der Benutzeroberfläche des Editors können Sie das Verhalten semantischer Regeln mithilfe der Datenbank- und Speicherressourcen Ihres Projekts direkt in der Firebase-Konsole mithilfe des Rules Playground testen. Öffnen Sie den Rules Playground- Bildschirm im Regeleditor, ändern Sie die Einstellungen und klicken Sie auf Ausführen . Suchen Sie oben im Editor nach der Bestätigungsmeldung.

Stellen Sie Ihre Updates bereit

Wenn Sie davon überzeugt sind, dass Ihre Aktualisierungen Ihren Erwartungen entsprechen, klicken Sie auf „Veröffentlichen“ .

Verwenden Sie das Admin SDK

Sie können das Admin SDK für Node.js- Regelsätze verwenden. Mit diesem programmatischen Zugriff können Sie:

  • Implementieren Sie benutzerdefinierte Tools, Skripte, Dashboards und CI/CD-Pipelines zur Verwaltung von Regeln.
  • Verwalten Sie Regeln einfacher über mehrere Firebase-Projekte hinweg.

Beim programmgesteuerten Aktualisieren von Regeln ist es sehr wichtig, unbeabsichtigte Änderungen an der Zugriffskontrolle für Ihre App zu vermeiden. Schreiben Sie Ihren Admin-SDK-Code unter Berücksichtigung der Sicherheit, insbesondere beim Aktualisieren oder Bereitstellen von Regeln.

Beachten Sie außerdem, dass die vollständige Verbreitung von Firebase-Sicherheitsregelversionen mehrere Minuten dauern kann. Wenn Sie das Admin SDK zum Bereitstellen von Regeln verwenden, achten Sie darauf, Race Conditions zu vermeiden, bei denen Ihre App sofort auf Regeln angewiesen ist, deren Bereitstellung noch nicht abgeschlossen ist. Wenn Ihr Anwendungsfall häufige Aktualisierungen der Zugriffskontrollregeln erfordert, ziehen Sie Lösungen mit Cloud Firestore in Betracht, die darauf ausgelegt sind, die Race Conditions trotz häufiger Aktualisierungen zu reduzieren.

Beachten Sie auch diese Grenzwerte:

  • Regeln müssen bei der Serialisierung kleiner als 256 KiB UTF-8-codierter Text sein.
  • Ein Projekt kann insgesamt höchstens 2500 bereitgestellte Regelsätze haben. Sobald dieses Limit erreicht ist, müssen Sie einige alte Regelsätze löschen, bevor Sie neue erstellen können.

Erstellen und implementieren Sie Cloud Storage- oder Cloud Firestore-Regelsätze

Ein typischer Arbeitsablauf zum Verwalten von Sicherheitsregeln mit dem Admin SDK könnte drei diskrete Schritte umfassen:

  1. Erstellen Sie eine Regeldateiquelle (optional)
  2. Erstellen Sie einen Regelsatz
  3. Geben Sie den neuen Regelsatz frei oder stellen Sie ihn bereit

Das SDK bietet eine Methode zum Kombinieren dieser Schritte in einem einzigen API-Aufruf für Cloud Storage- und Cloud Firestore-Sicherheitsregeln. Zum Beispiel:

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

Das gleiche Muster funktioniert für Cloud Storage-Regeln mit releaseFirestoreRulesetFromSource() .

Alternativ können Sie die Regeldatei als In-Memory-Objekt erstellen, den Regelsatz erstellen und den Regelsatz separat bereitstellen, um diese Ereignisse genauer zu steuern. Zum Beispiel:

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

Aktualisieren Sie die Regelsätze der Echtzeitdatenbank

Um Echtzeitdatenbank-Regelsätze mit dem Admin SDK zu aktualisieren, verwenden Sie die Methoden getRules() und setRules() von admin.database . Sie können Regelsätze im JSON-Format oder als Zeichenfolge mit enthaltenen Kommentaren abrufen.

So aktualisieren Sie einen Regelsatz:

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

Regelsätze verwalten

Um die Verwaltung großer Regelsätze zu erleichtern, können Sie mit dem Admin SDK alle vorhandenen Regeln mit admin.securityRules().listRulesetMetadata auflisten. Zum Beispiel:

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

Für sehr große Bereitstellungen, die im Laufe der Zeit die Grenze von 2500 Regelsätzen erreichen, können Sie eine Logik erstellen, um die ältesten Regeln in einem festen Zeitzyklus zu löschen. So löschen Sie beispielsweise alle Regelsätze, die länger als 30 Tage bereitgestellt wurden:

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

Verwenden Sie die REST-API

Die oben beschriebenen Tools eignen sich gut für verschiedene Arbeitsabläufe, einschließlich der Verwaltung von Firebase-Sicherheitsregeln für mehrere Cloud Firestore-Datenbanken in Ihrem Projekt. Möglicherweise möchten Sie Firebase-Sicherheitsregeln jedoch mithilfe der Verwaltungs-API selbst verwalten und bereitstellen. Die Management-API bietet Ihnen größte Flexibilität.

Beachten Sie auch diese Grenzwerte:

  • Regeln müssen bei der Serialisierung kleiner als 256 KiB UTF-8-codierter Text sein.
  • Ein Projekt kann insgesamt höchstens 2500 bereitgestellte Regelsätze haben. Sobald dieses Limit erreicht ist, müssen Sie einige alte Regelsätze löschen, bevor Sie neue erstellen können.

Erstellen und stellen Sie Cloud Firestore- oder Cloud Storage-Regelsätze mit REST bereit

Die Beispiele in diesem Abschnitt verwenden Firestore-Regeln, gelten jedoch auch für Cloud-Speicherregeln.

Die Beispiele verwenden cURL auch, um API-Aufrufe durchzuführen. Schritte zum Einrichten und Übergeben von Authentifizierungstokens werden weggelassen. Sie können mit dieser API experimentieren, indem Sie den API Explorer verwenden, der in die Referenzdokumentation integriert ist.

Typische Schritte zum Erstellen und Bereitstellen eines Regelsatzes mithilfe der Verwaltungs-API sind:

  1. Erstellen Sie Regeldateiquellen
  2. Erstellen Sie einen Regelsatz
  3. Geben Sie den neuen Regelsatz frei (bereitstellen).

Erstellen Sie eine Quelle

Nehmen wir an, Sie arbeiten an Ihrem secure_commerce Firebase-Projekt und möchten gesperrte Cloud Firestore-Regeln in einer Datenbank in Ihrem Projekt namens east_store bereitstellen.

Sie können diese Regeln in einer Datei firestore.rules implementieren.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Erstellen Sie einen Regelsatz

Generieren Sie nun einen Base64-codierten Fingerabdruck für diese Datei. Anschließend können Sie die Quelle in dieser Datei verwenden, um die zum Erstellen eines Regelsatzes erforderliche Nutzlast mit dem REST-Aufruf projects.rulesets.create “ zu füllen. Verwenden Sie hier den Befehl cat , um den Inhalt von firestore.rules in die REST-Nutzlast einzufügen.

Um dies zur Nachverfolgung mit Ihrer Datenbank east_store zu verknüpfen, legen Sie den attachment_point auf east_store fest.

curl -X POST -d '{
  "source": {
    {
      "files": [
        {
          "content": "' $(cat storage.rules) '",
          "name": "firestore.rules",
          "fingerprint": <sha fingerprint>
        },
      "attachment_point": "firestore.googleapis.com/databases/east_store"
      ]
    }
  }
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets'

Die API gibt eine Validierungsantwort und einen Regelsatznamen zurück, zum Beispiel projects/secure_commerce/rulesets/uuid123 .

Einen Regelsatz freigeben (bereitstellen).

Wenn der Regelsatz gültig ist, besteht der letzte Schritt darin, den neuen Regelsatz in einem benannten Release bereitzustellen.

curl -X POST -d '{
  "name": "projects/secure_commerce/releases/cloud.firestore/east_store"  ,
  "rulesetName": "projects/secure_commerce/rulesets/uuid123"
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/releases'

Beachten Sie, dass die vollständige Verbreitung von Firebase-Sicherheitsregelversionen mehrere Minuten dauern kann. Wenn Sie die Management-REST-API für die Bereitstellung verwenden, achten Sie darauf, Race-Conditions zu vermeiden, bei denen Ihre App sofort auf Regeln angewiesen ist, deren Bereitstellung noch nicht abgeschlossen ist.

Aktualisieren Sie die Regelsätze der Echtzeitdatenbank mit REST

Realtime Database bietet eine eigene REST-Schnittstelle zum Verwalten von Regeln. Siehe Verwalten von Firebase-Echtzeitdatenbankregeln über REST .

Regelsätze mit REST verwalten

Um die Verwaltung umfangreicher Regelbereitstellungen zu erleichtern, bietet die Verwaltungs-API zusätzlich zu einer REST-Methode zum Erstellen von Regelsätzen und Releases Methoden für Folgendes:

  • Regelsätze auflisten, abrufen und löschen
  • Regelveröffentlichungen auflisten, abrufen und löschen

Für sehr große Bereitstellungen, die im Laufe der Zeit die Grenze von 2500 Regelsätzen erreichen, können Sie eine Logik erstellen, um die ältesten Regeln in einem festen Zeitzyklus zu löschen. Um beispielsweise alle Regelsätze zu löschen, die länger als 30 Tage bereitgestellt wurden, können Sie die Methode projects.rulesets.list aufrufen, die JSON-Liste der Ruleset anhand ihrer createTime -Schlüssel analysieren und dann project.rulesets.delete für die entsprechenden Regelsätze anhand der ruleset_id aufrufen .

Testen Sie Ihre Updates mit REST

Schließlich können Sie mit der Verwaltungs-API syntaktische und semantische Tests für Cloud Firestore- und Cloud Storage-Ressourcen in Ihren Produktionsprojekten ausführen.

Das Testen mit dieser Komponente der API besteht aus:

  1. Definieren eines TestSuite JSON-Objekts zur Darstellung einer Reihe von TestCase Objekten
  2. Einreichen der TestSuite
  3. Beim Parsen wurden TestResult Objekte zurückgegeben

Definieren wir ein TestSuite Objekt mit einem einzelnen TestCase in einer testcase.json -Datei. In diesem Beispiel übergeben wir die Sprachquelle „Rules“ inline mit der REST-Nutzlast zusammen mit der Testsuite, um diese Regeln auszuführen. Wir geben eine Regelauswertungserwartung und die Clientanforderung an, anhand derer der Regelsatz getestet werden soll. Sie können auch angeben, wie vollständig der Testbericht ist, indem Sie den Wert „VOLLSTÄNDIG“ verwenden, um anzugeben, dass Ergebnisse für alle Ausdrücke in der Regelsprache in den Bericht aufgenommen werden sollen, einschließlich Ausdrücken, die nicht mit der Anforderung übereinstimmten.

 {
  "source":
  {
    "files":
    [
      {
        "name": "firestore.rules",
        "content": "service cloud.firestore {
          match /databases/{database}/documents {
            match /users/{userId}{
              allow read: if (request.auth.uid == userId);
            }
            function doc(subpath) {
              return get(/databases/$(database)/documents/$(subpath)).data;
            }
            function isAccountOwner(accountId) {
              return request.auth.uid == accountId 
                  || doc(/users/$(request.auth.uid)).accountId == accountId;
            }
            match /licenses/{accountId} {
              allow read: if isAccountOwner(accountId);
            }
          }
        }"
      }
    ]
  },
  "testSuite":
  {
    "testCases":
    [
      {
        "expectation": "ALLOW",
        "request": {
           "auth": {"uid": "123"},
           "path": "/databases/(default)/documents/licenses/abcd",
           "method": "get"},
        "functionMocks": [
            {
            "function": "get",
            "args": [{"exact_value": "/databases/(default)/documents/users/123"}],
            "result": {"value": {"data": {"accountId": "abcd"}}}
            }
          ]
      }
    ]
  }
}

Anschließend können wir diese TestSuite zur Evaluierung mit der Methode projects.test einreichen.

curl -X POST -d '{
    ' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'

Der zurückgegebene TestReport (der den Status ERFOLGREICH/FEHLER des Tests, Listen der Debug-Meldungen, Listen der besuchten Regelausdrücke und deren Auswertungsberichte enthält) würde mit dem Status ERFOLGREICH bestätigen, dass der Zugriff ordnungsgemäß zugelassen ist.

Verwalten Sie Berechtigungen für dienstübergreifende Cloud-Speicher-Sicherheitsregeln

Wenn Sie Cloud Storage-Sicherheitsregeln erstellen, die Cloud Firestore-Dokumentinhalte zur Bewertung von Sicherheitsbedingungen verwenden, werden Sie in der Firebase-Konsole oder der Firebase-CLI aufgefordert, Berechtigungen zum Verbinden der beiden Produkte zu aktivieren.

Wenn Sie sich entscheiden, diese dienstübergreifende Sicherheit zu deaktivieren:

  1. Bevor Sie die Funktion deaktivieren, bearbeiten Sie zunächst Ihre Regeln und entfernen Sie alle Anweisungen, die Regelfunktionen für den Zugriff auf Cloud Firestore verwenden. Andernfalls führen die Regelauswertungen nach der Deaktivierung der Funktion dazu, dass Ihre Speicheranforderungen fehlschlagen.

  2. Verwenden Sie die IAM- Seite in der Google Cloud Console, um die Rolle „Firebase Rules Firestore Service Agent“ zu löschen, indem Sie dem Cloud-Leitfaden zum Widerrufen von Rollen folgen.

Sie werden aufgefordert, die Funktion erneut zu aktivieren, wenn Sie das nächste Mal dienstübergreifende Regeln über die Firebase-CLI oder die Firebase-Konsole speichern.