Firebase-Sicherheitscheckliste

Befolgen Sie diese Richtlinien, um Ihre Firebase-Ressourcen und die Daten Ihrer Benutzer zu schützen. Nicht jeder Punkt trifft zwangsläufig auf Ihre Anforderungen zu, aber denken Sie daran, wenn Sie Ihre App entwickeln.

Vermeiden Sie missbräuchlichen Verkehr

Richten Sie Überwachung und Benachrichtigungen für Back-End-Dienste ein

Um missbräuchlichen Datenverkehr wie Denial-of-Service-Angriffe (DOS) zu erkennen, richten Sie Überwachung und Benachrichtigungen 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 ihn über den Vorgang zu informieren.

App-Check aktivieren

Um sicherzustellen, dass nur Ihre Apps auf Ihre Back-End-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 skalieren

Cloud Functions skaliert automatisch, um die Anforderungen Ihrer App zu erfüllen, aber im Falle eines Angriffs kann dies eine hohe Rechnung bedeuten. Um dies zu verhindern, können Sie die Anzahl der gleichzeitigen Instanzen einer Funktion basierend auf dem normalen Datenverkehr für Ihre App begrenzen .

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

Wenn Ihr Dienst Anforderungsspitzen aufweist, greifen häufig Kontingente und drosseln automatisch den Datenverkehr zu Ihrer Anwendung. Stellen Sie sicher, dass Sie Ihr Nutzungs- und Abrechnungs-Dashboard überwachen, aber Sie können auch Budgetbenachrichtigungen für Ihr Projekt festlegen , um benachrichtigt zu werden, wenn die Ressourcennutzung die Erwartungen übersteigt.

Eigendosierungen verhindern: Funktionen lokal mit den Emulatoren testen

Es kann leicht passieren, dass Sie sich beim Entwickeln von Cloud-Funktionen versehentlich selbst DOSieren: zum Beispiel durch Erstellen einer unendlichen Trigger-Write-Schleife. 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 versehentlich selbst DOS machen, entfernen Sie Ihre Funktion, indem Sie sie aus index.js entfernen und dann firebase firebase deploy --only functions .)

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 verhindern, indem Sie die Ergebnisse in Stapeln 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 verstehen

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, und nicht, um den Zugriff auf Datenbank- oder Cloud Storage-Daten 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 Clientcode einbetten. Erfahren Sie mehr über API-Schlüssel für Firebase .

Richten Sie den Umfang der API-Schlüssel ein

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

Halten Sie FCM-Serverschlüssel geheim

Im Gegensatz zu API-Schlüsseln für Firebase-Dienste sind FCM-Serverschlüssel (die von der Legacy-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 Schlüssel für Dienstkonten (die vom Admin SDK verwendet werden ) vertraulich und müssen geheim gehalten werden.

Sicherheitsregeln

Regeln im Produktions- oder Sperrmodus initialisieren

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 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 beim Einrichten einer neuen Datenbankinstanz.

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 Pre-Launch-Aufgabe. Schreiben Sie stattdessen Sicherheitsregeln, während Sie Ihre App schreiben, und behandeln Sie sie wie ein Datenbankschema: Wann immer Sie einen neuen Dokumenttyp oder eine neue Pfadstruktur verwenden müssen, schreiben Sie zuerst seine Sicherheitsregel.

Unit-Test-Sicherheitsregeln 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 verwenden, um sich bei Firebase-Diensten zu authentifizieren. 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 mit einem Drittanbieter finden Sie im Blog-Beitrag Authentifizierung mit Firebase mit Okta .

Verwaltete Authentifizierung: OAuth 2.0-Anbieter sind die sichersten

Wenn Sie die verwalteten Authentifizierungsfunktionen von Firebase verwenden, sind die Anbieteroptionen von OAuth 2.0 / OpenID Connect (Google, Facebook usw.) am sichersten. Sie sollten einen oder mehrere dieser Anbieter unterstützen, wenn Sie können (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 von identitytoolkit.googleapis.com , um Brute-Force-Angriffe zu verhindern. Sie können dies auf der Seite der API in der Google Cloud Console tun.

E-Mail-Passwort-Authentifizierung: E-Mail-Aufzählungsschutz aktivieren

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.

Führen Sie ein Upgrade auf Cloud Identity Platform für die Multi-Faktor-Authentifizierung durch

Für zusätzliche Sicherheit bei der Anmeldung können Sie Multi-Faktor-Authentifizierungsunterstützung hinzufügen, indem Sie ein Upgrade auf Cloud Identity Platform durchführen . Ihr vorhandener Firebase-Authentifizierungscode funktioniert nach dem Upgrade weiterhin.

Anonyme Authentifizierung

Verwenden Sie nur die anonyme Authentifizierung für warmes Onboarding

Verwenden Sie nur die anonyme Authentifizierung, um den Grundzustand für Benutzer zu speichern, bevor sie sich tatsächlich anmelden. Die anonyme Authentifizierung ist kein Ersatz für die Benutzeranmeldung.

Stellen Sie Benutzer auf eine andere Anmeldemethode um, wenn sie die Daten benötigen, wenn sie ihr Telefon verlieren

Anonyme Authentifizierungsdaten bleiben nicht erhalten, 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, konvertieren Sie den Benutzer in ein permanentes Konto .

Verwenden Sie Sicherheitsregeln, die erfordern, dass Benutzer zu einem Anmeldeanbieter konvertiert 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 Clientcode nicht mit der Produktion zusammen, bis er mit dem Staging-Projekt getestet wurde.

Beschränken Sie den Teamzugriff auf Produktionsdaten

Wenn Sie mit einem größeren Team arbeiten, können Sie die Folgen von Fehlern und Verstößen mindern, indem Sie den Zugriff auf Produktionsdaten entweder 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 breiteren Zugriff auf das Produktionsprojekt gewähren.

Bibliotheksverwaltung

Achten Sie auf Rechtschreibfehler in der Bibliothek oder neue Betreuer

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

Aktualisieren Sie keine Bibliotheken, ohne die Änderungen zu verstehen

Überprüfen Sie vor dem Upgrade die Änderungsprotokolle aller von Ihnen verwendeten Bibliotheken. Stellen Sie sicher, dass das Upgrade einen Mehrwert bringt, und überprüfen Sie, ob der Betreuer immer noch eine Partei ist, der Sie vertrauen.

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

Verwenden Sie eine Bibliothek wie Snyk , um Ihr Projekt auf unsichere Abhängigkeiten zu scannen.

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

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

Sicherheit der Cloud-Funktion

Geben Sie niemals vertrauliche Informationen in die Umgebungsvariablen einer Cloud Functions-Funktion ein

In einer selbst gehosteten 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 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, für die Anmeldedaten für Dienstkonten erforderlich sind, kann die Google Auth-Bibliothek für Node.js diese Anmeldedaten aus den Standardanmeldedaten der Anwendung abrufen , die automatisch in Cloud Functions ausgefüllt werden.
  • Verwenden Sie Cloud Secret Manager , um Ihren Cloud-Funktionen private Schlüssel und Anmeldedaten für Nicht-Google-Dienste zur Verfügung zu stellen.

Verschlüsseln Sie vertrauliche Informationen

Wenn Sie es nicht vermeiden können, vertrauliche Informationen an Ihre Cloud-Funktion zu übergeben, müssen Sie Ihre eigene benutzerdefinierte Lösung entwickeln, um die Informationen zu verschlüsseln.

Einfache Funktionen sind sicherer; Wenn Sie Komplexität brauchen, 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 zu erkennenden Fehlern oder unerwartetem Verhalten führen.

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