Worum es geht
Jede Antwort eines Servers ist eine Information. Wenn ein Endpunkt auf „diese Adresse kennen wir“ anders antwortet als auf „diese Adresse kennen wir nicht“, kann jeder das ausnutzen. Er schickt tausend Adressen und liest an den Antworten ab, welche bei euch ein Konto haben. Das nennt man Enumeration: Durchprobieren, bis man eine Liste hat.
Dasselbe gilt für Mandanten („gibt es den Kunden nordbau?“), für Personen und für Rollen. Nicht der Zugriff selbst ist dann das Problem, sondern schon die Frage, ob es etwas gibt.
CIAS antwortet deshalb an den wichtigen Stellen so, dass die Antwort nur sagt, dass etwas nicht geht. Warum es nicht geht, schreibt CIAS ins Log der Anwendung. Das Log liest nur, wer die Installation betreibt.
Das Bild
flowchart LR
A["unbekannt"] --> G{{"Prüfung"}}
B["gesperrt"] --> G
C["nicht erreichbar"] --> G
D["ungültiger Schlüssel"] --> G
G -- "nach außen" --> R["eine Antwort<br/>403 tenant-not-served"]
G -- "nach innen" --> L[("Log der Anwendung<br/>mit dem echten Grund")]
Lies es so: Egal, aus welchem Grund das Mandanten-Tor ablehnt, der Aufrufer sieht dieselbe Antwort. Der Unterschied landet im Log, wo ein Betreiber ihn braucht und ein Angreifer ihn nicht sieht.
Situation → sichtbare Antwort
| Bereich | Situation | Was der Aufrufer sieht |
|---|---|---|
Selbstregistrierung POST /cias/registration/self | neue Adresse | 202 accepted |
| Adresse hat schon ein Konto | 202 accepted, derselbe Körper | |
| zu viele Versuche | 429, ohne Angabe, wann es wieder geht | |
Link aus der Mail POST /cias/registration/verify | Link unbekannt | 404 cias.registration.not-found |
| Link abgelaufen, Vorgang wartet noch | 404 cias.registration.not-found, dieselbe Antwort | |
| Link schon eingelöst | 202 accepted | |
| Filterkette, Mandanten-Tor | Mandant unbekannt | 403 cias.authentication.tenant-not-served |
| Mandant gesperrt, geschlossen oder außerhalb der Gültigkeit | 403 cias.authentication.tenant-not-served | |
Schlüssel kann gar kein Mandant sein, etwa Nordbau | 403 cias.authentication.tenant-not-served | |
| CIAS nicht erreichbar, nichts gemerkt | 403 cias.authentication.tenant-not-served | |
| Attributwerte in diesem Mandanten nicht lesbar | 403 cias.authentication.tenant-not-served | |
Mandanten verwalten /cias/admin/tenants | keine Berechtigung, egal für welchen Mandanten | 403 cias.tenancy.administration-denied, Text not permitted |
| Benutzer lesen, sperren, schließen, umziehen | keine Berechtigung, egal für welche Person | 403 cias.user.administration-denied, Text not permitted |
| Rollen und Gruppen verwalten | keine Berechtigung, egal aus welchem Grund | 403 cias.authorization.denied, Text not permitted |
| Registrierungen verwalten | keine Berechtigung | 403 cias.registration.not-authorized, Text not permitted |
Mandanten-Abfrage für Dienste GET /cias/lookup/tenants/{key} | Aufrufer hat die Abfragerolle nicht | 403, genau wie bei der Mandantenverwaltung |
| Schlüssel kann gar kein Mandant sein | 404, genau wie ein unbekannter Mandant | |
Attribut-Abfrage für Dienste GET /cias/lookup/users/{id}/attributes | Aufrufer hat die Abfragerolle nicht | 403, genau wie bei der Benutzerverwaltung |
| CIAS kennt die Person nicht | 200 mit leeren Werten, wie eine Person ohne Werte | |
CDMS GET /cias/fetch | Aufrufer hat keine Leserolle | 403 cdms.cias.declaration-denied, ohne die Rollen zu nennen, die gereicht hätten |
Die Ausprägungen
Wann: Jemand schickt das Registrierungsformular ab.
CIAS geht für beide Adressen denselben Weg: Vorgang anlegen, Link erzeugen, warten. Nur die Mail unterscheidet sich. Eine neue Adresse soll sich bestätigen, eine bekannte bekommt einen Hinweis auf ihr Konto. Die Mail liest nur, wem das Postfach gehört.
Ergebnis: Immer 202 mit demselben Körper. Siehe Schutz der öffentlichen Endpunkte.
Wann: Jemand löst einen Bestätigungs- oder Einladungslink ein, der nicht (mehr) passt.
Ob es den Link nie gab oder ob er abgelaufen ist, verrät die Antwort nicht. Ein Link, der schon eingelöst ist, antwortet dagegen mit 202. Das ist kein Leck, sondern Rücksicht auf Mailprogramme, die Links vorab öffnen.
Ergebnis: 404 cias.registration.not-found, Text no open registration for this link
Wann: Eine Anfrage mit gültigem Token nennt einen Mandanten, den das Mandanten-Tor nicht zulässt.
Jeder Grund bekommt denselben Schlüssel. Sonst könnte jeder mit einem gültigen Token Firmennamen durchprobieren und so die Kundenliste abfragen. Auch ein Schlüssel, der gar kein Mandant sein kann, wird nicht mit 400 abgewiesen, sondern wie ein unbekannter behandelt.
Ergebnis: 403 cias.authentication.tenant-not-served, Text request refused. Siehe Den Mandanten zulassen.
Wann: Jemand ruft eine Verwaltungs-API auf, ohne die nötige Rolle zu haben.
Die Ablehnung nennt keinen Grund: 403, ein Schlüssel für den Bereich und der Text not permitted. Welche Operation versucht wurde und warum sie scheiterte, steht nur im Log. Beim Verwalten von Mandanten und Gruppen und beim Lesen, Sperren, Schließen und Umziehen von Benutzern prüft CIAS die Berechtigung, bevor es nach dem Ziel sucht. Wer nicht darf, erfährt also auch nicht, ob es den Mandanten, die Gruppe oder die Person gibt.
Ergebnis: 403 mit dem Schlüssel des Bereichs
Wann: Ein CDMS-Knoten fragt ein getrennt betriebenes CIAS nach einem Mandanten oder nach Attributwerten.
Diese Endpunkte haben eigene Rollen, getrennt von der Verwaltung. Wer die Rolle nicht hat, bekommt dieselbe Ablehnung wie bei der Verwaltung. Wer sie hat, bekommt so wenig wie möglich: beim Mandanten nur, ob er bedient wird, bei der Person nur ihre Werte, nie Namen, Adressen oder Stellungen.
Ergebnis: Siehe die Tabelle oben
Wo Antworten sich unterscheiden
Nicht jede Antwort ist gleich, und das muss auch nicht sein. Ein Unterschied ist harmlos, wenn er nichts über gespeicherte Daten verrät, die den Aufrufer nichts angehen:
- Eine kaputte Anfrage bekommt 400, etwa wenn ein Pflichtfeld fehlt. Das hängt nur an dem, was du selbst geschickt hast.
- Die Drosselung antwortet mit 429, egal welche Adresse im Formular steht.
- Die Mandanten-Abfrage für Dienste unterscheidet bewusst: 200 für einen bekannten Mandanten, 404 für einen unbekannten. Der fragende Dienst braucht den Unterschied für sein Log, und er hat schon ein eigenes Dienst-Token mit eigener Rolle.
- Die Bereiche unterscheiden sich untereinander. Eine Ablehnung der Mandantenverwaltung trägt einen anderen Schlüssel als eine der Rollenverwaltung. Gleich bleibt: Keine dieser Ablehnungen nennt ihren Grund.
- Verwaltungs-APIs für Berechtigte sagen offen, was los ist: 404, wenn es etwas nicht gibt, 409, wenn es schon existiert. Wer die Berechtigung hat, darf das wissen.
Auch eine falsch eingestellte Installation verrät nichts: Fehlt etwa in der Registrierung eine Rolle, scheitert der Aufruf, und die Antwort nennt nicht, welche Rolle fehlt. Das steht im Log.
Fallen
Weiter
- Schutz der öffentlichen Endpunkte
- Den Mandanten zulassen (Mandanten-Tor)
- Die Obergrenze: niemand vergibt mehr, als er hat
- In CDMS gilt dasselbe für Datensätze: Warum Unsichtbares 404 liefert
- Im Zweifel ablehnen