Firebase-Sicherheitsregeln verwalten und bereitstellen

Firebase bietet Ihnen mehrere Tools zur Verwaltung von Rules, jedes eine in bestimmten Fällen nützlich, und jeder verwendet dasselbe Back-End-Firebase- Security Rules Management API

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

  • Nimmt eine Regelquelle auf: eine Reihe von Regeln, in der Regel eine Codedatei mit Firebase Security Rules-Anweisungen.
  • Speichert die Quelle als unveränderlicher Regelsatz.
  • Verfolgt die Bereitstellung jedes Regelsatzes in einem Release. 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.
  • Bietet die Möglichkeit, syntaktische und semantische Tests eines Regelsatzes auszuführen.

Firebase CLI verwenden

Mit der Firebase-Befehlszeile können Sie lokale Quellen hochladen und Releases bereitstellen. Die Befehlszeilenschnittstellen Mit Firebase Local Emulator Suite können Sie vollständige lokale Tests von Quellen durchfü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-Befehlszeile konfigurieren, erstellen Sie Eine .rules-Konfigurationsdatei in Ihrem Projektverzeichnis. Verwenden Sie Folgendes: um Ihr Firebase-Projekt zu konfigurieren:

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 in der Firebase-Konsole oder in der Firebase CLI vornehmen. Andernfalls überschreiben Sie möglicherweise alle Aktualisierungen, die in der Firebase-Konsole vorgenommen wurden.

Updates testen

Der Local Emulator Suite bietet Emulatoren für alle Produkte, die Sicherheitsregeln unterstützen. Das Modul für Sicherheitsregeln führt für jeden Emulator sowohl und semantische Auswertungen von Regeln, was die syntaktischen Tests bietet die Security Rules Management API.

Wenn Sie mit der Befehlszeile arbeiten, ist die Suite ein hervorragendes Tool für Firebase Security Rules Tests durchführen. Updates mit dem Local Emulator Suite testen lokal überprüfen und bestätigen, dass die Rules Ihrer App das Verhalten zeigen,

Updates bereitstellen

Nachdem Sie Rules aktualisiert und getestet haben, stellen Sie die Quellen bereit für Produktion.

Verknüpfen Sie für Cloud Firestore Security Rules .rules-Dateien mit Ihrem Standard- und zusätzliche benannte Datenbanken, indem Sie Ihre firebase.json-Datei.

Verwenden Sie die folgenden Befehle, um Rules selektiv allein bereitzustellen oder und stellen sie im Rahmen des normalen Bereitstellungsprozesses bereit.

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 auch Rules-Quellen bearbeiten und als Releases aus der Firebase-Konsole. Der Syntax-Test wird während der Bearbeitung im Die Firebase-Konsolen-UI und semantische Tests sind mit der Rules Playground.

Regeln bearbeiten und aktualisieren

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

Aktualisierungen testen

Neben der Syntax in der Editor-Benutzeroberfläche können Sie auch semantische Rules-Verhalten unter Verwendung der Datenbank- und Speicherressourcen Ihres Projekts direkt in der Firebase-Konsole mit der Methode Rules Playground. Öffnen Sie den Playground für Regeln. ändern Sie die Einstellungen und klicken Sie auf Ausführen.Rules Oben im Editor wird eine Bestätigungsmeldung angezeigt.

Updates bereitstellen

Wenn Sie sicher sind, dass die Änderungen Ihren Erwartungen entsprechen, klicken Sie auf Veröffentlichen.

Admin SDK verwenden

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

  • Implementieren Sie benutzerdefinierte Tools, Skripts, Dashboards und CI/CD-Pipelines zum Verwalten von Regeln.
  • Regeln für mehrere Firebase-Projekte einfacher verwalten.

Bei der programmatischen Aktualisierung von Regeln ist es sehr wichtig, unbeabsichtigte Änderungen an der Zugriffssteuerung für Ihre App. Schreiben Sie Ihren Admin SDK-Code wobei die Sicherheit an erster Stelle steht, insbesondere bei der Aktualisierung oder Bereitstellung von Regeln.

Außerdem ist zu bedenken, dass Firebase Security Rules-Releases eine mehrere Minuten, bis die Änderungen wirksam werden. Bei Verwendung von Admin SDK zum Bereitstellen sollten Sie Race-Bedingungen vermeiden, bei denen Ihre App für Regeln, 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 Beschränkungen:

  • Regeln müssen kleiner als 256 KiB an UTF-8-codiertem Text sein, wenn sie serialisiert sind.
  • Ein Projekt kann insgesamt höchstens 2.500 bereitgestellte Regelsätze haben. Sobald dieses Limit erreicht ist, 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 dem Admin SDK könnte Folgendes umfassen: drei diskrete Schritte ausführen:

  1. Quelle für Regeldatei erstellen (optional)
  2. Regelsatz erstellen
  3. Neuen Regelsatz freigeben oder bereitstellen

Das SDK bietet eine Methode, um diese Schritte zu einem einzigen API-Aufruf für Sicherheitsregeln für Cloud Storage und Cloud Firestore. 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, das Objekt und stellen Sie den Regelsatz separat bereit, um diese Ereignisse besser steuern zu können. Beispiel:

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

Realtime Database Regelsätze 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 in JSON abrufen Format oder als String mit Kommentaren.

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 der Admin SDK alle vorhandenen Regeln auflisten mit admin.securityRules().listRulesetMetadata. 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 das Limit von 2.500 Regelsätzen erreichen, können Sie Logik zum Löschen der ältesten Regeln in einem festen Zeitzyklus erstellen. Wenn Sie beispielsweise Löschen Sie 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 der REST API

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

Beachten Sie außerdem die folgenden Beschränkungen:

  • Regeln müssen kleiner als 256 KiB an UTF-8-codiertem Text sein, wenn sie serialisiert sind.
  • Ein Projekt kann insgesamt maximal 2.500 bereitgestellte Regelsätze haben. Sobald dieses Limit erreicht ist, müssen Sie einige alte Regelsätze löschen, bevor Sie neue erstellen können.

Cloud Firestore- oder Cloud Storage-Regelsätze mit REST erstellen und bereitstellen

In den Beispielen in diesem Abschnitt wird Firestore Rules verwendet, obwohl sie auf Cloud Storage Rules ebenfalls.

In den Beispielen wird cURL auch für API-Aufrufe verwendet. Schritte zur Einrichtung und Übergabe Authentifizierungstokens ausgelassen werden. Sie können mit dieser API experimentieren, indem Sie die API Explorer ist in das in der Referenzdokumentation.

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

  1. Quellen für Regeldateien erstellen
  2. Regelsatz erstellen
  3. Geben Sie den neuen Regelsatz frei (Bereitstellung).

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 einem firestore.rules implementieren. -Datei.

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

Regelsatz erstellen

Generieren Sie nun einen base64-codierten Fingerabdruck für diese Datei. Sie können dann die Quelle in dieser Datei verwenden, um die Nutzlast zu füllen, die zum Erstellen einer Regelliste mit dem projects.rulesets.create-REST-Aufruf erforderlich ist. Fügen Sie hier mit dem Befehl cat den Inhalt von firestore.rules in die REST-Nutzlast.

Wenn du es für das Tracking mit deiner east_store-Datenbank verknüpfen möchtest, setze attachment_point auf east_store.

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 freigeben (bereitstellen)

Wenn der Regelsatz gültig ist, besteht der letzte Schritt darin, den neuen Regelsatz in einem benannten Veröffentlichung.

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 mehrere Minuten dauert, bis Firebase Security Rules-Releases vollständig sind propagieren. 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 Regelsätze 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

Um große Regelbereitstellungen zu verwalten, zusätzlich zu einer REST-Methode für Zum Erstellen von Regelsätzen und Releases bietet die Verwaltungs-API Methoden für Folgendes:

  • Regelsätze auflisten, abrufen und löschen
  • Releases von Regeln auflisten, abrufen und löschen

Für sehr große Bereitstellungen, die im Laufe der Zeit das Limit von 2.500 Regelsätzen erreichen, können Sie Logik zum Löschen der ältesten Regeln in einem festen Zeitzyklus erstellen. Wenn Sie beispielsweise alle Regelsätze löschen, die länger als 30 Tage bereitgestellt wurden, projects.rulesets.list die JSON-Liste mit Ruleset-Objekten ihre createTime-Schlüssel und rufen Sie dann project.rulesets.delete entsprechende Regelsätze durch ruleset_id.

Updates mit REST testen

Mit der Verwaltungs-API können Sie syntaktische und semantische Tests für Cloud Firestore und Cloud Storage Ressourcen in Ihrer Produktion Projekten.

Der Test mit dieser Komponente der API umfasst Folgendes:

  1. TestSuite-JSON-Objekt zur Darstellung einer Reihe von TestCase-Objekten definieren
  2. TestSuite einreichen
  3. Beim Parsen wurden TestResult Objekte zurückgegeben

Lassen Sie uns ein TestSuite-Objekt mit einem einzelnen TestCase-Element testcase.json-Datei. In diesem Beispiel übergeben wir Rules Sprachquelle inline mit der REST-Nutzlast, zusammen mit der Testsuite, die ausgeführt werden soll zu diesen Regeln. Wir definieren die Erwartungen an die Regelauswertung und der Kunde -Anforderung, mit der der Regelsatz verglichen werden soll. Sie können auch festlegen, des Testberichts mit dem Wert "FULL". um Ergebnisse für alle Der Bericht sollte Rules Sprachausdrücke enthalten, darunter: Ausdrücke, die nicht mit der Anfrage übereinstimmen.

 {
  "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 zur Bewertung mit der projects.test einreichen .

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

Die zurückgegebene TestReport (mit Teststatus SUCCESS/FAILURE, Listen von Debug-Meldungen, Listen besuchter Regelausdrücke und deren Auswertungsberichte) würde mit dem Status SUCCESS bestätigen, dass der Zugriff ordnungsgemäß gewährt wird.

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

Wenn Sie Cloud Storage Security Rules erstellen, die Cloud Firestore-Dokumentinhalt verwendet um die Sicherheitsbedingungen zu bewerten, werden Sie in der Firebase-Konsole oder der Firebase-Befehlszeile aufgefordert, um die beiden Produkte zu verbinden.

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

  1. Bearbeiten Sie die Regeln, bevor Sie die Funktion deaktivieren, Anweisungen, die Rules-Funktionen für den Zugriff auf Cloud Firestore verwenden. Andernfalls werden Rules-Bewertungen nach dem Deaktivieren der Funktion führen dazu, dass Ihre Speicheranfragen fehlschlagen.

  2. Verwenden Sie die Seite IAM in der Google Cloud Console, um das Firestore-Dienst-Agent für Regeln“ erhalten Sie im Cloud-Leitfaden für Rollen werden widerrufen.

Beim nächsten Speichern werden Sie aufgefordert, die Funktion wieder zu aktivieren. dienstübergreifende Regeln über die Firebase-Befehlszeile oder die Firebase-Konsole einrichten.