Firebase-Sicherheitscheckliste

Wenn Sie Ihre Firebase-Ressourcen und die Daten Ihrer Nutzer schützen möchten, sollten Sie diese Richtlinien beachten. Nicht alle Punkte sind unbedingt für Ihre Anforderungen relevant. Behalten Sie sie aber bei der Entwicklung Ihrer App im Hinterkopf.

Missbräuchliche Zugriffe vermeiden

Monitoring und Benachrichtigungen für Backend-Dienste einrichten

Um missbräuchlichen Traffic wie Denial-of-Service-Angriffe (DoS) zu erkennen, 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 wird, wenden Sie sich so schnell wie möglich an den Support, um ihn über die Situation 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 dies unterstützt.

 Cloud Functions für normales Trafficvolumen skalieren

Cloud Functions wird automatisch skaliert, um den Anforderungen Ihrer App gerecht zu werden. Im Falle eines Angriffs kann dies jedoch zu einer hohen Rechnung führen. Um dies zu verhindern, können Sie die Anzahl der gleichzeitigen Instanzen einer Funktion basierend auf dem normalen Traffic für Ihre App begrenzen.

 Benachrichtigungen einrichten, um informiert zu werden, wenn die Limits fast erreicht sind

Wenn Ihr Dienst Anfragespitzen aufweist, werden häufig Kontingente aktiviert und der Traffic zu Ihrer Anwendung wird automatisch gedrosselt. Behalten Sie das Dashboard für Nutzung und Abrechnung im Blick. 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-Angriffen aussetzen, z. B. durch das Erstellen einer Endlosschleife für Trigger-Schreibvorgänge. Sie können verhindern, dass sich diese Fehler auf Live-Dienste auswirken, indem Sie die Entwicklung mit der Firebase Local Emulator Suite durchführen.

Wenn Sie sich versehentlich selbst DOS-Angriffen aussetzen, heben Sie die Bereitstellung Ihrer Funktion auf, indem Sie sie aus index.js löschen und dann firebase deploy --only functions ausführen.

 Funktionen defensiv strukturieren, wenn die Reaktionsfähigkeit in Echtzeit weniger wichtig ist

Wenn Sie das Ergebnis einer Funktion nicht in Echtzeit präsentieren müssen, können Sie missbräuchlichen Traffic vermeiden, indem Sie die Ergebnisse in Batches verarbeiten: Veröffentlichen Sie die Ergebnisse in einem Pub/Sub-Thema und verarbeiten Sie die Ergebnisse in regelmäßigen Abständen mit einer geplanten Funktion.

API-Schlüssel

API-Schlüssel für Firebase-Dienste sind nicht geheim

API-Schlüssel für Firebase-Dienste identifizieren nur Ihr Firebase-Projekt und Ihre App für diese Dienste. Die Autorisierung erfolgt über die IAM-Berechtigungen Google Cloud, Firebase Security Rules und Firebase App Check.

Alle von Firebase bereitgestellten API-Schlüssel sind automatisch auf Firebase-bezogene APIs beschränkt. Wenn die Einrichtung Ihrer App den Richtlinien auf dieser Seite entspricht, müssen auf Firebase-Dienste beschränkte API-Schlüssel nicht als vertrauliche Informationen behandelt werden. Sie können sie also bedenkenlos in Ihren Code oder Ihre Konfigurationsdateien einfügen.

Einschränkungen für API-Schlüssel einrichten

Wenn Sie API-Schlüssel für andere Google-Dienste verwenden, sollten Sie API-Schlüsseleinschränkungen anwenden, um Ihre API-Schlüssel auf Ihre App-Clients und die von Ihnen verwendeten APIs zu beschränken.

Verwenden Sie Ihre über Firebase bereitgestellten API-Schlüssel nur für Firebase-bezogene APIs. Wenn Ihre App andere APIs verwendet, z. B. die Places API for Maps oder die Gemini Developer API, verwenden Sie einen separaten API-Schlüssel und schränken Sie ihn auf die entsprechende API ein.

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 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 der Zugriff standardmäßig verweigert wird. Fügen Sie dann Regeln hinzu, die den Zugriff auf bestimmte Ressourcen gewähren, während Sie Ihre App entwickeln.

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 Konfiguration von Sicherheitsregeln wie der folgenden:

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

 Sicherheitsregeln sind ein Schema. Fügen Sie Regeln hinzu, wenn Sie Dokumente hinzufügen.

Schreiben Sie Sicherheitsregeln nicht erst nach der Entwicklung Ihrer App als eine Art Aufgabe vor dem Start. Schreiben 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 entsprechende Sicherheitsregel.

 Sicherheitsregeln mit Local Emulator Suite testen und zu 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 in Ihre CI-Pipeline einfügen. Weitere Informationen finden Sie in den Anleitungen für Cloud Firestore und Realtime Database.

Authentifizierung

 Benutzerdefinierte Authentifizierung: JWTs in einer vertrauenswürdigen (serverseitigen) Umgebung erstellen

Wenn Sie bereits ein sicheres Anmeldesystem haben, sei es ein benutzerdefiniertes System oder ein Drittanbieterdienst, können Sie Ihr vorhandenes System verwenden, um sich bei Firebase-Diensten zu authentifizieren. Benutzerdefinierte JWTs in einer vertrauenswürdigen Umgebung erstellen und die Tokens dann an Ihren Client übergeben, 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 Authenticate with Firebase using Okta.

 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. Sie sollten einen oder mehrere dieser Anbieter unterstützen, wenn möglich (abhängig von Ihrer Nutzerbasis).

 Authentifizierung mit E-Mail-Adresse und Passwort: Legen Sie ein strenges Kontingent für den Anmeldeendpunkt fest, um Brute-Force-Angriffe zu verhindern.

Wenn Sie den verwalteten Dienst für die E-Mail-Passwort-Authentifizierung von Firebase verwenden, sollten Sie das Standardkontingent der identitytoolkit.googleapis.com-Endpunkte einschränken, um Brute-Force-Angriffe zu verhindern. Dies können Sie 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 Dienst für die E-Mail-Passwort-Authentifizierung von Firebase verwenden, aktivieren Sie den Schutz vor E-Mail-Aufzählung. Dadurch wird verhindert, dass böswillige Akteure die Authentifizierungsendpunkte Ihres Projekts missbrauchen, um Kontonamen zu erraten.

 Für die Multi-Faktor-Authentifizierung auf Google Cloud Identity Platform upgraden

Wenn Sie die Sicherheit bei der Anmeldung erhöhen möchten, können Sie die Unterstützung der Multi-Faktor-Authentifizierung hinzufügen, indem Sie auf Google Cloud Identity Platform upgraden. Ihr vorhandener Firebase Authentication-Code funktioniert auch nach dem Upgrade weiterhin.

Anonyme Authentifizierung

Anonyme Authentifizierung nur für das Warm-Onboarding verwenden

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 auf eine andere Anmeldemethode umstellen, wenn sie ihre Daten auf anderen Geräten verwenden möchten

Anonyme Authentifizierungsdaten bleiben nicht erhalten, wenn der Nutzer den lokalen Speicher löscht oder das Gerät wechselt. Wenn Sie Daten über App-Neustarts auf einem einzelnen Gerät hinaus beibehalten müssen, wandeln Sie das Konto des Nutzers in ein permanentes Konto um.

Sicherheitsregeln verwenden, die erfordern, dass Nutzer zu einem Anmeldeanbieter migriert sind oder ihre E-Mail-Adresse bestätigt haben

Jeder konnte 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;

Safety von Cloud Functions

Geben Sie niemals vertrauliche Informationen in Umgebungsvariablen ein.

In einer selbst gehosteten Node.js-App werden häufig Umgebungsvariablen verwendet, um vertrauliche Informationen wie private Schlüssel zu speichern. Das ist in Cloud Functions nicht möglich. Da Cloud Functions Umgebungen zwischen Funktionsaufrufen wiederverwendet, sollten vertrauliche Informationen nicht in der Umgebung gespeichert werden.

  • Firebase-API-Schlüssel (die nicht geheim sind) können Sie einfach in den Code einbetten.

  • Wenn Sie die Firebase Admin SDK in einer Cloud Functions verwenden, müssen Sie die Anmeldedaten des Dienstkontos nicht explizit angeben, da die Admin SDK sie während der Initialisierung automatisch abrufen kann.

  • Wenn Sie Google- und Google Cloud-APIs aufrufen, für die Dienstkontoanmeldedaten 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 eingefügt werden.

  • Wenn Sie private Schlüssel und Anmeldedaten für Nicht-Google-Dienste für Ihr Cloud Functions verfügbar machen möchten, verwenden Sie Secret Manager.

Vertrauliche Informationen verschlüsseln

Wenn Sie nicht vermeiden können, vertrauliche Informationen an Ihre Funktionen zu übergeben, müssen Sie eine eigene benutzerdefinierte Lösung zum Verschlüsseln der Informationen entwickeln.

Einfache Funktionen sind sicherer. Wenn Sie Komplexität benötigen, sollten Sie Cloud Run in Betracht ziehen.

Halten Sie Ihre Funktionen so einfach und verständlich wie möglich. Komplexität in Ihren Funktionen kann oft zu schwer zu erkennenden Fehlern oder unerwartetem Verhalten führen.

Wenn Sie komplexe Logik oder Umgebungskonfigurationen benötigen, sollten Sie stattdessen Cloud Run anstelle von Cloud Functions verwenden.

Umgebungsverwaltung

Entwicklungs- und Staging-Projekte einrichten

Richten Sie separate Firebase-Projekte für Entwicklung, Staging und Produktion ein. Führen Sie Clientcode erst dann in die Produktionsumgebung ein, wenn er mit dem Staging-Projekt getestet wurde.

 Teamzugriff auf Produktionsdaten einschränken

Wenn Sie mit einem größeren Team zusammenarbeiten, können Sie die Folgen von Fehlern und Sicherheitsverletzungen minimieren, indem Sie den Zugriff auf Produktionsdaten entweder mit vordefinierten IAM-Rollen oder benutzerdefinierten IAM-Rollen einschränken.

Wenn Ihr Team Firebase Local Emulator Suite (empfohlen) für die Entwicklung verwendet, müssen Sie möglicherweise keinen umfassenderen Zugriff auf das Produktionsprojekt gewähren.

Mediathek verwalten

Auf Rechtschreibfehler in der Bibliothek oder neue Maintainer achten

Achten Sie beim Hinzufügen von Bibliotheken zu Ihrem Projekt genau auf den Namen der Bibliothek und die Namen der Verantwortlichen. 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 kennen

Sehen Sie sich vor dem Upgrade die Änderungsprotokolle aller verwendeten Bibliotheken an. Achten Sie darauf, dass das Upgrade einen Mehrwert bietet, und prüfen Sie, ob der Maintainer immer noch eine Person ist, der Sie vertrauen.

 Watchdog-Bibliotheken als Entwicklungs- oder Testabhängigkeiten installieren

Verwenden Sie eine Bibliothek wie Snyk, um Ihr Projekt nach unsicheren 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 beobachten und sich benachrichtigen lassen, einschließlich Verhalten, das durch Bibliotheksupdates verursacht wird.