Firebase bietet Ihnen mehrere Tools zum Verwalten Ihrer Rules. Jedes Tool ist für bestimmte Anwendungsfälle nützlich und nutzt dieselbe Backend-API zur Verwaltung von Firebase-Sicherheitsregeln.
Unabhängig davon, mit welchem Tool sie aufgerufen wird, gilt für die Management API:
- Nimmt eine Quelle für Regeln auf: eine Reihe von Regeln, in der Regel eine Codedatei mit Firebase Security Rules-Anweisungen.
- Speichert die aufgenommene Quelle als unveränderliches Regelset.
- Verfolgt die Bereitstellung jedes Regelsatzes in einem Release. Dienste, für die Firebase-Sicherheitsregeln aktiviert sind, suchen nach der Release-Version eines Projekts, um jede Anfrage für eine geschützte Ressource auszuwerten.
- Ermöglicht das Ausführen von syntaktischen und semantischen Tests eines Regelsatzes.
Firebase CLI verwenden
Mit der Firebase-CLI können Sie lokale Quellen hochladen und Releases bereitstellen. Mit dem Firebase Local Emulator Suite-Befehl der CLI können Sie Quellen vollständig lokal testen.
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. Verwenden Sie den folgenden Befehl, 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 Quelle der Regeln direkt in der Konfigurationsdatei .rules
.
Achten Sie darauf, dass alle Änderungen, die Sie in der Firebase-Befehlszeile vornehmen, in der Firebase-Konsole berücksichtigt werden. Alternativ können Sie auch alle Aktualisierungen entweder in der Firebase-Konsole oder in der Firebase CLI vornehmen. Andernfalls überschreiben Sie möglicherweise alle in der Firebase-Konsole vorgenommenen Änderungen.
Aktualisierungen testen
Das Local Emulator Suite bietet Emulatoren für alle Produkte, für die Sicherheitsregeln aktiviert sind. Die Security Rules-Engine für jeden Emulator führt sowohl eine syntaktische als auch eine semantische Auswertung von Regeln durch. Das geht über die syntaktischen Tests hinaus, die die Security Rules Management API bietet.
Wenn Sie mit der CLI 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.
Für Cloud Firestore Security Rules müssen Sie .rules
-Dateien mit Ihrer Standarddatenbank und zusätzlichen benannten Datenbanken verknüpfen. Dazu müssen Sie Ihre firebase.json
-Datei überprüfen und aktualisieren.
Verwenden Sie die folgenden Befehle, um Ihre Rules einzeln oder im Rahmen 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>
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 in der Firebase-Konsole bearbeiten und als Releases bereitstellen. Die syntaktische Validierung erfolgt während der Bearbeitung in der Firebase-Konsolen-UI. Die semantische Validierung ist über den Rules-Playground verfügbar.
Regeln bearbeiten und aktualisieren
- Öffnen Sie die Firebase-Konsole und wählen Sie Ihr Projekt aus.
- Wählen Sie dann in der Produktnavigation Realtime Database, Cloud Firestore oder Speicher aus und klicken Sie auf Regeln, um zum Rules-Editor zu gelangen.
- Bearbeiten Sie die Regeln direkt im Editor.
Aktualisierungen testen
Neben dem Testen der Syntax in der Editor-UI können Sie das semantischeRules Verhalten mit den Datenbank- und Speicherressourcen Ihres Projekts direkt in der Firebase-Konsole über die Rules Playground testen. Ö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 die Admin SDK für Node.js-Regelsätze verwenden. Mit diesem programmatischen Zugriff können Sie:
- Benutzerdefinierte Tools, Skripts, Dashboards und CI/CD-Pipelines zum Verwalten von Regeln implementieren.
- 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 mit besonderem Augenmerk auf die Sicherheit, insbesondere beim Aktualisieren oder Bereitstellen von Regeln.
Außerdem ist es wichtig zu wissen, dass es bei Firebase Security Rules-Releases einige Minuten dauern kann, bis alle Änderungen übernommen wurden. Wenn Sie die Admin SDK zum Bereitstellen von Regeln verwenden, sollten Sie Race-Bedingungen vermeiden, bei denen Ihre App sofort auf Regeln angewiesen ist, deren Bereitstellung noch nicht abgeschlossen ist. Wenn Ihr Anwendungsfall häufige Aktualisierungen der Zugriffssteuerungsregeln erfordert, sollten Sie Lösungen mit Cloud Firestore in Betracht ziehen. Diese sind so konzipiert, dass Race-Bedingungen trotz häufiger Aktualisierungen reduziert werden.
Beachten Sie auch die folgenden Einschränkungen:
- Regeln dürfen nach der Serialisierung nicht größer als 256 KiB UTF‑8-codierter Text sein.
- Ein Projekt kann maximal 2.500 bereitgestellte Regelsätze umfassen. Wenn dieses Limit erreicht ist, müssen Sie einige alte Regelsätze löschen, bevor Sie neue erstellen können.
Cloud Storage- oder Cloud Firestore-Regelsätze erstellen und bereitstellen
Ein typischer Workflow für die Verwaltung von Sicherheitsregeln mit der Admin SDK kann drei separate Schritte umfassen:
- Regeldateiquelle erstellen (optional)
- Regelsatz erstellen
- Geben Sie das neue Regelset frei oder stellen Sie es bereit.
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 Regelsatzdatei als In-Memory-Objekt erstellen, den Regelsatz erstellen und ihn separat bereitstellen, um diese Ereignisse besser 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-Regelsätze aktualisieren
Verwenden Sie die Methoden getRules()
und setRules()
von admin.database
, um Realtime Database-Regelsätze mit Admin SDK zu aktualisieren. Sie können Regelsätze im JSON-Format oder als String mit Kommentaren abrufen.
So aktualisieren Sie ein Regelset:
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 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 Bereitstellungen, die im Laufe der Zeit das Limit von 2.500 Regelsätzen 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 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 Arbeitsabläufe, einschließlich der Firebase Security Rules-Verwaltung für mehrere Cloud Firestore-Datenbanken in Ihrem Projekt. Möglicherweise möchten Sie Firebase Security Rules aber auch mit der Management API selbst verwalten und bereitstellen. Die Management API bietet Ihnen die größte Flexibilität.
Referenzdokumentation zur REST API für die Regelverwaltung.Beachten Sie auch die folgenden Einschränkungen:
- Regeln dürfen nach der Serialisierung nicht größer als 256 KiB UTF‑8-codierter Text sein.
- Ein Projekt kann maximal 2.500 bereitgestellte Regelsätze umfassen. Wenn 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. Sie gelten jedoch auch für Cloud Storage Rules.
In den Beispielen wird auch cURL für API-Aufrufe verwendet. Schritte zum Einrichten und Übergeben von Authentifizierungstokens werden ausgelassen. Sie können mit dieser API experimentieren, indem Sie den in die Referenzdokumentation integrierten API Explorer verwenden.
Typische Schritte zum Erstellen und Bereitstellen eines Regelsatzes mit der Management API:
- Regeldateiquellen erstellen
- Regelsatz erstellen
- Stellen Sie das neue Regelset bereit.
Quelle erstellen
Angenommen, Sie arbeiten an Ihrem Firebase-Projekt secure_commerce
und möchten die gesperrte Cloud Firestore Rules in einer Datenbank in Ihrem Projekt mit dem Namen 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
Generieren Sie nun einen base64-codierten Fingerabdruck für diese Datei. Sie können die Quelle in dieser Datei dann verwenden, um die Nutzlast zu erstellen, die zum Erstellen eines Regelsatzes mit dem projects.rulesets.create
-REST-Aufruf erforderlich ist. Verwenden Sie hier den Befehl cat
, um den Inhalt von firestore.rules
in die REST-Nutzlast einzufügen.
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 das Regelset gültig ist, müssen Sie es im letzten Schritt in einer benannten Version bereitstellen.
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 bei Firebase Security Rules-Releases mehrere Minuten dauern kann, bis die Änderungen vollständig übernommen werden. Wenn Sie die Management 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 zum Verwalten von Rules. Weitere Informationen finden Sie unter Firebase-Realtime Database-Rules-Verwaltung über REST.
Regelsätze mit REST verwalten
Um die Bereitstellung großer Mengen von Regeln zu vereinfachen, bietet die Management API neben einer REST-Methode zum Erstellen von Regelsätzen und Releases auch Methoden für Folgendes:
- Regelsätze auflisten, abrufen und löschen
- Regeln für Releases auflisten, abrufen und löschen
Bei sehr großen Bereitstellungen, die im Laufe der Zeit das Limit von 2.500 Regelsätzen erreichen, können Sie eine Logik erstellen, um die ältesten Regeln in einem festen Zeitzyklus zu löschen. Wenn Sie beispielsweise alle Regeln löschen möchten, die länger als 30 Tage 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 Regeln nach ruleset_id
aufrufen.
Aktualisierungen mit REST testen
Mit der Management API können Sie schließlich syntaktische und semantische Tests für Cloud Firestore- und Cloud Storage-Ressourcen in Ihren Produktionsprojekten ausführen.
Das Testen mit dieser Komponente der API umfasst Folgendes:
- Definieren eines
TestSuite
-JSON-Objekts zur Darstellung einer Gruppe vonTestCase
-Objekten TestSuite
wird gesendet- Zurückgegebene
TestResult
-Objekte parsen
Wir definieren 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 das Regelset getestet werden soll. Sie können auch angeben, wie vollständig der Testbericht sein soll. Verwenden Sie den Wert „FULL“, um anzugeben, dass Ergebnisse für alle Rules-Sprachausdrücke im Bericht enthalten sein sollen, einschließlich Ausdrücken, 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 dann TestSuite
zur Auswertung mit der Methode 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 dem Status „ERFOLG“/„FEHLER“ für den Test, Listen mit Debugging-Meldungen, Listen mit besuchten Regelausdrücken und deren Auswertungsberichten) würde mit dem Status „ERFOLG“ bestätigen, dass der Zugriff ordnungsgemäß erlaubt ist.
Berechtigungen für dienstübergreifende Cloud Storage Security Rules verwalten
Wenn Sie Cloud Storage Security Rules erstellen, in denen Cloud Firestore-Dokumentinhalte verwendet werden, um Sicherheitsbedingungen zu bewerten, werden Sie in der Firebase-Konsole oder der Firebase-Befehlszeile aufgefordert, Berechtigungen zum Verbinden der beiden Produkte zu aktivieren.
Wenn Sie sich entscheiden, diese dienstübergreifende Sicherheit zu deaktivieren:
Bearbeiten Sie zuerst Ihre Regeln und entfernen Sie alle Anweisungen, in denen Rules-Funktionen für den Zugriff auf Cloud Firestore verwendet werden, bevor Sie die Funktion deaktivieren. Andernfalls schlagen Ihre Speicheranfragen nach der Deaktivierung der Funktion aufgrund von Rules-Auswertungen fehl.
Löschen Sie die Rolle „Firebase Rules Firestore Service Agent“ auf der Seite IAM in der Google Cloud Console. Folgen Sie dazu der Cloud-Anleitung zum Widerrufen von Rollen.
Sie werden aufgefordert, das Feature beim nächsten Speichern von dienstübergreifenden Regeln über die Firebase-Befehlszeile oder die Firebase-Konsole wieder zu aktivieren.