Firebase bietet Ihnen mehrere Tools zum Verwalten Ihrer Security Rules. Jedes Tool ist in bestimmten Fällen nützlich und verwendet dieselbe Backend-API für die Verwaltung von Firebase Sicherheitsregeln.
Unabhängig davon, welches Tool zum Aufrufen verwendet wird, gilt für die Verwaltungs-API Folgendes:
- Sie nimmt eine Quelle für Regeln auf: eine Reihe von Regeln, in der Regel eine Codedatei mit Firebase Security Rules Anweisungen.
- Sie speichert die aufgenommene Quelle als unveränderlichen Regelsatz.
- Sie 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 geschützte Ressource auszuwerten.
- Sie bietet die Möglichkeit, Tests der Syntax und Semantik eines Regelsatzes auszuführen.
Firebase CLI verwenden
Mit der Firebase CLI können Sie lokale Quellen hochladen und Releases bereitstellen. Mit der Firebase Local Emulator Suite der CLI können Sie umfassende 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 CLI konfigurieren, erstellen Sie
eine .rules Konfigurationsdatei in Ihrem Projektverzeichnis. Verwenden Sie den folgenden
Befehl, um die Konfiguration Ihres Firebase-Projekts zu starten:
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 Ihrer Regeln direkt in der .rules-Konfigurationsdatei.
Achten Sie darauf, dass alle Änderungen, die Sie in der Firebase CLI vornehmen, in der Firebase Console berücksichtigt werden. Alternativ können Sie Updates auch ausschließlich in der Firebase Console oder der Firebase CLI vornehmen. Andernfalls überschreiben Sie möglicherweise alle in der Firebase Console vorgenommenen Updates.
bereitstellen, werden mit den in Ihrem Projektverzeichnis definierten Regeln alle vorhandenen Regeln in der Firebase Console überschrieben. Wenn Sie also Ihre Sicherheitsregeln über die Firebase Console definieren oder bearbeiten möchten, müssen Sie auch die in Ihrem Projektverzeichnis definierten Regeln aktualisieren.Aktualisierungen testen
Die Local Emulator Suite bietet Emulatoren für alle Produkte, für die Sicherheitsregeln aktiviert sind. Die Engine für Sicherheitsregeln für jeden Emulator führt sowohl eine syntaktische als auch eine semantische Auswertung der Regeln durch. Das geht über die syntaktischen Tests hinaus, die die Verwaltungs-API für Sicherheitsregeln bietet.
Wenn Sie mit der CLI arbeiten, ist die Suite ein hervorragendes Tool zum Firebase Security Rules Testen. Verwenden Sie die Local Emulator Suite, um Ihre Aktualisierungen lokal zu testen und zu bestätigen, dass die Security Rules Ihrer App das gewünschte Verhalten zeigen.
Aktualisierungen bereitstellen
Nachdem Sie Ihre Security Rules aktualisiert und getestet haben, stellen Sie die Quellen in der Produktion bereit.
Für Cloud Firestore Security Rules verknüpfen Sie .rules Dateien mit Ihren Standarddatenbanken und
zusätzlichen benannten Datenbanken, indem Sie die Datei
firebase.json überprüfen und aktualisieren.
Verwenden Sie die folgenden Befehle, um Ihre Security Rules selektiv oder im Rahmen des 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 Console verwenden
Sie können Security Rules Quellen auch bearbeiten und sie als Releases über die Firebase Console bereitstellen. Die syntaktischen Tests werden beim Bearbeiten in der Firebase Console-UI durchgeführt. Semantische Tests sind mit dem Security Rules Playground möglich.
Regeln bearbeiten und aktualisieren
- Öffnen Sie die Firebase Konsole und wählen Sie Ihr Projekt aus.
- Wählen Sie in der Produktnavigation Realtime Database, Cloud Firestore oder Storage aus und klicken Sie dann auf Regeln , um zum Security Rules Editor zu gelangen.
- Bearbeiten Sie Ihre Regeln direkt im Editor.
Aktualisierungen testen
Neben dem Testen der Syntax in der Editor-UI können Sie das semantische Security Rules Verhalten mit den Datenbank- und Speicherressourcen Ihres Projekts direkt in der Firebase Console mit dem Security Rules Playground testen. Öffnen Sie im Security Rules Editor den Bildschirm Rules Playground, ändern Sie die Einstellungen und klicken Sie auf Ausführen. Suchen Sie oben im Editor nach der Bestätigungsnachricht.
Aktualisierungen bereitstellen
Wenn Sie mit den Aktualisierungen zufrieden sind, klicken Sie auf Veröffentlichen.
Admin SDK verwenden
Sie können das Admin SDK für Node.js Regelsätze verwenden. Mit diesem programmatischen Zugriff haben Sie folgende Möglichkeiten:
- 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 dem Schwerpunkt auf Sicherheit, insbesondere beim Aktualisieren oder Bereitstellen von Regeln.
Ein weiterer wichtiger Punkt ist, dass es mehrere Minuten dauert, bis Firebase Security Rules vollständig übernommen werden. Wenn Sie die Admin SDK zum Bereitstellen von Regeln verwenden, vermeiden Sie Race Conditions, 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. wurde entwickelt, um Race Conditions trotz häufiger Aktualisierungen zu reduzieren.
Beachten Sie auch diese Limits:
- Regeln müssen nach der Serialisierung kleiner als 256 KiB UTF-8-codierter Text sein.
- Ein Projekt kann 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 Storage- oder Cloud Firestore-Regelsätze erstellen und bereitstellen
Ein typischer Workflow zum Verwalten von Sicherheitsregeln mit dem Admin SDK kann drei separate Schritte umfassen:
- Eine Quellendatei für Regeln erstellen (optional)
- Einen Regelsatz erstellen
- Den neuen Regelsatz freigeben 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 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 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 dem 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;
}
}
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 seit 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 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 Verwaltungs-API selbst verwalten und bereitstellen. Die Verwaltungs-API bietet Ihnen die größte Flexibilität.
Beachten Sie auch diese Limits:
- Regeln müssen nach der Serialisierung kleiner als 256 KiB UTF-8-codierter Text sein.
- Ein Projekt kann 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 werden Firestore Security Rules verwendet. Sie gelten aber auch für Cloud Storage Security Rules as well.
In den Beispielen wird auch cURL verwendet, um API-Aufrufe auszuführen. Die Schritte zum Einrichten und Übergeben von Authentifizierungstokens werden nicht beschrieben. Sie können mit dieser API mit dem API Explorer experimentieren, der in die Referenzdokumentation eingebunden ist.
Typische Schritte zum Erstellen und Bereitstellen eines Regelsatzes mit der Verwaltungs-API sind:
- Quellen für Regeldateien erstellen
- Einen Regelsatz erstellen
- Den neuen Regelsatz freigeben (bereitstellen)
Quelle erstellen
Angenommen, Sie arbeiten an Ihrem secure_commerce Firebase-Projekt und möchten eingeschränkte Cloud Firestore Security Rules für eine 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 dann die
Quelle in dieser Datei verwenden, um die Nutzlast zu füllen, die zum Erstellen eines Regelsatzes mit dem
projects.rulesets.create REST-Aufruf erforderlich ist. Verwenden Sie hier den cat Befehl, um
den Inhalt von firestore.rules in die REST-Nutzlast einzufügen.
Um dies zu verfolgen und mit Ihrer east_store-Datenbank zu verknüpfen, 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 freigeben (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 mehrere Minuten dauert, bis Firebase Security Rules vollständig übernommen werden. Wenn Sie die Verwaltungs-REST API zum Bereitstellen verwenden, vermeiden Sie Race Conditions, 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 Security Rules. Weitere Informationen finden Sie unter Firebase Realtime Database Security Rules über REST verwalten.
Regelsätze mit REST verwalten
Um große Bereitstellungen von Regeln zu verwalten, bietet die Verwaltungs-API neben einer REST-Methode zum Erstellen von Regelsätzen und Releases auch Methoden für Folgendes:
- Regelsätze auflisten, abrufen und löschen
- Releases von Regeln 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 seit mehr als 30 Tagen bereitgestellt wurden, können Sie die
projects.rulesets.list Methode 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 Verwaltungs-API syntaktische und semantische Tests für Cloud Firestore und Cloud Storage Ressourcen in Ihren Produktions Projekten ausführen.
Das Testen mit dieser Komponente der API umfasst Folgendes:
- Definieren eines
TestSuite-JSON-Objekts, das eine Reihe vonTestCase-Objekten darstellt - Senden der
TestSuite - 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 Security Rules
Quellsprache 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 Auswertung der Regeln und die Client
anfrage an, anhand derer der Regelsatz 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
Security Rules Ausdrücke der Sprache für Sicherheitsregeln in den Bericht aufgenommen werden 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 projects.test
Methode zur Auswertung senden.
curl -X POST -d '{
' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'Der zurückgegebene TestReport (mit dem Status „ERFOLG“ oder „FEHLER“ des Tests, Listen mit
Debug-Meldungen, Listen mit besuchten Regelausdrücken und deren Auswertungsberichten)
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, die Cloud Firestore Dokumentinhalte verwenden, um Sicherheitsbedingungen auszuwerten, werden Sie in der Firebase Console oder Firebase CLI aufgefordert, Berechtigungen zum Verbinden der beiden Produkte zu aktivieren.
Wenn Sie diese dienstübergreifende Sicherheit deaktivieren möchten, gehen Sie so vor:
Bevor Sie die Funktion deaktivieren, bearbeiten Sie Ihre Regeln und entfernen Sie alle Anweisungen, die Security Rules Funktionen verwenden, um auf Cloud Firestore zuzugreifen. Andernfalls führen Security Rules Auswertungen nach dem Deaktivieren der Funktion dazu, dass Ihre Storage-Anfragen fehlschlagen.
Löschen Sie auf der Seite IAM in der Google Cloud Console die Rolle „Firestore-Dienst-Agent für Firebase Regeln“ gemäß der Cloud-Anleitung zum Widerrufen von Rollen.
Sie werden aufgefordert, die Funktion wieder zu aktivieren, wenn Sie das nächste Mal dienstübergreifende Regeln über die Firebase CLI oder die Firebase Console speichern.