Beachten Sie die folgenden Richtlinien, um Ihre Firebase-Ressourcen und die Daten Ihrer Nutzer zu schützen. Nicht alle Punkte gelten unbedingt für Ihre Anforderungen, aber denken Sie bei der Entwicklung Ihrer App daran.
Missbrauch von Zugriffen vermeiden
Monitoring und Benachrichtigungen für Backend-Dienste einrichten
Wenn Sie missbräuchlichen Traffic wie Denial-of-Service-Angriffe (DoS) erkennen möchten, richten Sie Monitoring und Benachrichtigungen für Cloud Firestore, Realtime Database, Cloud Storage und Hosting ein.
Wenn Sie den Verdacht haben, dass Ihre Anwendung angegriffen wurde, wenden Sie sich so schnell wie möglich an den Support, um ihn über das Problem zu informieren.
App Check aktivieren
Damit nur Ihre Apps auf Ihre Backend-Dienste zugreifen können, aktivieren Sie Firebase App Check für jeden Dienst, der diese Funktion unterstützt.
Cloud Functions für normalen Traffic skalieren
Cloud Functions wird automatisch skaliert, um die Anforderungen Ihrer App zu erfüllen. Im Falle eines Angriffs kann dies jedoch eine hohe Rechnung bedeuten. Um dies zu verhindern, können Sie die Anzahl der gleichzeitigen Instanzen einer Funktion basierend auf dem normalen Traffic für Ihre App begrenzen.
Richten Sie Benachrichtigungen ein, damit Sie informiert werden, wenn die Limits fast erreicht sind.
Wenn bei Ihrem Dienst ein Anfrageanstieg auftritt, werden häufig Kontingente aktiviert, die den Traffic zu Ihrer Anwendung automatisch begrenzen. Sie sollten Ihr Dashboard für Nutzung und Abrechnung im Blick behalten. Sie können aber auch Budgetbenachrichtigungen für Ihr Projekt einrichten, um benachrichtigt zu werden, wenn die Ressourcennutzung die Erwartungen übersteigt.
Selbst-DoS-Angriffe verhindern: Funktionen lokal mit den Emulatoren testen
Es kann leicht passieren, dass Sie sich beim Entwickeln von Cloud Functions versehentlich selbst DOS-angreifen, z. B. durch das Erstellen einer unendlichen Trigger-Schreibschleife. Sie können verhindern, dass sich diese Fehler auf Live-Dienste auswirken, indem Sie Ihre Entwicklung mit der Firebase Local Emulator Suite durchführen.
Wenn Sie sich versehentlich selbst DOS-Angriffe ausführen, können Sie die Bereitstellung Ihrer Funktion aufheben, indem Sie sie aus index.js
löschen und dann firebase deploy --only functions
Wenn die Echtzeitreaktion weniger wichtig ist, sollten Sie Funktionen defensiv strukturieren.
Wenn Sie das Ergebnis einer Funktion nicht in Echtzeit präsentieren müssen, können Sie missbräuchlichen Traffic durch die Batchverarbeitung der Ergebnisse minimieren: Veröffentlichen Sie die Ergebnisse in einem Pub/Sub-Thema und verarbeiten Sie sie in regelmäßigen Abständen mit einer geplante Funktion.
API-Schlüssel
API-Schlüssel für Firebase-Dienste sind nicht geheim
Firebase verwendet API-Schlüssel nur, um das Firebase-Projekt Ihrer App für Firebase-Dienste zu identifizieren. Der Zugriff auf Datenbank- oder Cloud Storage-Daten wird mit Firebase Security Rules gesteuert. Aus diesem Grund müssen Sie API-Schlüssel für Firebase-Dienste nicht als Secrets behandeln und können sie sicher in Clientcode einbetten. Weitere Informationen zu API-Schlüsseln für Firebase
Einschränkungen für API-Schlüssel einrichten
Als zusätzliche Abschreckung für Angreifer, die versuchen, Ihren API-Schlüssel zu verwenden, um Anfragen zu fälschen, können Sie API-Schlüsseleinschränkungen hinzufügen, um Ihre API-Schlüssel auf Ihre App-Clients und die von Ihnen verwendeten APIs zu beschränken.
FCM-Serverschlüssel geheim halten
Im Gegensatz zu API-Schlüsseln für Firebase-Dienste sind FCM-Serverschlüssel (die von der alten FCM HTTP API verwendet werden) vertraulich und müssen geheim gehalten werden.
Dienstkontoschlüssel geheim halten
Im Gegensatz zu API-Schlüsseln für Firebase-Dienste sind private Dienstkontoschlüssel (die von der Firebase Admin SDK verwendet werden) vertraulich und müssen geheim gehalten werden.
Firebase Security Rules
Regeln im Produktions- oder Sperrmodus initialisieren
Wenn Sie Cloud Firestore, Realtime Database und Cloud Storage einrichten, initialisieren Sie Firebase Security Rules so, dass standardmäßig der gesamte Zugriff abgelehnt wird. Fügen Sie dann beim Entwickeln Ihrer App Regeln hinzu, die den Zugriff auf bestimmte Ressourcen gewähren.
Verwenden Sie eine der Standardeinstellungen für neue Instanzen von Cloud Firestore (Produktionsmodus) und Realtime Database (gesperrter Modus). Beginnen Sie für Cloud Storage mit einer Sicherheitsregelnkonfiguration wie der folgenden:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if false;
}
}
}
Sicherheitsregeln sind ein Schema; Regeln werden hinzugefügt, wenn Sie Dokumente hinzufügen
Sicherheitsregeln sollten nicht erst nach dem Erstellen der App als Art Vorabaufgabe geschrieben werden. Erstellen Sie stattdessen Sicherheitsregeln, während Sie Ihre App entwickeln, und behandeln Sie sie wie ein Datenbankschema: Wenn Sie einen neuen Dokumenttyp oder eine neue Pfadstruktur verwenden müssen, schreiben Sie zuerst die Sicherheitsregel.
Sicherheitsregeln mit der Local Emulator Suite in einem Unit-Test testen und dem CI hinzufügen
Damit Ihre Sicherheitsregeln mit der Entwicklung Ihrer App Schritt halten, sollten Sie sie mit dem Firebase Local Emulator Suite testen und diese Tests Ihrer CI-Pipeline hinzufügen. Weitere Informationen zu Cloud Firestore und Realtime Database
Authentifizierung
Benutzerdefinierte Authentifizierung: JWTs aus einer vertrauenswürdigen (serverseitigen) Umgebung generieren
Wenn Sie bereits ein sicheres Anmeldesystem haben, z. B. ein benutzerdefiniertes System oder einen Drittanbieterdienst, können Sie Ihr vorhandenes System für die Authentifizierung bei Firebase-Diensten verwenden. Erstelle benutzerdefinierte JWTs aus einer vertrauenswürdigen Umgebung und übergebe die Tokens dann an deinen Client, der das Token zur Authentifizierung verwendet (iOS+, Android, Web, Unity, C++).
Ein Beispiel für die Verwendung der benutzerdefinierten Authentifizierung mit einem Drittanbieter finden Sie im Blogpost Mit Okta bei Firebase authentifizieren.
Verwaltete Authentifizierung: OAuth 2.0-Anbieter sind am sichersten
Wenn Sie die verwalteten Authentifizierungsfunktionen von Firebase verwenden, sind die OAuth 2.0-/OpenID Connect-Anbieteroptionen (Google, Facebook usw.) am sichersten. Je nach Nutzerbasis sollten Sie einen oder mehrere dieser Anbieter unterstützen.
E-Mail-Passwort-Authentifizierung: Legen Sie ein enges Kontingent für den Anmeldeendpunkt fest, um Brute-Force-Angriffe zu verhindern.
Wenn Sie den verwalteten E-Mail-/Passwort-Authentifizierungsdienst von Firebase verwenden, verschärfen Sie das Standardkontingent der identitytoolkit.googleapis.com
-Endpunkte, um Brute-Force-Angriffe zu verhindern. Sie können dies in der Google Cloud Console auf der Seite Identity Toolkit API tun.
E-Mail-Passwort-Authentifizierung: Schutz vor E-Mail-Enumeration aktivieren
Wenn Sie den verwalteten E-Mail- und Passwort-Authentifizierungsdienst von Firebase verwenden, aktivieren Sie den Schutz vor E-Mail-Aufzählung. So wird verhindert, dass böswillige Akteure die Authentifizierungsendpunkte Ihres Projekts missbrauchen, um Kontonamen zu erraten.
Auf Google Cloud Identity Platform upgraden, um die Multi-Faktor-Authentifizierung zu nutzen
Für zusätzliche Sicherheit bei der Anmeldung können Sie die Multi-Faktor-Authentifizierung aktivieren, indem Sie auf Google Cloud Identity Platform umstellen. Ihr vorhandener Firebase Authentication-Code funktioniert nach dem Upgrade weiterhin.
Anonyme Authentifizierung
Verwenden Sie die anonyme Authentifizierung nur für das Warm-Onboarding.
Verwenden Sie die anonyme Authentifizierung nur, um den grundlegenden Status für Nutzer zu speichern, bevor sie sich tatsächlich anmelden. Die anonyme Authentifizierung ist kein Ersatz für die Nutzeranmeldung.
Nutzer zu einer anderen Anmeldemethode wechseln lassen, wenn sie ihre Daten auf anderen Geräten verwenden möchten
Daten zur anonymen Authentifizierung bleiben nicht erhalten, wenn der Nutzer den lokalen Speicher löscht oder das Gerät wechselt. Wenn Sie Daten auf einem einzelnen Gerät über App-Neustarts hinaus speichern möchten, wandeln Sie den Nutzer in ein dauerhaftes Konto um.
Sicherheitsregeln verwenden, die voraussetzen, dass Nutzer zu einem Anmeldeanbieter gewechselt oder ihre E-Mail-Adresse bestätigt haben
Jeder kann ein anonymes Konto in Ihrem Projekt erstellen. Schützen Sie daher alle nicht öffentlichen Daten mit Sicherheitsregeln, die bestimmte Anmeldemethoden oder bestätigte E-Mail-Adressen erfordern.
Beispiel:
allow write: if request.auth.token.firebase.sign_in_provider != "anonymous";
allow write: if request.auth.token.email_verified = true;
Cloud Functions-Sicherheit
Vertrauliche Informationen dürfen niemals in Umgebungsvariablen eingegeben werden.
In einer selbst gehosteten Node.js-Anwendung werden oft Umgebungsvariablen verwendet, um vertrauliche Informationen wie private Schlüssel zu speichern. Tu das nicht in Cloud Functions. Da Cloud Functions Umgebungen zwischen Funktionsaufrufen wiederverwendet, sollten vertrauliche Informationen nicht in der Umgebung gespeichert werden.
Wenn Sie Firebase API-Schlüssel speichern möchten, die nicht geheim sind, betten Sie sie einfach in den Code ein.
Wenn Sie die Firebase Admin SDK in einer Cloud Functions verwenden, müssen Sie keine Anmeldedaten für das Dienstkonto angeben, da die Admin SDK diese während der Initialisierung automatisch abrufen kann.
Wenn Sie Google- und Google Cloud APIs aufrufen, für die Anmeldedaten für Dienstkonten erforderlich sind, kann die Google Auth-Bibliothek für Node.js diese Anmeldedaten aus den Standardanmeldedaten für Anwendungen abrufen, die automatisch in Cloud Functions ausgefüllt werden.
Wenn Sie Ihrem Cloud Functions private Schlüssel und Anmeldedaten für Dienste von Drittanbietern zur Verfügung stellen möchten, verwenden Sie Secret Manager.
Vertrauliche Informationen verschlüsseln
Wenn Sie vertrauliche Daten an Ihre Funktionen weitergeben müssen, müssen Sie eine eigene Lösung zur Verschlüsselung der Daten entwickeln.
Einfache Funktionen sind sicherer. Wenn Sie mehr Komplexität benötigen, sollten Sie Cloud Run in Betracht ziehen.
Versuchen Sie, Ihre Funktionen so einfach und verständlich wie möglich zu halten. Komplexe Funktionen können oft zu schwer zu erkennenden Fehlern oder unerwartetem Verhalten führen.
Wenn Sie komplexe Logik oder Umgebungskonfigurationen benötigen, sollten Sie stattdessen Cloud Run verwenden.Cloud Functions
Umgebungsverwaltung
Entwicklungs- und Staging-Projekte einrichten
Richten Sie separate Firebase-Projekte für Entwicklung, Staging und Produktion ein. Fügen Sie den Clientcode erst in die Produktionsumgebung ein, wenn er im Staging-Projekt getestet wurde.
Zugriff des Teams auf Produktionsdaten einschränken
Wenn Sie mit einem größeren Team zusammenarbeiten, können Sie die Folgen von Fehlern und Sicherheitsverstößen abmildern, indem Sie den Zugriff auf Produktionsdaten entweder mit vordefinierten IAM-Rollen oder benutzerdefinierten IAM-Rollen einschränken.
Wenn Ihr Team für die Entwicklung Firebase Local Emulator Suite (empfohlen) verwendet, müssen Sie dem Produktionsprojekt möglicherweise keinen erweiterten Zugriff gewähren.
Bibliotheksverwaltung
Achten Sie auf Rechtschreibfehler in der Bibliothek oder neue Bearbeiter.
Achten Sie beim Hinzufügen von Bibliotheken zu Ihrem Projekt auf den Namen der Bibliothek und ihre Maintainer. Eine Bibliothek mit einem ähnlichen Namen wie die, die Sie installieren möchten, könnte schädlichen Code enthalten.
Bibliotheken nicht aktualisieren, ohne die Änderungen zu verstehen
Sehen Sie sich die Änderungsprotokolle aller verwendeten Bibliotheken an, bevor Sie das Upgrade durchführen. Achten Sie darauf, dass das Upgrade einen Mehrwert bietet, und prüfen Sie, ob der Maintainer weiterhin eine vertrauenswürdige Partei ist.
Watchdog-Bibliotheken als Entwicklungs- oder Testabhängigkeiten installieren
Verwenden Sie eine Bibliothek wie Snyk, um Ihr Projekt auf unsichere Abhängigkeiten zu scannen.
Monitoring für Cloud Functions einrichten und nach Bibliotheksupdates prüfen
Wenn Sie das Cloud Functions-Logger-SDK verwenden, können Sie ungewöhnliches Verhalten überwachen und benachrichtigt werden, einschließlich Verhalten, das durch Bibliotheksupdates verursacht wird.