Firebase bietet mehrere Tools zum Verwalten Ihrer Security Rules, die jeweils in bestimmten Fällen nützlich sind und alle dieselbe Backend-API zur Verwaltung von Firebase-Sicherheitsregeln verwenden.
Unabhängig davon, welches Tool zum Aufrufen der Management API verwendet wird, gilt Folgendes:
- Nimmt eine Regelquelle auf: eine Reihe von Regeln, in der Regel eine Codedatei mit Firebase Security Rules-Anweisungen.
- Speichert die aufgenommene Quelle als unveränderlichen Regelsatz.
- Verfolgt die Bereitstellung jedes Regelsatzes in einem Release. Dienste, für die Firebase-Sicherheitsregeln aktiviert sind, suchen nach dem Release für ein Projekt, um jede Anfrage für eine gesicherte Ressource auszuwerten.
- Bietet die Möglichkeit, syntaktische und semantische Tests eines Regelsets auszuführen.
Firebase CLI verwenden
Mit der Firebase-Befehlszeile können Sie lokale Quellen hochladen und Releases bereitstellen. Mit der Firebase Local Emulator Suite der Befehlszeile können Sie Quellen vollständig lokal testen.
Mit der Befehlszeile können Sie Ihre Regeln zusammen mit Ihrem Anwendungscode unter Versionsverwaltung halten und Regeln im Rahmen Ihres bestehenden Bereitstellungsprozesses bereitstellen.
Konfigurationsdatei generieren
Wenn Sie Ihr Firebase-Projekt mit der Firebase-Befehlszeile 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
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, oder dass Sie Aktualisierungen einheitlich entweder über die Firebase-Konsole oder die Firebase-Befehlszeile vornehmen. Andernfalls werden möglicherweise alle in der Firebase-Konsole vorgenommenen Aktualisierungen überschrieben.
Aktualisierungen testen
Die Local Emulator Suite bietet Emulatoren für alle Produkte, die Sicherheitsregeln unterstützen. Die Security Rules-Engine für jeden Emulator führt sowohl eine syntaktische als auch eine semantische Bewertung von Regeln durch und geht damit über die syntaktischen Tests hinaus, 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 die Local Emulator Suite, um Ihre Updates lokal zu testen und zu prüfen, ob die Security Rules Ihrer App das gewünschte Verhalten zeigen.
Updates bereitstellen
Nachdem Sie Ihre Security Rules aktualisiert und getestet haben, stellen Sie die Quellen in der Produktion bereit.
Verknüpfen Sie für Cloud Firestore Security Rules die .rules-Dateien mit Ihren Standarddatenbanken und zusätzlichen benannten Datenbanken, indem Sie die firebase.json-Datei prüfen und aktualisieren.
Verwenden Sie die folgenden Befehle, um Ihre Security Rules selektiv allein 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>
Realtime Database
// Deploy your .rules file firebase deploy --only database
Cloud Storage
// Deploy your .rules file firebase deploy --only storage
Verwenden Sie die Firebase Console.
Sie können auch Security Rules-Quellen bearbeiten und als Releases über die Firebase-Konsole bereitstellen. Syntaktische Tests werden durchgeführt, während Sie in der Firebase-Console-UI Änderungen vornehmen. Semantische Tests sind über den Security 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 Storage aus und klicken Sie auf Regeln, um den Security Rules-Editor aufzurufen.
- Bearbeiten Sie Ihre Regeln direkt im Editor.
Aktualisierungen testen
Zusätzlich zum Testen der Syntax in der Editor-UI können Sie das semantische Verhalten von Security Rules mithilfe der Datenbank- und Speicherressourcen Ihres Projekts direkt in der Firebase-Konsole mit dem Security Rules Playground testen. Öffnen Sie den Bildschirm Rules Playground im Security Rules-Editor, ändern Sie die Einstellungen und klicken Sie auf Ausführen. Oben im Editor wird eine Bestätigungsmeldung angezeigt.
Updates bereitstellen
Wenn Sie mit den Änderungen zufrieden sind, klicken Sie auf Veröffentlichen.
Admin SDK verwenden
Sie können die Regelsätze für Node.js von Admin SDK verwenden. Mit diesem programmatischen Zugriff können Sie:
- Benutzerdefinierte Tools, Skripts, Dashboards und CI/CD-Pipelines zum Verwalten von Regeln implementieren.
- Regeln in mehreren Firebase-Projekten einfacher 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.
Ein weiterer wichtiger Punkt ist, dass es einige Minuten dauert, bis Firebase Security Rules-Releases vollständig bereitgestellt sind. 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 außerdem die folgenden Limits:
- Regeln müssen kleiner als 256 KiB UTF-8-codierter Text sein, wenn sie serialisiert werden.
- Ein Projekt kann insgesamt maximal 2.500 bereitgestellte Regelsätze haben. 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 zum Verwalten von Sicherheitsregeln mit dem Admin SDK könnte drei separate Schritte umfassen:
- Regeldateiquelle erstellen (optional)
- Regelsatz erstellen
- Neuen Regelsatz veröffentlichen oder bereitstellen
Das SDK bietet eine Methode, um diese Schritte für Cloud Storage- und Cloud Firestore-Sicherheitsregeln in einem einzigen API-Aufruf zu kombinieren. 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);
Dasselbe 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. Beispiel:
const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
const rs = await admin.securityRules().createRuleset(rf);
await admin.securityRules().releaseFirestoreRuleset(rs);
Realtime Database Regelsatz aktualisieren
Verwenden Sie zum Aktualisieren von Realtime Database-Regelsätzen mit der Admin SDK die Methoden getRules() und setRules() von 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
Mit dem Admin SDK können Sie alle vorhandenen Regeln mit admin.securityRules().listRulesetMetadata auflisten, um große Regelsätze besser zu verwalten. 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. 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 der REST API
Die oben beschriebenen Tools eignen sich gut für verschiedene Workflows, einschließlich der Verwaltung von Firebase Security Rules für mehrere Cloud Firestore-Datenbanken in Ihrem Projekt. Möglicherweise möchten Sie Firebase Security Rules jedoch mit der Verwaltungs-API selbst verwalten und bereitstellen. Die Management API bietet Ihnen die größte Flexibilität.
Beachten Sie außerdem die folgenden Limits:
- Regeln müssen kleiner als 256 KiB UTF-8-codierter Text sein, wenn sie serialisiert werden.
- Ein Projekt kann insgesamt maximal 2.500 bereitgestellte Regelsätze haben. 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 Security Rules verwendet, sie gelten aber auch für Cloud Storage Security Rules.
In den Beispielen wird auch cURL verwendet, um API-Aufrufe auszuführen. Die 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 mit der Management API:
- Quellen für Regeldateien erstellen
- Regelsatz erstellen
- Geben Sie den neuen Regelsatz frei (stellen Sie ihn bereit).
Quelle erstellen
Angenommen, Sie arbeiten an Ihrem Firebase-Projekt secure_commerce und möchten gesperrte Cloud Firestore-Security 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 jetzt 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, die zum Erstellen eines Regelsets mit dem REST-Aufruf projects.rulesets.create erforderlich ist. Verwenden Sie hier den Befehl cat, um den Inhalt von firestore.rules in die REST-Nutzlast einzufügen.
Wenn Sie dies zu Trackingzwecken mit Ihrer east_store-Datenbank verknüpfen möchten, legen Sie für attachment_point den Wert 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 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 es einige Minuten dauern kann, bis Firebase Security Rules-Releases vollständig bereitgestellt sind. Wenn Sie die Management REST API für die Bereitstellung verwenden, sollten Sie Race-Bedingungen vermeiden, bei denen Ihre Anwendung 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 Security Rules. Weitere Informationen finden Sie unter Firebase-Realtime Database-Security Rules über REST verwalten.
Regelsätze mit REST verwalten
Zur Verwaltung großer Regelbereitstellungen 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
- Regel-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 Regelsätze 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 nach ihren createTime-Schlüsseln parsen und dann project.rulesets.delete für die entsprechenden Regelsätze nach ruleset_id aufrufen.
Aktualisierungen mit REST testen
Schließlich können Sie mit der Management 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 umfasst Folgendes:
TestSuite-JSON-Objekt definieren, um eine Reihe vonTestCase-Objekten darzustellenTestSuiteeinreichen- Parsing hat
TestResultObjekte zurückgegeben
Definieren wir ein TestSuite-Objekt mit einem einzelnen TestCase in einer testcase.json-Datei. In diesem Beispiel übergeben wir die Security Rules-Sprachquelle inline mit der REST-Nutzlast zusammen mit der Test-Suite, die für diese Regeln ausgeführt werden soll. Wir geben eine Erwartung für die Regelauswertung und die Clientanfrage an, anhand derer die Regeln getestet werden sollen. Sie können auch angeben, wie vollständig der Testbericht sein soll. Verwenden Sie dazu den Wert „FULL“, um anzugeben, dass die Ergebnisse für alle Security Rules-Sprachausdrücke im Bericht enthalten sein sollen, einschließlich 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 mit der Methode projects.test 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 SUCCESS/FAILURE, Listen von Debug-Nachrichten, Listen von besuchten Rules-Ausdrücken und deren Auswertungsberichten) würde mit dem Status SUCCESS 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, die Cloud Firestore-Dokumentinhalte zum Bewerten von Sicherheitsbedingungen verwenden, werden Sie in der Firebase Console oder der Firebase-Befehlszeile aufgefordert, Berechtigungen zum Verbinden der beiden Produkte zu aktivieren.
Wenn Sie diese dienstübergreifende Sicherheit deaktivieren:
Bearbeiten Sie zuerst Ihre Regeln, bevor Sie die Funktion deaktivieren. Entfernen Sie alle Anweisungen, die Security Rules-Funktionen für den Zugriff auf Cloud Firestore verwenden. Andernfalls führen Security Rules-Auswertungen nach dem Deaktivieren der Funktion dazu, dass Ihre Speicheranfragen fehlschlagen.
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 wieder zu aktivieren, wenn Sie das nächste Mal dienstübergreifende Regeln über die Firebase-Befehlszeile oder die Firebase-Konsole speichern.