Firebase-Sicherheitsregeln verwalten und bereitstellen

Firebase bietet Ihnen mehrere Tools zum Verwalten Ihrer Regeln, von denen jedes in bestimmten Fällen nützlich ist und jedes die gleiche Back-End-API zur Verwaltung von Firebase-Sicherheitsregeln verwendet.

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

  • Ingests Quelle Regeln: eine Reihe von Regeln, die typischerweise eine Codedatei - Anweisungen enthält Firebase Sicherheitsregeln.
  • Speichert aufgenommene Quelle als unveränderliche ruleset.
  • Track Einsatz jeden ruleset in einer Pressemitteilung. Für Firebase Security Rules aktivierte Dienste suchen nach der Version für ein Projekt, um jede Anfrage für eine gesicherte Ressource zu bewerten.
  • Bietet die Möglichkeit , syntaktische und semantische Tests eines ruleset auszuführen.

Verwenden der Firebase-CLI

Mit der Firebase CLI können Sie lokale Quellen und deploy Versionen laden. Die Firebase CLI Local Emulator Suite können Sie die vollständige lokale Prüfung von Quellen durchführen.

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

Generieren Sie eine Konfigurationsdatei

Wenn Sie Ihre Firebase Projekt mit dem 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

Echtzeit-Datenbank

// 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 Regeln Quelle 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 Aktualisierungen entweder über die Firebase-Konsole oder die Firebase-CLI regelmäßig vornehmen. Andernfalls überschreiben Sie möglicherweise alle Aktualisierungen, die in der Firebase-Konsole vorgenommen wurden.

Testen Sie Ihre Updates

Die Local Emulator Suite bietet Emulatoren für alle Security Rules-fähigen Produkte. Die Security Rules Engine für jeden Emulator führt sowohl die syntaktische als auch die semantische Auswertung von Regeln durch und übertrifft damit die syntaktischen Tests, die die Security Rules Management API bietet.

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

Stellen Sie Ihre Updates bereit

Nachdem Sie Ihre Regeln aktualisiert und getestet haben, stellen Sie die Quellen für die Produktion bereit. Verwenden Sie die folgenden Befehle, um Ihre Regeln selektiv allein oder als Teil Ihres normalen Bereitstellungsprozesses bereitzustellen.

Cloud Firestore

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

Echtzeit-Datenbank

// 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 auch Quellen Regeln bearbeiten und sie als Meldungen aus der Firebase Konsole bereitstellen. Syntaktische Tests , wie Sie bearbeiten in der Firebase Konsole UI durchgeführt und Symantic Tests verfügbar , um die Regeln Spielplatz verwenden.

Bearbeiten und aktualisieren Sie Ihre Regeln

  1. Öffnen Sie die Firebase - Konsole und wählen Sie Ihr Projekt.
  2. Wählen Sie dann in Echtzeit - Datenbank, Wolke Firestor oder Lagerung aus der Produktnavigation, klicken Sie auf Regeln zu dem Regeleditor zu navigieren.
  3. Bearbeiten Sie Ihre Regeln direkt im Editor.

Testen Sie Ihre Updates

Zusätzlich Syntax im Editor UI zu testen, können Sie semantische Regeln Verhalten testen, Ihre Projekt - Datenbank und Speicherressourcen verwenden, direkt in der Konsole Firebase, die unter Verwendung von Regeln Spielplatz . Öffnen Sie die Regeln Spielplatz Bildschirm im Rules - Editor, ändern Sie die Einstellungen und klicken Sie auf Ausführen. Suchen Sie nach der Bestätigungsnachricht oben im Editor.

Stellen Sie Ihre Updates bereit

Sobald Sie zufrieden sind , dass die Updates sind , was Sie erwarten, klicken Sie auf Veröffentlichen.

Verwenden Sie das Admin-SDK

Sie können die Admin SDK für Node.js rulesets verwenden. Mit diesem programmatischen Zugriff können Sie:

  • Implementieren Sie benutzerdefinierte Tools, Skripte, Dashboards und CI/CD-Pipelines zum Verwalten von Regeln.
  • Verwalten Sie Regeln einfacher in mehreren Firebase-Projekten.

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

Beachten Sie auch, dass die Veröffentlichungen von Firebase-Sicherheitsregeln mehrere Minuten dauern, bis sie vollständig verbreitet sind. Wenn Sie das Admin SDK zum Bereitstellen von Regeln verwenden, stellen Sie sicher, dass Race-Conditions vermieden werden, 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 Race-Bedingungen trotz häufiger Aktualisierungen reduzieren sollen.

Beachten Sie auch diese Grenzen:

  • 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.

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

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

  1. Erstellen einer Regeldateiquelle (optional)
  2. Erstellen Sie einen Regelsatz
  3. Freigeben oder bereitstellen des neuen Regelsatzes

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

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

Dasselbe Muster Arbeiten für Cloud Storage Regeln mit releaseFirestoreRulesetFromSource() .

Alternativ können Sie die Regeldatei als speicherinternes Objekt erstellen, den Regelsatz erstellen und den Regelsatz zur genaueren Kontrolle dieser Ereignisse separat bereitstellen. Beispielsweise:

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

Regelsätze der Echtzeitdatenbank aktualisieren

Realtime - Datenbank rulesets mit dem Admin - SDK verwenden , um die zu aktualisieren getRules() und setRules() Methoden der admin.database . 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 Hilfe große rulesets verwalten, können die Admin SDK listen Sie alle bestehenden Regeln mit admin.securityRules().listRulesetMetadata . Beispielsweise:

    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 2500 Regelsätzen erreichen, können Sie eine Logik erstellen, um die ältesten Regeln in einem festen Zeitzyklus zu löschen. Um zum Beispiel alle Regelsätze für länger als 30 Tage im Einsatz zu löschen:

    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 Workflows, Sie können jedoch Firebase-Sicherheitsregeln mithilfe der Verwaltungs-API selbst verwalten und bereitstellen. Die Verwaltungs-API bietet Ihnen die größte Flexibilität.

Beachten Sie, dass die vollständige Verbreitung von Firebase-Sicherheitsregeln mehrere Minuten dauert. Wenn Sie die Management-REST-API für die Bereitstellung verwenden, stellen Sie sicher, dass Race-Conditions vermieden werden, bei denen Ihre App sofort auf Regeln angewiesen ist, deren Bereitstellung noch nicht abgeschlossen ist.

Beachten Sie auch diese Grenzen:

  • 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.

Erstellen und Bereitstellen von Cloud Storage- oder Cloud Firestore-Regelsätzen mit REST

In den Beispielen in diesem Abschnitt werden Speicherregeln verwendet, sie gelten jedoch auch für Cloud Firestore-Regeln.

Die Beispiele verwenden auch cURL, um API-Aufrufe durchzuführen. Schritte zum Einrichten und Übergeben von Authentifizierungstoken entfallen. Sie können mit dieser API experimentieren , um die API - Explorer mit der integrierten Referenzdokumentation .

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

  1. Erstellen Sie eine Regeldateiquellen
  2. Erstellen Sie einen Regelsatz
  3. Freigeben (Bereitstellen) des neuen Regelsatzes

Nehmen wir an , Sie auf Ihrem Arbeits secure_commerce Firebase Projekt und wollen Locked-Down Cloud Storage - Regeln zu implementieren. Sie können diese Regeln in einer implementieren storage.rules Datei.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

Generieren Sie nun einen base64-codierten Fingerabdruck für diese Datei. Anschließend können Sie die Quelle in dieser Datei verwenden , um die Nutzlast zu füllen benötigte einen Regelsatz mit dem erstellen projects.rulesets.create REST Aufruf. Hier verwenden wir die cat Befehl den Inhalt einzufügen storage.rules in die REST - Nutzlast.

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

Die API gibt eine Validierungs Antwort und einen ruleset Namen, zum Beispiel projects/secure_commerce/rulesets/uuid123 . Wenn der Regelsatz gültig ist, besteht der letzte Schritt darin, den neuen Regelsatz in einer benannten Version bereitzustellen.

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

Aktualisieren Sie die Regelsätze der Echtzeitdatenbank mit REST

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

Regelsätze mit REST . verwalten

Um die Verwaltung großer Regelbereitstellungen zu unterstützen, bietet die Verwaltungs-API neben einer REST-Methode zum Erstellen von Regelsätzen und Releases Methoden für Folgendes:

  • Liste, erhalten, und löschen rulesets
  • Liste erhalten und Löschregeln Mitteilungen

Für sehr große Bereitstellungen, die im Laufe der Zeit das Limit von 2500 Regelsätzen erreichen, können Sie eine Logik erstellen, um die ältesten Regeln in einem festen Zeitzyklus zu löschen. Um zum Beispiel alle Regelsätze für länger als 30 Tage im Einsatz zu löschen, können Sie den Anruf projects.rulesets.list Methode, analysieren die JSON Liste der Ruleset Objekte auf ihre createTime Tasten, dann rufen project.rulesets.delete auf den entsprechenden Regelsätze von ruleset_id .

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. Eine Definition von TestSuite JSON - Objekt einen Satz darstellen TestCase Objekte
  2. Das Einreichen der TestSuite
  3. Parsen TestResult - Objekte

Lassen Sie uns einen definieren TestSuite Objekt mit einem einzigen TestCase in einer testcase.json Datei. In diesem Beispiel übergeben wir die Rules-Sprachquelle inline mit der REST-Nutzlast zusammen mit der Testsuite, um diese Regeln auszuführen. Wir geben eine Regelauswertungserwartung und die Clientanforderung an, gegen die der Regelsatz getestet werden soll. Sie können auch angeben, wie vollständig der Testbericht ist, indem Sie den Wert "FULL" 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 ü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 dann diese einreichen TestSuite mit der für evalution projects.test Methode.

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

Der zurückgegebene TestReport (mit Test Erfolg / Mißerfolg - Status, Listen von Debug - Meldungen, Listen der besuchten Regeln Ausdrücke und ihre Bewertungsberichte) würde mit dem Status SUCCESS bestätigen , dass der Zugriff ordnungsgemäß zugelassen ist.