Firebase-Sicherheitscheckliste

Befolgen Sie diese Richtlinien, um die Sicherheit Ihrer Firebase-Ressourcen und der Daten Ihrer Benutzer zu gewährleisten. Nicht jeder Punkt trifft unbedingt auf Ihre Anforderungen zu, aber berücksichtigen Sie sie bei der Entwicklung Ihrer App.

Vermeiden Sie missbräuchlichen Verkehr

Richten Sie Überwachung und Warnungen für Backend-Dienste ein

Um missbräuchlichen Datenverkehr wie Denial-of-Service-Angriffe (DOS) zu erkennen, richten Sie Überwachung und Warnungen für Cloud Firestore , Realtime Database , Cloud Storage und Hosting ein

Wenn Sie einen Angriff auf Ihre Anwendung vermuten, wenden Sie sich so schnell wie möglich an den Support, um ihm mitzuteilen, was passiert.

App-Check aktivieren

Um sicherzustellen, dass nur Ihre Apps auf Ihre Backend-Dienste zugreifen können, aktivieren Sie App Check für jeden Dienst, der dies unterstützt.

Konfigurieren Sie Ihre Cloud-Funktionen so, dass sie für normalen Datenverkehr skaliert werden

Cloud Functions skaliert automatisch, um den Anforderungen Ihrer App gerecht zu werden. Im Falle eines Angriffs kann dies jedoch eine hohe Rechnung bedeuten. Um dies zu verhindern, können Sie die Anzahl gleichzeitiger Instanzen einer Funktion basierend auf dem normalen Datenverkehr für Ihre App begrenzen .

Richten Sie eine Benachrichtigung ein, um benachrichtigt zu werden, wenn die Grenzwerte fast erreicht sind

Wenn Ihr Dienst Anforderungsspitzen aufweist, werden häufig Kontingente aktiviert und der Datenverkehr zu Ihrer Anwendung automatisch gedrosselt. Achten Sie darauf, Ihr Nutzungs- und Abrechnungs-Dashboard zu überwachen. Sie können aber auch Budgetwarnungen für Ihr Projekt festlegen , um benachrichtigt zu werden, wenn die Ressourcennutzung die Erwartungen überschreitet.

Selbst-DOSes verhindern: Funktionen lokal mit den Emulatoren testen

Es kann leicht passieren, dass Sie bei der Entwicklung von Cloud Functions versehentlich einen DOS-Befehl ausführen, indem Sie beispielsweise eine unendliche Trigger-Schreib-Schleife erstellen. Sie können verhindern, dass sich diese Fehler auf Live-Dienste auswirken, indem Sie Ihre Entwicklung mit der Firebase-Emulator-Suite durchführen.

(Und wenn Sie aus Versehen selbst DOS ausführen, heben Sie die Bereitstellung Ihrer Funktion auf, indem Sie sie aus index.js entfernen und dann firebase deploy --only functions ausführen.)

Wo die Reaktionsfähigkeit in Echtzeit weniger wichtig ist, funktioniert die Struktur defensiv

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

API-Schlüssel verstehen

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

Firebase verwendet API-Schlüssel nur, um das Firebase-Projekt Ihrer App gegenüber Firebase-Diensten zu identifizieren, und nicht, um den Zugriff auf Datenbank- oder Cloud-Speicherdaten zu steuern, was mithilfe von Firebase-Sicherheitsregeln erfolgt. Aus diesem Grund müssen Sie API-Schlüssel für Firebase-Dienste nicht als Geheimnisse behandeln und können sie sicher in Client-Code einbetten. Erfahren Sie mehr über API-Schlüssel für Firebase .

Richten Sie den API-Schlüsselbereich ein

Als zusätzliche Abschreckung gegen einen Angreifer, der versucht, Ihren API-Schlüssel zum Fälschen von Anfragen zu verwenden, können Sie API-Schlüssel erstellen , die auf Ihre App-Clients beschränkt sind .

Halten Sie die FCM-Serverschlüssel geheim

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.

Halten Sie die Dienstkontoschlüssel geheim

Auch im Gegensatz zu API-Schlüsseln für Firebase-Dienste sind private Schlüssel von Dienstkonten (die vom Admin SDK verwendet werden) vertraulich und müssen geheim gehalten werden.

Sicherheitsregeln

Initialisieren Sie Regeln im Produktions- oder Sperrmodus

Wenn Sie Cloud Firestore, Realtime Database und Cloud Storage einrichten, initialisieren Sie Ihre Sicherheitsregeln, um standardmäßig jeglichen Zugriff zu verweigern, und fügen Sie Regeln hinzu, die den Zugriff auf bestimmte Ressourcen gewähren, während Sie Ihre App entwickeln.

Dies ist eine der Standardeinstellungen für neue Instanzen von Cloud Firestore (Produktionsmodus) und Realtime Database (gesperrter Modus). Wählen Sie diese Option, wenn Sie eine neue Datenbankinstanz einrichten.

Beginnen Sie für Cloud Storage mit einer Sicherheitsregelkonfiguration 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 keine Sicherheitsregeln, nachdem Sie Ihre App geschrieben haben, als eine Art Aufgabe vor dem Start. Schreiben Sie stattdessen Sicherheitsregeln, während Sie Ihre App schreiben, 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 für Unit-Tests mit der Emulator Suite; Fügen Sie es zu CI hinzu

Um sicherzustellen, dass Ihre Sicherheitsregeln mit der Entwicklung Ihrer App Schritt halten, testen Sie Ihre Regeln mit der Firebase-Emulator-Suite und fügen Sie diese Tests Ihrer CI-Pipeline hinzu. Sehen Sie sich diese Leitfäden für Cloud Firestore und Realtime Database an.

Authentifizierung

Benutzerdefinierte Authentifizierung: Erstellen Sie JWTs aus einer vertrauenswürdigen (serverseitigen) Umgebung

Wenn Sie bereits über ein sicheres Anmeldesystem verfügen, sei es ein benutzerdefiniertes System oder ein Drittanbieterdienst, können Sie Ihr vorhandenes System zur Authentifizierung bei Firebase-Diensten verwenden. Erstellen Sie benutzerdefinierte JWTs aus einer vertrauenswürdigen Umgebung und übergeben Sie die Token dann an Ihren Client, der das Token zur Authentifizierung verwendet ( iOS+ , Android , Web , Unity , C++ ).

Ein Beispiel für die Verwendung einer benutzerdefinierten Authentifizierung bei einem Drittanbieter finden Sie im Blogbeitrag „ Authentifizierung mit Firebase mithilfe von Okta“ .

Verwaltete Authentifizierung: OAuth 2.0-Anbieter sind die sichersten

Wenn Sie die verwalteten Authentifizierungsfunktionen von Firebase verwenden, sind die Anbieteroptionen OAuth 2.0/OpenID Connect (Google, Facebook usw.) am sichersten. Wenn Sie können, sollten Sie einen oder mehrere dieser Anbieter unterstützen (abhängig von Ihrer Benutzerbasis).

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, erhöhen Sie das Standardkontingent der Endpunkte identitytoolkit.googleapis.com “, um Brute-Force-Angriffe zu verhindern. Sie können dies über die API-Seite in der Google Cloud Console tun.

E-Mail-Passwort-Authentifizierung: Aktivieren Sie den E-Mail-Aufzählungsschutz

Wenn Sie den verwalteten E-Mail-Passwort-Authentifizierungsdienst von Firebase verwenden, aktivieren Sie den E-Mail-Aufzählungsschutz , der verhindert, dass böswillige Akteure die Authentifizierungsendpunkte Ihres Projekts missbrauchen, um Kontonamen zu erraten.

Upgrade auf Cloud Identity Platform für Multi-Faktor-Authentifizierung

Für zusätzliche Sicherheit bei der Anmeldung können Sie durch ein Upgrade auf Cloud Identity Platform Unterstützung für die Multi-Faktor-Authentifizierung hinzufügen. Ihr vorhandener Firebase-Authentifizierungscode 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 Grundstatus für Benutzer zu speichern, bevor sie sich tatsächlich anmelden. Die anonyme Authentifizierung ist kein Ersatz für die Benutzeranmeldung.

Konvertieren Sie Benutzer zu einer anderen Anmeldemethode, wenn sie die Daten benötigen, wenn sie ihr Telefon verlieren

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

Verwenden Sie Sicherheitsregeln, die erfordern, dass Benutzer zu einem Anmeldeanbieter gewechselt sind oder ihre E-Mail-Adresse bestätigt haben

Jeder kann in Ihrem Projekt ein anonymes Konto erstellen. Schützen Sie daher alle nicht öffentlichen Daten mit Sicherheitsregeln, die bestimmte Anmeldemethoden oder verifizierte E-Mail-Adressen erfordern .

Zum Beispiel:

allow write: if request.auth.token.firebase.sign_in_provider != "anonymous";
allow write: if request.auth.token.email_verified = true;

Umweltmanagement

Richten Sie Entwicklungs- und Staging-Projekte ein

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

Beschränken Sie den Teamzugriff auf Produktionsdaten

Wenn Sie mit einem größeren Team zusammenarbeiten, können Sie die Folgen von Fehlern und Verstößen abmildern, indem Sie den Zugriff auf Produktionsdaten mithilfe vordefinierter Rollen oder benutzerdefinierter IAM-Rollen einschränken.

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

Bibliotheksverwaltung

Achten Sie auf Rechtschreibfehler in der Bibliothek oder auf neue Betreuer

Achten Sie beim Hinzufügen von Bibliotheken zu Ihrem Projekt genau auf den Namen der Bibliothek und ihrer Betreuer. Eine Bibliothek mit einem ähnlichen Namen wie die, die Sie installieren möchten, könnte bösartigen Code enthalten.

Aktualisieren Sie Bibliotheken nicht, ohne die Änderungen zu verstehen

Sehen Sie sich vor dem Upgrade die Änderungsprotokolle aller von Ihnen verwendeten Bibliotheken an. Stellen Sie sicher, dass das Upgrade einen Mehrwert bietet, und prüfen Sie, ob der Betreuer weiterhin eine Partei ist, der Sie vertrauen.

Installieren Sie Watchdog-Bibliotheken als Entwicklungs- oder Testabhängigkeiten

Verwenden Sie eine Bibliothek wie Snyk , um Ihr Projekt nach unsicheren Abhängigkeiten zu durchsuchen.

Überwachung für Funktionen einrichten; Überprüfen Sie es nach Bibliotheksaktualisierungen

Wenn Sie das Cloud Functions-Logger-SDK verwenden, können Sie ungewöhnliches Verhalten überwachen und sich darüber benachrichtigen lassen , einschließlich Verhalten, das durch Bibliotheksaktualisierungen verursacht wird.

Sicherheit der Cloud-Funktion

Fügen Sie niemals vertrauliche Informationen in die Umgebungsvariablen einer Cloud-Funktion ein

In einer selbstgehosteten Node.js-App verwenden Sie häufig Umgebungsvariablen, um vertrauliche Informationen wie private Schlüssel zu enthalten. Tun Sie dies nicht in Cloud Functions . Da Cloud Functions Umgebungen zwischen Funktionsaufrufen wiederverwendet, sollten vertrauliche Informationen nicht in der Umgebung gespeichert werden.

  • Um Firebase-API-Schlüssel zu speichern, die nicht geheim sind, betten Sie sie einfach in den Code ein.
  • Wenn Sie das Firebase Admin SDK in einer Cloud-Funktion verwenden, müssen Sie die Anmeldeinformationen für das Dienstkonto nicht explizit angeben, da das SDK diese während der Initialisierung automatisch abrufen kann.
  • Wenn Sie Google- und Google Cloud-APIs aufrufen, die Anmeldeinformationen für Dienstkonten erfordern, kann die Google Auth-Bibliothek für Node.js diese Anmeldeinformationen aus den Standardanmeldeinformationen der Anwendung abrufen, die automatisch in Cloud Functions ausgefüllt werden.
  • Um private Schlüssel und Anmeldeinformationen für Nicht-Google-Dienste für Ihre Cloud-Funktionen verfügbar zu machen, verwenden Sie Cloud Secret Manager .

Verschlüsseln Sie vertrauliche Informationen

Wenn Sie die Weitergabe vertraulicher Informationen an Ihre Cloud-Funktion nicht vermeiden können, müssen Sie Ihre eigene benutzerdefinierte Lösung zur Verschlüsselung der Informationen entwickeln.

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

Versuchen Sie, Ihre Cloud-Funktionen so einfach und verständlich wie möglich zu halten. Die Komplexität Ihrer Funktionen kann oft zu schwer erkennbaren Fehlern oder unerwartetem Verhalten führen.

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