Unsichere Regeln korrigieren

In diesem Leitfaden finden Sie Informationen zu häufigen Sicherheitslücken in Konfigurationen von Firestore-Sicherheitsregeln. Sie erfahren, wie Sie Ihre Regeln prüfen, deren Sicherheit erhöhen und Änderungen vor dem Bereitstellen testen.

Wenn Sie eine Warnung erhalten, dass Ihre Firestore-Datenbank nicht ordnungsgemäß geschützt ist, können Sie diese Sicherheitslücke beheben. Dazu müssen Sie Ihre Firestore-Sicherheitsregeln entsprechend ändern und testen.

Rufen Sie in der Firebase Console den Tab "Regeln" auf, um Ihre vorhandenen Sicherheitsregeln anzusehen.

Informationen zu Firestore-Sicherheitsregeln

Firestore-Sicherheitsregeln schützen Ihre Daten vor böswilligen Nutzern. Die Standardregeln jeder Firestore-Instanz, die in der Firebase Console erstellt wurde, verweigern allen Nutzern den Zugriff. Damit Sie Ihre Anwendung entwickeln und auf Ihre Datenbank zugreifen können, müssen Sie diese Regeln ändern und möglicherweise allen Nutzern in einer Entwicklungsumgebung uneingeschränkten Zugriff gewähren. Bevor Sie Ihre Anwendung in einer Produktionsumgebung bereitstellen, sollten Sie sich jedoch die Zeit nehmen, Ihre Regeln entsprechend zu konfigurieren und Ihre Daten zu schützen.

Wenn Sie Ihre Anwendung entwickeln und verschiedene Konfigurationen für Ihre Regeln testen möchten, können Sie die Anwendung mit dem Firestore-Emulator in einer lokalen Entwicklungsumgebung ausführen.

Häufige Szenarien mit unsicheren Regeln

Die Firestore-Sicherheitsregeln, die möglicherweise standardmäßig gelten oder die Sie bei der anfänglichen Entwicklung Ihrer Anwendung mit Firestore eingerichtet haben, sollten vor der Bereitstellung geprüft und aktualisiert werden. Achten Sie darauf, dass die Daten Ihrer Nutzer ordnungsgemäß geschützt sind und vermeiden Sie dazu die im Folgenden aufgeführten häufigen Fehler.

Unbeschränkter Zugriff

Bei der Einrichtung von Firestore haben Sie möglicherweise Ihre Regeln so festgelegt, dass für die Entwicklung ein offener Zugriff möglich ist. Eventuell gehen Sie auch davon aus, dass Sie die einzige Person sind, die Ihre Anwendung nutzt. Allerdings ist sie nach dem Bereitstellen im Internet verfügbar. Wenn Sie Nutzer nicht authentifizieren und keine Sicherheitsregeln konfigurieren, kann jeder, der Ihre Projekt-ID errät, die Daten stehlen, ändern oder löschen.

Nicht empfohlen: Alle Nutzer haben Lese- und Schreibzugriff.
// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
Lösung: Legen Sie Regeln fest, die den Lese- und Schreibzugriff beschränken.

Erstellen Sie Regeln, die für Ihre Datenhierarchie sinnvoll sind. Eine der gängigsten Lösungen für diese unsichere Konfiguration ist die nutzerbasierte Sicherheit mit Firebase Authentication. Weitere Informationen dazu finden Sie unter Nutzer mit Regeln authentifizieren.

Nur Eigentümer

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{document} {
      allow read, write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Gemischter öffentlicher und privater Zugriff

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Zugriff für jeden authentifizierten Nutzer

Manchmal prüfen Firestore-Sicherheitsregeln, ob ein Nutzer angemeldet ist, schränken jedoch den Zugriff anhand dieser Authentifizierung nicht weiter ein. Wenn eine Ihrer Regeln auth != null enthält, haben alle angemeldeten Nutzer Zugriff auf die Daten.

Nicht empfohlen: Jeder angemeldete Nutzer hat Lese- und Schreibzugriff auf Ihre gesamte Datenbank.
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}
Lösung: Grenzen Sie den Zugriff mithilfe von Sicherheitsbedingungen ein.

Wenn Sie die Authentifizierung prüfen lassen, können Sie auch eines der Authentifizierungsattribute verwenden, um den Zugriff für bestimmte Nutzer und bestimmte Datensätze weiter einzuschränken. Weitere Informationen finden Sie unter Sicherheitsbedingungen hinzufügen und rollenbasierter Zugriff.

Rollenbasierter Zugriff

service cloud.firestore {
  match /databases/{database}/documents {
    // Assign roles to all users and refine access based on user roles
    match /some_collection/{document} {
     allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"

     // Note: Checking for roles in your database using `get` (as in the code
     // above) or `exists` carry standard charges for read operations.
    }
  }
}

Attributbasierter Zugriff

// Give each user in your database a particular attribute
// and set it to true/false
// Then, use that attribute to grant access to subsets of data
// For example, an "admin" attribute set
// to "true" grants write access to data

service cloud.firestore {
  match /databases/{database}/documents {
    match /collection/{document} {
      allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
      allow read: true;
    }
  }
}
  

Gemischter öffentlicher und privater Zugriff

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Geschlossener Zugriff

Ein weiterer gängiger Ansatz während der Entwicklung Ihrer Anwendung besteht darin, Ihre Daten zu sperren. In der Regel bedeutet dies, dass Sie den Lese- und Schreibzugriff für alle Nutzer folgendermaßen gesperrt haben:

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Die Firebase Admin SDKs und Cloud Functions haben aber weiterhin Zugriff auf Ihre Datenbank. Verwenden Sie diese Regeln, wenn Sie Firestore ausschließlich serverseitig nutzen möchten in Verbindung mit Firebase Admin SDK. Dies ist zwar sicher, Sie müssen aber testen, ob die Clients Ihrer Anwendung Daten ordnungsgemäß abrufen können.

Weitere Informationen zu Firestore-Sicherheitsregeln und ihrer Funktionsweise finden Sie unter Erste Schritte mit Firestore-Sicherheitsregeln.

Firestore-Sicherheitsregeln prüfen

Mit dem Firestore-Emulator können Sie das Verhalten Ihrer Anwendung und die Konfiguration Ihrer Firestore-Sicherheitsregeln prüfen. Verwenden Sie den Firestore-Emulator, um Einheitentests in einer lokalen Umgebung auszuführen und zu automatisieren, bevor Sie Änderungen bereitstellen.

Wenn Sie die aktualisierten Firestore-Sicherheitsregeln in der Firebase Console schnell testen möchten, verwenden Sie das Regel-Playground-Tool.

  1. Klicken Sie zum Öffnen von Regel-Playground auf dem Tab Regeln auf Regel-Playground.
  2. Wählen Sie in den Einstellungen zu Regel-Playground Optionen für Ihren Test aus, wie z. B. die folgenden:
    • Lese- oder Schreibvorgänge testen
    • Unter Standort einen bestimmten Standort in Ihrer Datenbank als Pfad
    • Authentifizierungstyp — nicht authentifizierter Nutzer, authentifizierter anonymer Nutzer oder eine bestimmte Nutzer-ID
    • Dokumentspezifische Daten, auf die Ihre Regeln speziell verweisen (z. B. wenn für Ihre Regeln das Vorhandensein eines bestimmten Felds erforderlich ist, bevor ein Schreibvorgang erlaubt wird)
  3. Klicken Sie auf Ausführen und sehen Sie sich die Ergebnisse im Banner über dem Fenster mit den Regeln an.