Firebase-Sicherheitsregeln verwalten und bereitstellen

Firebase bietet mehrere Tools zur Verwaltung Ihrer Rules. Jedes Tool ist für bestimmte Fälle geeignet und verwendet dieselbe Backend-API zur Verwaltung von Firebase-Sicherheitsregeln.

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

  • Hier wird eine Regelnquelle aufgenommen: eine Reihe von Regeln, in der Regel eine Codedatei mit Firebase Security Rules-Anweisungen.
  • Die aufgenommene Quelle wird als unveränderliches Regelset gespeichert.
  • Hier wird die Bereitstellung der einzelnen Regelsätze in einer Version erfasst. Dienste, die Firebase-Sicherheitsregeln unterstützen, suchen die Version für ein Projekt auf, um jede Anfrage für eine gesicherte Ressource zu prüfen.
  • Ermöglicht syntaktische und semantische Tests einer Regelsammlung.

Firebase CLI verwenden

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

So können Sie Ihre Regeln mit Ihrem Anwendungscode einer Versionskontrolle unterwerfen und Regeln im Rahmen des bestehenden Bereitstellungsprozesses zur Verfügung stellen.

Konfigurationsdatei generieren

Wenn Sie Ihr Firebase-Projekt mit der Firebase CLI konfigurieren, erstellen Sie eine .rules-Konfigurationsdatei in Ihrem Projektverzeichnis. Konfigurieren Sie Ihr Firebase-Projekt mit dem folgenden Befehl:

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

Cloud Storage

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

Regeln bearbeiten und aktualisieren

Bearbeiten Sie die Regelquelle direkt in der Konfigurationsdatei .rules.

Achten Sie darauf, dass alle Änderungen, die Sie in der Firebase-Befehlszeile vornehmen, in der Firebase-Konsole übernommen werden. Alternativ können Sie die Änderungen auch immer entweder über die Firebase-Konsole oder die Firebase CLI vornehmen. Andernfalls werden möglicherweise alle in der Firebase-Konsole vorgenommenen Änderungen überschrieben.

Aktualisierungen testen

Der 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 Regelbewertung durch und übertrifft damit die syntaktischen Tests, die die Security Rules Management API bietet.

Wenn Sie mit der Befehlszeile arbeiten, ist die Suite ein hervorragendes Tool für Firebase Security Rules-Tests. Verwenden Sie Local Emulator Suite, um Ihre Updates lokal zu testen und zu prüfen, ob die Rules Ihrer App das gewünschte Verhalten zeigen.

Updates bereitstellen

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

Verknüpfen Sie für Cloud Firestore Security Rules .rules-Dateien mit Ihrer Standard- und zusätzlichen benannten Datenbank, indem Sie die firebase.json-Datei prüfen und aktualisieren.

Mit den folgenden Befehlen können Sie Rules einzeln oder im Rahmen Ihres normalen Bereitstellungsprozesses bereitstellen.

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>

Realtime Database

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

Cloud Storage

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

Firebase-Konsole verwenden

Sie können Rules Quellen auch über die Firebase-Konsole bearbeiten und als Releases bereitstellen. Der syntaktische Test wird während der Bearbeitung in der Firebase-Konsole durchgeführt. Der semantische Test ist über den Rules-Playground verfügbar.

Regeln bearbeiten und aktualisieren

  1. Öffnen Sie die Firebase Console und wählen Sie Ihr Projekt aus.
  2. Wählen Sie dann in der Produktnavigation Realtime Database, Cloud Firestore oder Speicher aus und klicken Sie auf Regeln, um den Rules-Editor aufzurufen.
  3. Bearbeiten Sie Ihre Regeln direkt im Editor.

Aktualisierungen testen

Sie können nicht nur die Syntax in der Editor-Benutzeroberfläche testen, sondern auch das semantische Rules-Verhalten mithilfe der Datenbank- und Speicherressourcen Ihres Projekts direkt in der Firebase-Konsole mit dem Rules Playground. Öffnen Sie im Rules-Editor den Bildschirm Regel-Playground, ändern Sie die Einstellungen und klicken Sie auf Ausführen. Suchen Sie oben im Editor nach der Bestätigungsmeldung.

Updates bereitstellen

Wenn Sie mit den Änderungen zufrieden sind, klicken Sie auf Veröffentlichen.

Admin SDK verwenden

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

  • Implementieren Sie benutzerdefinierte Tools, Scripts, Dashboards und CI/CD-Pipelines zum Verwalten von Regeln.
  • Regeln lassen sich jetzt einfacher in mehreren Firebase-Projekten verwalten.

Wenn Sie Regeln programmatisch aktualisieren, ist es sehr wichtig, unbeabsichtigte Änderungen an der Zugriffssteuerung für Ihre App zu vermeiden. Schreiben Sie Ihren Admin SDK-Code vor allem mit Blick auf die Sicherheit, insbesondere beim Aktualisieren oder Bereitstellen von Regeln.

Außerdem dauert es einige Minuten, bis Firebase Security Rules-Releases vollständig übernommen werden. Wenn Sie Regeln mit dem Admin SDK bereitstellen, sollten Sie Race-Bedingungen vermeiden, bei denen Ihre App sofort auf Regeln angewiesen ist, deren Bereitstellung noch nicht abgeschlossen ist. Wenn für Ihren Anwendungsfall häufige Aktualisierungen der Zugriffssteuerungsregeln erforderlich sind, sollten Sie Lösungen mit Cloud Firestore in Betracht ziehen. Dieser Dienst wurde entwickelt, um Race-Bedingungen trotz häufiger Aktualisierungen zu reduzieren.

Beachten Sie außerdem die folgenden Einschränkungen:

  • Regeln müssen bei der Serialisierung kleiner als 256 KiB UTF-8-codierten Texts sein.
  • Ein Projekt kann insgesamt maximal 2.500 bereitgestellte Regelsätze haben. Wenn Sie dieses Limit erreichen, müssen Sie einige alte Regelsätze löschen, bevor Sie neue erstellen können.

Cloud Storage- oder Cloud Firestore-Regeln erstellen und bereitstellen

Ein typischer Workflow zum Verwalten von Sicherheitsregeln mit der Admin SDK kann drei separate Schritte umfassen:

  1. Regeldateiquelle erstellen (optional)
  2. Regelsatz erstellen
  3. Neue Regelsatz veröffentlichen oder bereitstellen

Das SDK bietet eine Methode, mit der diese Schritte für Cloud Storage- und Cloud Firestore-Sicherheitsregeln in einem einzigen API-Aufruf kombiniert werden können. 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);

Dieses Muster funktioniert auch für Cloud Storage-Regeln mit releaseFirestoreRulesetFromSource().

Alternativ können Sie die Regelndatei als In-Memory-Objekt erstellen, das Regelset erstellen und das Regelset separat bereitstellen, um diese Ereignisse genauer zu steuern. Beispiel:

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

Realtime Database-Regeln aktualisieren

Verwenden Sie die Methoden getRules() und setRules() von admin.database, um Realtime Database-Regeln mit dem Admin SDK zu aktualisieren. Sie können Regelsätze im JSON-Format oder als String mit 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 große Regelsätze zu verwalten, können Sie mit Admin SDK alle vorhandenen Regeln mit admin.securityRules().listRulesetMetadata auflisten. 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;
      }
    }

Bei sehr großen Implementierungen, die im Laufe der Zeit das Limit von 2.500 Regeln 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 vor mehr als 30 Tagen 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 der REST API

Die oben beschriebenen Tools eignen sich gut für verschiedene Workflows, einschließlich der Firebase Security Rules-Verwaltung für mehrere Cloud Firestore-Datenbanken in Ihrem Projekt. Sie können Firebase Security Rules aber auch mit der Management API selbst verwalten und bereitstellen. Die Verwaltungs-API bietet die größte Flexibilität.

Beachten Sie außerdem die folgenden Einschränkungen:

  • Regeln müssen bei der Serialisierung kleiner als 256 KiB UTF-8-codierten Texts sein.
  • Ein Projekt kann insgesamt maximal 2.500 bereitgestellte Regelsätze haben. Wenn Sie dieses Limit erreichen, müssen Sie einige alte Regelsätze löschen, bevor Sie neue erstellen können.

Cloud Firestore- oder Cloud Storage-Regeln mit REST erstellen und bereitstellen

In den Beispielen in diesem Abschnitt wird Firestore Rules verwendet, sie gelten aber auch für Cloud Storage Rules.

In den Beispielen wird auch cURL für API-Aufrufe verwendet. Die Schritte zum Einrichten und Übergeben von Authentifizierungstokens werden weggelassen. Sie können diese API mit dem API Explorer testen, der in der Referenzdokumentation eingebunden ist.

Typische Schritte zum Erstellen und Bereitstellen einer Regelliste mit der Verwaltungs-API:

  1. Quellen für Regeldateien erstellen
  2. Regelsatz erstellen
  3. Stellen Sie die neue Regelsammlung bereit.

Quelle erstellen

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

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

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

Regelsatz erstellen

Erstellen Sie jetzt einen base64-codierten Fingerabdruck für diese Datei. Mit der Quelle in dieser Datei kannst du dann die Nutzlast ausfüllen, die zum Erstellen einer Regelliste mit dem projects.rulesets.create-REST-Aufruf erforderlich ist. Hier wird der Inhalt von firestore.rules mit dem Befehl cat in die REST-Nutzlast eingefügt.

Wenn Sie das Tracking mit Ihrer east_store-Datenbank verknüpfen möchten, legen Sie 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, z. B. projects/secure_commerce/rulesets/uuid123.

Regelsatz veröffentlichen (bereitstellen)

Wenn die Regelsammlung gültig ist, ist der letzte Schritt die Bereitstellung der neuen Regelsammlung in einer benannten Version.

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 es einige Minuten dauern kann, bis Firebase Security Rules-Releases vollständig übernommen wurden. Wenn Sie die Verwaltungs-REST API für die Bereitstellung verwenden, sollten Sie Race-Bedingungen vermeiden, bei denen Ihre App sofort auf Regeln angewiesen ist, deren Bereitstellung noch nicht abgeschlossen ist.

Realtime Database-Regeln mit REST aktualisieren

Realtime Database bietet eine eigene REST-Schnittstelle zur Verwaltung von Rules. Weitere Informationen finden Sie unter Firebase Realtime Database Rules über REST verwalten.

Regelsätze mit REST verwalten

Zur Verwaltung großer Regelimplementierungen bietet die Verwaltungs-API neben einer REST-Methode zum Erstellen von Regelsätzen und Releases auch Methoden für Folgendes:

  • Regelnlisten auflisten, abrufen und löschen
  • Regeln-Releases auflisten, abrufen und löschen

Bei sehr großen Implementierungen, die im Laufe der Zeit das Limit von 2.500 Regeln erreichen, können Sie eine Logik erstellen, um die ältesten Regeln in einem festen Zeitzyklus zu löschen. Wenn Sie beispielsweise alle Regelsätze löschen möchten, die vor mehr als 30 Tagen bereitgestellt wurden, können Sie die Methode projects.rulesets.list aufrufen, die JSON-Liste der Ruleset-Objekte anhand ihrer createTime-Schlüssel parsen und dann project.rulesets.delete für die entsprechenden Regelsätze mit ruleset_id aufrufen.

Aktualisierungen mit REST testen

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

Der Test mit dieser API-Komponente umfasst Folgendes:

  1. TestSuite-JSON-Objekt zum Darstellen einer Reihe von TestCase-Objekten definieren
  2. Einreichen der TestSuite
  3. Zurückgegebene TestResult-Objekte parsen

Definieren wir ein TestSuite-Objekt mit einem einzelnen TestCase in einer testcase.json-Datei. In diesem Beispiel übergeben wir die Rules-Sprachquelle inline mit der REST-Nutzlast zusammen mit der Testsuite, die für diese Regeln ausgeführt werden soll. Wir geben eine Erwartung für die Regelauswertung und die Clientanfrage an, anhand derer die Regelsammlung getestet werden soll. Sie können auch angeben, wie vollständig der Testbericht sein soll. Mit dem Wert „FULL“ geben Sie an, dass Ergebnisse für alle Rules-Sprachausdrücke im Bericht enthalten sein sollen, einschließlich Ausdrücke, die nicht mit der Anfrage ü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"}}}
            }
          ]
      }
    ]
  }
}

Wir können diese TestSuite dann mit der projects.test-Methode zur Bewertung einreichen.

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

Die zurückgegebene TestReport (mit dem Teststatus „ERFOLG“/„FEHLER“, Listen mit Debugging-Meldungen, Listen der besuchten Regelausdrücke und deren Auswertungsberichte) bestätigt mit dem Status „ERFOLG“, dass der Zugriff ordnungsgemäß zulässig ist.

Berechtigungen für dienstübergreifende Cloud Storage Security Rules verwalten

Wenn Sie Cloud Storage Security Rules erstellen, bei denen der Cloud Firestore-Dokumentinhalt zur Auswertung von Sicherheitsbedingungen verwendet wird, werden Sie in der Firebase-Konsole oder in der Firebase-Befehlszeile aufgefordert, Berechtigungen zum Verbinden der beiden Produkte zu aktivieren.

Wenn Sie diese dienstübergreifende Sicherheit deaktivieren möchten, gehen Sie so vor:

  1. Bevor Sie die Funktion deaktivieren, bearbeiten Sie Ihre Regeln und entfernen Sie alle Anweisungen, in denen Rules-Funktionen zum Zugriff auf Cloud Firestore verwendet werden. Andernfalls führen Rules-Bewertungen nach der Deaktivierung der Funktion dazu, dass Ihre Speicheranfragen fehlschlagen.

  2. Löschen Sie die Rolle „Firebase Rules Firestore Service Agent“ auf der Seite IAM in der Google Cloud Console. Folgen Sie dazu der Anleitung zum Widerrufen von Rollen in der Cloud.

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