Multi Tenancy
Eine Installation für viele Mandanten
Die Idee und ihr Nutzen
Ein Dienstleister betreibt für zwölf kleine Versicherer eine Schadenplattform, also eine Software zum Erfassen und Bearbeiten von Versicherungsschäden. Er installiert die Software nur einmal, und alle zwölf Versicherer arbeiten mit dieser einen Installation. Jeder Versicherer ist dabei ein Mandant, also ein Kunde, dessen Daten von den Daten aller anderen Kunden getrennt bleiben müssen. Die Schadenplattform erkennt bei jeder Anfrage aus der Anmeldung, zu welchem Versicherer die Person gehört, und gibt nur Schadenakten dieses Versicherers heraus. Der Dienstleister spielt jede neue Programmversion nur einmal statt zwölfmal ein, und die zwölf Versicherer teilen sich die Server. Diese Bauweise heißt Multi Tenancy, auf Deutsch Mandantenfähigkeit.
Wie funktioniert es?
Die Sachbearbeiterin von Versicherer A meldet sich an. Die Schadenplattform liest aus der geprüften Anmeldung die Mandantenkennung „A“, also die Kennung, unter der die Schadenplattform alle Daten von Versicherer A führt. Die Daten der Versicherer 1 bis 11 liegen in der gemeinsamen Datenbank; A und B gehören zu diesen elf Versicherern. Dort trägt jede Zeile einer Tabelle die Mandantenkennung ihres Versicherers. Eine solche Zeile ist zum Beispiel eine Schadenakte. Die Schadenplattform fragt in der gemeinsamen Datenbank nur Zeilen mit der Kennung „A“ ab. Die gemeinsame Datenbank liefert nur die Akten von Versicherer A; eine Regel in der Datenbank blendet fremde Zeilen zusätzlich aus. Die Sachbearbeiterin sieht nur die Akten ihres Versicherers. Meldet sich ein Sachbearbeiter von Versicherer B an, läuft derselbe Vorgang mit der Kennung „B“ in derselben gemeinsamen Datenbank. Versicherer 12 hat in seinem Vertrag festgelegt, dass seine Daten in einer eigenen Datenbank liegen müssen. Meldet sich ein Sachbearbeiter von Versicherer 12 an, erkennt die Schadenplattform Versicherer 12 aus der Anmeldung und öffnet statt der gemeinsamen Datenbank die Datenbank von Versicherer 12. Der Programmcode ist für alle zwölf Versicherer derselbe, nur der Speicherort der Daten unterscheidet sich. Schließlich ruft die Sachbearbeiterin von Versicherer A über einen weitergeleiteten Link eine Akte mit der Kennung „B“ auf. Die Schadenplattform vergleicht die Kennung der Akte mit der Kennung aus der Anmeldung. Weil „B“ nicht „A“ ist, lehnt die Schadenplattform den Zugriff ab.
Der Dienstleister verkauft die Schadenplattform als Dienst: Die zwölf Versicherer installieren nichts selbst, sondern arbeiten über den Browser mit der Installation beim Dienstleister. Die Versicherer sind voneinander unabhängige Unternehmen, oft Wettbewerber. Für jeden Versicherer gelten eigene Verträge mit dem Dienstleister und eigene Pflichten zum Datenschutz. Die Anmeldung übernimmt ein eigener Anmeldedienst, der die Identität jeder Person prüft, bevor sie die Schadenplattform nutzen kann. Das Ergebnis der geprüften Anmeldung enthält die Angabe, zu welchem Versicherer die Person gehört. Die Schadenplattform übernimmt diese Angabe als Mandantenkennung. Mit der Mandantenkennung wählt die Schadenplattform den Speicherort und filtert jeden Datenzugriff der Anfrage. Die Mandantenkennung stammt bewusst nicht aus einem Feld, das der Nutzer selbst im Browser verändern könnte. Sonst könnte sich der Nutzer als Mitarbeiter eines anderen Versicherers ausgeben.
Für die Frage, wie die Daten der Versicherer gespeichert werden, gibt es drei übliche Trennungsstufen:
- Gemeinsame Tabellen: So liegen die Daten der Versicherer 1 bis 11. Die Schadenplattform muss bei jeder Abfrage die Bedingung „nur Zeilen mit Kennung A“ hinzufügen. Vergisst ein Entwickler diese Bedingung bei einer einzigen Abfrage, gibt diese Abfrage auch fremde Schadenakten aus. Deshalb setzen viele Entwicklungsteams zusätzlich eine Regel in der Datenbank selbst, die jede Zeile mit fremder Kennung ausblendet, auch wenn die Schadenplattform den Filter vergisst.
- Eigenes Schema je Versicherer: Ein Schema ist ein abgetrennter Bereich innerhalb einer Datenbank mit eigenen Tabellen. Jeder Versicherer bekommt einen solchen Bereich. Die Schadenplattform richtet jede Abfrage an den Bereich des angemeldeten Versicherers, eine Bedingung auf die Mandantenkennung ist nicht nötig. Dafür muss jede Änderung am Tabellenaufbau in allen Bereichen einzeln durchgeführt werden.
- Eigene Datenbank je Versicherer: So liegen die Daten von Versicherer 12. Daten und Sicherungskopien sind am stärksten getrennt. Der Verwaltungsaufwand ist am höchsten, weil der Dienstleister jede Datenbank einzeln einrichten, sichern und aktualisieren muss.
Welche Trennungsstufe passt, hängt vom Schutzbedarf der Daten, der Zahl der Kunden und den Ausgaben für Server und Datenbanken ab. Viele Dienstleister mischen die Stufen. Die meisten Kunden teilen sich gemeinsame Tabellen, und Kunden mit besonderen Vorgaben wie Versicherer 12 bekommen eine eigene Datenbank.
Neben der Trennung der Daten braucht die gemeinsame Installation Obergrenzen je Versicherer, etwa für die Zahl der Anfragen pro Minute, den belegten Speicher und die Rechenzeit. Bei jeder Anfrage prüft die Schadenplattform die Obergrenzen des Versicherers. Erfasst ein Versicherer nach einem Sturm tausende Schäden auf einmal, bremst die Schadenplattform nur die Anfragen dieses Versicherers, und die anderen Versicherer arbeiten normal weiter. Einstellungen wie Logo, Texte in Briefen oder Freigaberegeln speichert die Schadenplattform ebenfalls je Versicherer.
Keine der drei Trennungsstufen schützt vor einem Fehler, durch den die Schadenplattform eine Anfrage dem falschen Versicherer zuordnet. Auch eine eigene Datenbank hilft dann nicht, weil die Schadenplattform die falsche Datenbank öffnet. Jede Trennungsstufe schützt deshalb nur, wenn die Mandantenkennung aus der geprüften Anmeldung stimmt.
Mandantenfähigkeit: eine Plattform, zwölf Versicherer, getrennte Daten
Wann ist es sinnvoll und wann nicht?
Multi Tenancy lohnt sich
- Ein Dienstleister verkauft dieselbe Software als Dienst an viele Kunden, die im Wesentlichen dieselben Funktionen brauchen. Ohne Multi Tenancy betreibt der Dienstleister für jeden Kunden eine eigene Installation derselben Software.
- Die Zahl der Kunden wächst. Mit einer eigenen Installation je Versicherer müsste der Dienstleister jede neue Programmversion zwölfmal einspielen, zwölf Installationen überwachen und zwölf Server bezahlen, auch wenn die meisten kleinen Versicherer ihren Server kaum auslasten. Mit jedem weiteren Kunden stiege dieser Aufwand. Mit der gemeinsamen Installation spielt der Dienstleister eine neue Programmversion einmal ein, und die kleinen Versicherer teilen sich die Server.
- Innerhalb eines Konzerns bedient eine Plattform mehrere Tochtergesellschaften, deren Daten getrennt bleiben sollen. Ohne Multi Tenancy braucht jede Tochtergesellschaft eine eigene Installation derselben Plattform.
Multi Tenancy ist nicht das Richtige
- Kunden verlangen verschiedene Programmversionen oder eigene Änderungen am Programm. In der gemeinsamen Installation arbeiten alle Kunden mit derselben Programmversion, und jede Änderung für einen Kunden gilt für alle. Dann betreibt der Dienstleister für jeden dieser Kunden eine eigene Installation mit der Programmversion und den Änderungen dieses Kunden. So entstehen im gemeinsamen Programmcode keine Ausnahmen für einzelne Kunden, die jede spätere Änderung erschweren. Dafür spielt der Dienstleister jede neue Programmversion in jede dieser Installationen einzeln ein.
- Ein Kunde verlangt, dass seine Daten in einem bestimmten Land liegen, und die gemeinsame Installation läuft in einem anderen Land. Dann richtet der Dienstleister für diesen Kunden eine eigene Installation auf Servern in diesem Land ein. Die gemeinsame Installation der übrigen Kunden muss dafür nicht umziehen.
- Es gibt nur einen oder zwei Kunden. Eine gemeinsame Installation erspart dann höchstens eine einzige weitere Installation. Dann betreibt der Dienstleister für jeden Kunden eine eigene Installation mit eigenem Server und eigener Datenbank. Die Entwickler müssen dann keine Mandantenkennung, keinen Filter in jeder Abfrage und keine Obergrenzen je Kunde einbauen und prüfen. Dafür spielt der Dienstleister jede neue Programmversion zweimal statt einmal ein.
- Ein Kunde darf vertraglich keine Programme, Server oder Rechenleistung mit anderen Kunden teilen. Dann richtet der Dienstleister für diesen Kunden eine eigene Installation auf eigenen Servern ein. Eine eigene Datenbank wie bei Versicherer 12 genügt nicht, weil der Kunde dabei weiter dieselbe Schadenplattform und dieselben Server wie alle anderen nutzt.
- Eine fehlerhafte neue Programmversion oder ein Serverausfall soll nur einen Teil der Kunden treffen. In der gemeinsamen Installation trifft eine fehlerhafte Programmversion alle zwölf Versicherer zugleich. Dann betreibt der Dienstleister nach der Cell Based Architecture mehrere vollständige Exemplare derselben Schadenplattform, jedes mit eigenen Servern und eigener Datenbank, und verteilt die Kunden auf diese Exemplare. Arbeiten zum Beispiel Versicherer 1 bis 6 mit dem ersten Exemplar und Versicherer 7 bis 11 mit dem zweiten, arbeiten die Versicherer 7 bis 11 bei einem Ausfall des ersten Exemplars weiter. Jedes dieser Exemplare kann selbst mandantenfähig sein.
Nachteile und typische Fehler
Jeder Datenzugriff muss die Mandantenkennung berücksichtigen. Das betrifft nicht nur Datenbankabfragen, sondern auch die Volltextsuche, Caches, Dateiablagen, Protokolle und Berichte. Caches sind Zwischenspeicher für schon berechnete Ergebnisse. Jede neue Funktion muss darauf geprüft werden, ob sie die Mandantenkennung berücksichtigt. Bei gemeinsamen Tabellen ist es aufwendig, nur die Daten eines einzelnen Kunden aus einer Sicherungskopie wiederherzustellen, weil die Sicherung die Daten aller Kunden gemeinsam enthält. Gemischte Trennungsstufen bedeuten, dass der Dienstleister mehrere Arten von Datenbanken einrichten, sichern und aktualisieren muss. Obergrenzen je Kunde müssen festgelegt, überwacht und mit den Kunden vereinbart werden. Sonderwünsche einzelner Kunden führen leicht zu vielen Ausnahmen im gemeinsamen Programmcode, die jede spätere Änderung erschweren. Alle Kunden hängen außerdem von derselben Installation ab: Eine fehlerhafte neue Programmversion trifft alle zwölf Versicherer zugleich.
Typische Fehler und woran man sie erkennt:
- Fehlender Filter: Ein Entwickler vergisst in einer neuen Abfrage an die gemeinsamen Tabellen den Filter auf die Mandantenkennung, und in der Datenbank ist keine Regel eingerichtet, die fremde Zeilen ausblendet. Die Abfrage liefert dann Zeilen aller Kunden, und die Schadenplattform zeigt sie an. Daten eines Kunden landen so bei einem anderen Kunden, und das ist ein schwerer Datenschutzvorfall. Erkennbar ist das an Abfrageergebnissen, die Zeilen mit fremder Mandantenkennung enthalten, oder an der Meldung eines Kunden, er sehe fremde Akten.
- Kennung aus dem Browser: Die Schadenplattform übernimmt die Mandantenkennung aus einem Feld, das der Nutzer selbst verändern kann, statt aus der geprüften Anmeldung. Die Sachbearbeiterin von Versicherer A ändert in diesem Feld „A“ in „B“. Die Schadenplattform fragt dann Zeilen mit der Kennung „B“ ab und zeigt der Sachbearbeiterin die Akten von Versicherer B. Erkennbar ist das an Zugriffen, bei denen die Kennung der Anfrage nicht zur Kennung der Anmeldung passt.
- Konto ohne Regel: Die Regel in der Datenbank ist eingerichtet, aber die Schadenplattform arbeitet mit einem Datenbankkonto, das der Regel nicht unterliegt, etwa dem Konto des Datenbankverwalters. Die Datenbank wendet die Regel dann nicht an, und fremde Zeilen werden nicht ausgeblendet. Erkennbar ist das bei einem Test, der eine Abfrage ohne Filter absichtlich ausführt und trotzdem fremde Zeilen erhält.
- Noisy Neighbor: Der englische Name bedeutet lauter Nachbar. Die Schadenplattform hat keine Obergrenzen je Kunde. Ein Versicherer erfasst nach einem Sturm tausende Schäden auf einmal. Die Schadenplattform bearbeitet dann fast nur noch die Anfragen dieses Versicherers, und die Anfragen der anderen elf Versicherer warten. Erkennbar ist das an langen Antwortzeiten bei allen Versicherern, während die Anfragen fast nur von einem Versicherer stammen.
- Fremde Daten im Cache: Die Schadenplattform legt Ergebnisse in einem Cache ab, ohne die Mandantenkennung in den Schlüssel aufzunehmen, unter dem ein Ergebnis abgelegt wird. Die Sachbearbeiterin von Versicherer A ruft die Liste der offenen Akten auf, und die Schadenplattform legt diese Liste unter dem Schlüssel „offene Akten“ im Cache ab. Kurz danach ruft ein Sachbearbeiter von Versicherer B die Liste der offenen Akten auf. Die Schadenplattform findet den Schlüssel im Cache und gibt dem Sachbearbeiter von Versicherer B die Liste von Versicherer A. Erkennbar ist das an fremden Akten, die nur gelegentlich und kurz nach dem Zugriff eines anderen Versicherers erscheinen.
Weiterführend
Verwandte Ansätze
- Rate Limiting: setzt die Obergrenze für Anfragen je Kunde durch.
- Attribute Based Access Control: prüft bei jedem Zugriff Merkmale wie die Mandantenkennung von Person und Akte.
- Sharding: kann Daten verschiedener Kunden auf mehrere Datenbankserver verteilen oder einen besonders großen Kunden auf mehrere Server aufteilen.
Werkzeuge und Umsetzungen
- PostgreSQL Row Level Security: Regeln je Tabellenzeile, mit denen die Datenbank selbst Zeilen mit fremder Mandantenkennung ausblendet.
- Citus: Erweiterung für die Datenbank PostgreSQL, die Daten verschiedener Kunden auf mehrere Server verteilen kann.
- Hibernate ORM: Java-Bibliothek für Datenbankzugriffe, die Mandanten über eine Kennungsspalte, ein eigenes Schema oder eine eigene Datenbank unterstützt.
- Keycloak: Anmeldedienst, der Nutzer und Anmeldeeinstellungen in getrennten Bereichen je Kunde verwalten kann.
Quellen
- Microsoft: Architect multitenant solutions on Azure: Einstieg in die Reihe zu mandantenfähigen Lösungen; erklärt, dass ein Mandant ein Kunde mit mehreren Nutzern ist und kein einzelner Nutzer.
- Microsoft: Architectural approaches for storage and data in multitenant solutions: vergleicht gemeinsame Tabellen mit Mandantenkennung und eigene Datenbanken je Mandant und beschreibt Regeln je Tabellenzeile in der Datenbank mit ihren Grenzen.
- Microsoft: Noisy Neighbor antipattern: beschreibt, wie die Last eines Mandanten die anderen ausbremst, und nennt Obergrenzen je Mandant als wichtigste Abhilfe.