Mandantenfähigkeit und Row-Level-Security richtig aufsetzen
Die teuerste Nacharbeit in jedem SaaS-Projekt ist die Trennung der Mandanten. Wie man sie von Tag eins in der Datenbank verankert – statt in der Anwendungslogik.
Sobald zwei Kunden dieselbe Datenbank benutzen, wird Mandantentrennung zur wichtigsten Sicherheitseigenschaft des Systems. Ein Fehler dort ist kein Bug, sondern ein meldepflichtiger Datenschutzvorfall. Und anders als ein Layoutfehler fällt er oft monatelang niemandem auf.
Drei Trennmodelle
| Modell | Trennung | Aufwand | Wann sinnvoll |
|---|---|---|---|
| Datenbank pro Kunde | Sehr hoch | Hoch: Migrationen, Backups, Kosten je Kunde | Wenige, sehr große Kunden mit Auflagen |
| Schema pro Kunde | Hoch | Mittel bis hoch | Zweistellige Kundenzahl, starke Individualisierung |
| Gemeinsame Tabellen mit Mandanten-ID | Logisch, per Datenbankregel | Niedrig im Betrieb, hoch in der Sorgfalt | Der Normalfall für Vertical SaaS |
Für vertikale Produkte mit hunderten Betrieben ist das dritte Modell fast immer richtig – vorausgesetzt, die Trennung liegt in der Datenbank und nicht im Anwendungscode.
Warum die Trennung in die Datenbank gehört
Wenn jede Abfrage im Code selbst daran denken muss, nach der Mandanten-ID zu filtern, ist es nur eine Frage der Zeit, bis eine Abfrage es vergisst: ein neuer Endpunkt, ein Report, ein Hintergrundjob, ein Export. Row-Level-Security dreht das Prinzip um – die Datenbank liefert grundsätzlich nichts aus, solange keine Regel den Zugriff ausdrücklich erlaubt. Vergessener Filter bedeutet dann leeres Ergebnis statt Datenabfluss.
Rechteprüfung ohne Rekursion
Ein klassischer Stolperstein: Die Sicherheitsregel einer Tabelle fragt eine zweite Tabelle ab, deren Regel wiederum die erste abfragt. Das Ergebnis ist eine Endlosschleife oder ein Fehler zur Laufzeit. Die Lösung ist eine gesicherte Datenbankfunktion, die mit erhöhten Rechten läuft und ausschließlich die Frage beantwortet: Hat dieser Nutzer diese Rolle in diesem Mandanten?
- Eine Tabelle für Mitgliedschaften: Nutzer, Mandant, Rolle – mit eindeutigem Schlüssel.
- Eine gesicherte Funktion, die genau diese Zuordnung prüft und sonst nichts tut.
- Alle Regeln anderer Tabellen rufen nur diese Funktion auf, nie direkt die Mitgliedschaftstabelle.
- Schreibrechte auf Mitgliedschaften ausschließlich für Administratoren des jeweiligen Mandanten.
Was beim Testen regelmäßig übersehen wird
- Hintergrundjobs und Exporte laufen oft mit erhöhten Rechten und umgehen jede Regel – sie brauchen einen eigenen Test.
- Dateien im Objektspeicher haben ihre eigenen Zugriffsregeln; ein sicherer Datensatz mit öffentlichem Anhang ist kein sicherer Datensatz.
- Aggregierte Auswertungen und Zähler verraten Informationen, auch wenn keine Zeile ausgeliefert wird.
- Fehlermeldungen dürfen keine fremden Datensatz-IDs enthalten.
Mandantenfähigkeit ist kein Feature, das man nachrüstet. Sie ist eine Eigenschaft des Datenmodells. Wer sie am Anfang eine Woche kostet, spart sich später ein Projekt.
Häufige Fragen
Klingt nach Ihrem Thema?
Wir bauen und betreiben Software für Branchen, die von großen Anbietern übersehen werden – und prüfen sie selbst auf Sicherheit. Schildern Sie uns Ihre Ausgangslage.
Projekt besprechenPassend dazu
Vertical SaaS: wie man die richtige Nische findet
Nicht die größte Branche gewinnt, sondern die, in der ein konkreter Arbeitsschritt heute noch auf Papier läuft. Wie wir Nischen bewerten, bevor wir eine Zeile Code schreiben.
Preislogik für B2B-SaaS: was kleine Betriebe wirklich zahlen
Zu billig ist gefährlicher als zu teuer. Wie man eine Preisstruktur baut, die mit dem Kunden wächst, ohne ihn beim Einstieg abzuschrecken.