So beschränken Sie Vermittler auf ihre Kunden
Ein Versicherungsvermittler arbeitet von seinem eigenen Laptop aus. Er soll die Kunden- und Vertragsdaten seiner Kunden lesen, ohne Gesundheitsangaben und Bankverbindung, befristet und jederzeit widerrufbar. Den Rest des Bestands soll er nicht einmal sehen.
Lösungsübersicht
Drei Schichten, jede an der Stelle, die sie zuverlässig durchsetzt:
| Schicht | Wo | Was sie begrenzt |
|---|---|---|
| Sicht je Zweck | Datenbank | Zeilen (nur Kunden dieses Vermittlers) und Spalten (ohne schutzwürdige Felder) |
| Regel auf die Sicht | Dienst | Nur diese Sicht, nur lesen; alle anderen Objekte gibt es für den Vermittler nicht |
| Persönlicher Schlüssel | Dienst | Ein Alias, nur lesend, befristet, mit Code von außen, einzeln sperrbar |
Die Sicht erkennt den Vermittler am Sitzungskontext: Für jede Anfrage mit persönlichem Schlüssel
setzt der Dienst SESSION_CONTEXT(N'wkl.person') schreibgeschützt auf den Namen der Person (siehe
Zeilenweise Einschränkung).
Umsetzung
- Zuordnung Vermittler – Kunde in der Datenbank, etwa eine Tabelle
iam.vermittler_kunde(person_name,kunde_id), gepflegt von der Fachanwendung. Sicht anlegen, die nur zugeordnete Kunden und nur freigegebene Spalten zeigt:
CREATE VIEW vermittler.kunde_vertrag AS SELECT k.kunde_id, k.name, k.ort, v.vertrag_id, v.produkt, v.beginn, v.beitrag FROM dbo.kunde AS k JOIN dbo.vertrag AS v ON v.kunde_id = k.kunde_id WHERE EXISTS (SELECT 1 FROM iam.vermittler_kunde AS vk WHERE vk.kunde_id = k.kunde_id AND vk.person_name = CAST(SESSION_CONTEXT(N'wkl.person') AS nvarchar(256)));
Gesundheitsangaben und Bankverbindung stehen nicht in der Sicht; für den Vermittler gibt es sie damit nicht.
Regel nur auf die Sicht, nur lesend (in der Verwaltung als
ClientRules/ClientRuleItems):{ "Id": "vermittler", "Databases": [ "bestand" ], "Resources": [ "views" ], "Objects": [ "vermittler.kunde_vertrag" ], "Verbs": [ "GET" ], "ReadOnly": true }Ordnen Sie die Regel jeder Vermittler-Person zu (
PersonRules). Nicht das Rechtsqlgeben: Mit einer eigenen Anweisung erreichte der Vermittler alles, was die Anmeldung des Alias erreicht, auch die Tabellen hinter der Sicht.Schlüssel je Vermittler mit
issue-key, befristet auf die Vertragsdauer:{ "person": "Max Vermittler", "label": "Laptop", "expiresAt": "2027-06-30T00:00:00Z", "readOnly": true, "databases": [ "bestand" ], "delivery": "mail" }Für Zugriffe von außen gilt die Regel „Schlüssel von außen nur mit Code“ aus Private Geräte zulassen.
- Prüfen mit dem Schlüssel des Vermittlers: Das Dienstdokument (
/odata/v4/bestand/vermittler/) nennt nurkunde_vertrag; eine Abfrage liefert nur seine Kunden; eine Anfrage an/odata/v4/bestand/dbo/kundebeantwortet der Dienst mit404. Mit dem Schlüssel eines zweiten Vermittlers erscheinen dessen Kunden.
Ergebnis: Jeder Vermittler liest nur seine Kunden ohne schutzwürdige Felder, nur über diese Sicht, bis zum Ablauf seines Schlüssels.
Hinweise
- Der Name ist die Verbindung.
wkl.personist der Name der Person in der Verwaltung; wird sie umbenannt, muss die Zuordnung mitgehen. Wer das vermeiden will, gibt jeder Person eine eigene SQL-Anmeldung, stellt den Alias aufPersons: Impersonateund filtert überSUSER_SID()(Beispiel 1 unter Zeilenweise Einschränkung). - Spalten in
$metadata. Die Sicht zeigt ihre Spalten allen, die sie sehen dürfen; was nicht in der Sicht steht, erscheint nirgends. - Weitergabe der Daten. Was der Vermittler gelesen hat, liegt auf seinem Gerät. Begrenzen Sie die Sicht deshalb auf das, was er für seine Arbeit braucht.