CodamAIDocs
Themafertig

Ablehnungen, die nichts verraten

Unbekannt und gesperrt sehen gleich aus, öffentliche Endpunkte antworten immer gleich, Admin-Ablehnungen sind identisch. Warum man so nichts erfragen kann.

Ausprägungen
Formular: neue und bekannte AdresseLink: unbekannt oder abgelaufenMandant: unbekannt, gesperrt oder nicht erreichbarVerwaltung: keine BerechtigungAbfragen für Dienste

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

BereichSituationWas der Aufrufer sieht
Selbstregistrierung POST /cias/registration/selfneue Adresse202 accepted
Adresse hat schon ein Konto202 accepted, derselbe Körper
zu viele Versuche429, ohne Angabe, wann es wieder geht
Link aus der Mail POST /cias/registration/verifyLink unbekannt404 cias.registration.not-found
Link abgelaufen, Vorgang wartet noch404 cias.registration.not-found, dieselbe Antwort
Link schon eingelöst202 accepted
Filterkette, Mandanten-TorMandant unbekannt403 cias.authentication.tenant-not-served
Mandant gesperrt, geschlossen oder außerhalb der Gültigkeit403 cias.authentication.tenant-not-served
Schlüssel kann gar kein Mandant sein, etwa Nordbau403 cias.authentication.tenant-not-served
CIAS nicht erreichbar, nichts gemerkt403 cias.authentication.tenant-not-served
Attributwerte in diesem Mandanten nicht lesbar403 cias.authentication.tenant-not-served
Mandanten verwalten /cias/admin/tenantskeine Berechtigung, egal für welchen Mandanten403 cias.tenancy.administration-denied, Text not permitted
Benutzer lesen, sperren, schließen, umziehenkeine Berechtigung, egal für welche Person403 cias.user.administration-denied, Text not permitted
Rollen und Gruppen verwaltenkeine Berechtigung, egal aus welchem Grund403 cias.authorization.denied, Text not permitted
Registrierungen verwaltenkeine Berechtigung403 cias.registration.not-authorized, Text not permitted
Mandanten-Abfrage für Dienste GET /cias/lookup/tenants/{key}Aufrufer hat die Abfragerolle nicht403, genau wie bei der Mandantenverwaltung
Schlüssel kann gar kein Mandant sein404, genau wie ein unbekannter Mandant
Attribut-Abfrage für Dienste GET /cias/lookup/users/{id}/attributesAufrufer hat die Abfragerolle nicht403, genau wie bei der Benutzerverwaltung
CIAS kennt die Person nicht200 mit leeren Werten, wie eine Person ohne Werte
CDMS GET /cias/fetchAufrufer hat keine Leserolle403 cdms.cias.declaration-denied, ohne die Rollen zu nennen, die gereicht hätten

Die Ausprägungen

Wo gleiche Antworten schützen

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

Quellen im Code und in der Wissensdatenbank
  • CIAS/cias-registration – RegistrationController (konstanter Körper, 202), RegistrationService (register: gleicher Weg für bekannte und neue Adressen, verify), RegistrationExceptionHandler (not-found, not-authorized, misconfigured, throttled ohne Retry-After, disabled)
  • CIAS/cias-authentication – TenantGate.admit (UNKNOWN, NOT_SERVED, LOOKUP_UNAVAILABLE, ungültiger Schlüssel), JwtSessionFilter.refuse, TokenParser.admit, RequestAdmission
  • CIAS/cias-tenancy – TenantAdministrationService.requireAdministrator, TenantExceptionHandler (REFUSED, Log der Operation), TenantLookupController (ungültiger Schlüssel = 404, gleiche Ablehnung wie Verwaltung)
  • CIAS/cias-user – UserService.requireAdministrator, UserExceptionHandler, AttributeLookupController (unbekannte Person = 200 mit leerer Liste)
  • CIAS/cias-authorization – AuthorizationExceptionHandler (REFUSED cias.authorization.denied), GroupService, RoleCatalogService
  • CDMS/cdms-authorization – CiasApi.getCiasProfile (Ablehnung ohne Rollennamen)
  • CIAS/cias-registration/docs/adr – ADR-012, ADR-014; CIAS/cias-authentication/docs/adr – ADR-021
Suchen