CodamAIDocs
Themafertig

Im Zweifel ablehnen

Kein Standardmandant, keine Standard-Administratorrolle, Pflichtkonfiguration ohne Default. Warum eine Anwendung lieber nicht startet, als großzügig zu starten.

Ausprägungen
kein Default-Mandantkeine Default-Rollenausdrücklich leer heißt niemandPflicht-BeansStart verweigertPflichtangabe in der Anfrage

Worum es geht

Wer Rechte verwaltet, kann auf zwei Arten danebenliegen. Er lässt jemanden nicht hinein, der hinein dürfte. Oder er lässt jemanden hinein, der nicht hinein dürfte. Der erste Fehler ist ärgerlich und fällt sofort auf. Der zweite fällt oft gar nicht auf, denn alles funktioniert ja.

CIAS entscheidet sich deshalb in jedem Zweifelsfall für den ersten Fehler. Das nennt man Fail-closed, auf Deutsch etwa „im Zweifel geschlossen“. Es gilt an zwei Stellen:

  • beim Start: Fehlt eine Angabe, die über Rechte entscheidet, startet die Anwendung nicht. Die Fehlermeldung nennt, was fehlt.
  • bei jeder Anfrage: Kann CIAS eine Frage nicht sicher beantworten, lehnt es ab, statt eine günstige Antwort anzunehmen.

Fehlt, leer oder genannt

Eine Angabe wie „welche Rollen verwalten die Plattform?“ kann drei Zustände haben. CIAS behandelt sie verschieden, und der Unterschied ist Absicht.

Drei Zustände einer Rechte-Angabe
fehlt
  • Niemand hat etwas hingeschrieben.
  • Die Anwendung startet nicht.
  • Die Meldung nennt die fehlende Angabe oder den fehlenden Typ.
ausdrücklich leer
  • Die Installation schreibt eine leere Liste hin.
  • Die Anwendung startet.
  • Die Regel gilt für niemanden.
genannt
  • Die Installation nennt Rollen.
  • Die Anwendung startet.
  • Die Regel gilt für jeden, der eine dieser Rollen hat.

„Leer“ und „fehlt“ sehen im Code ähnlich aus, bedeuten aber etwas anderes. Eine leere Liste ist eine Entscheidung: „Das soll über die API niemand dürfen.“ Eine fehlende Angabe ist ein Versehen. CIAS will das Versehen beim Start sehen, nicht beim ersten Kunden.

Leer heißt dabei immer niemand, nie jeder. Eine leere Liste der Plattform-Administratorrollen bedeutet: Niemand ist Plattform-Administrator.

Was eine Installation angeben muss

Manche Angaben sind Beans. Eine Bean ist ein Objekt, das Spring beim Start zusammensteckt. Liefert keine Bibliothek sie mit, muss die Installation sie selbst anlegen. Andere Angaben sind Einstellungen in der application.yml. Beide haben keinen Standardwert.

AngabeWofürWann Pflicht
Bean PlatformAdministratorswelche Rollen die Plattform verwaltensobald ein Verwaltungsmodul eingeschaltet ist
Bean RegistrationRoleswelche Rollen eine Registrierung vergibt: für Gründer, für Mitglieder, ohne Mandantwenn die Registrierung eingeschaltet ist
codamai.cias.tenancy.lookupwoher das Mandanten-Tor seine Antworten holt: local oder remoteimmer, wenn die Filterkette von CIAS läuft
codamai.cias.tenancy.client.base-url und .tokenwo CIAS erreichbar ist und mit welchem Token gefragt wirdbei lookup: remote
codamai.cias.tenancy.lookup-roleswer den Mandanten-Endpunkt für Dienste fragen darfwenn codamai.cias.tenancy.lookup-rest an ist
codamai.cias.user.lookup-roleswer die Attributwerte pro Mandant für Dienste abfragen darfwenn codamai.cias.user.lookup-rest an ist
codamai.cdms.cias.reader-roleswer in CDMS GET /cias/fetch lesen darf, also die Liste aller Rollen und Attributeimmer in CDMS
codamai.cias.iam-providermit welchem Identity Provider CIAS spricht: keycloak oder memoryim Starter
codamai.cias.notification.mailwie Mails das Haus verlassen: smtp oder logwenn das Mailmodul eingeschaltet ist
codamai.cias.notification.mail.fromder Absender der Mailsbei mail: smtp
cias_clientder Client, an dem Modulrollen hängenwenn die Registrierung eingeschaltet ist
öffentliche Basisadresse der Registrierungwohin die Links in den Mails zeigenwenn die Registrierung eingeschaltet ist

Die Gründe sind immer dieselben. Zwei Beispiele:

  • lookup ohne Standard. Wäre local der Standard, würde ein CDMS-Dienst, der die Einstellung vergessen hat, ein CIAS im eigenen Prozess fragen, das es dort gar nicht gibt. Wäre remote der Standard, würde ein eigenständiges CIAS sich selbst über HTTP fragen. Beides ist schlechter als ein Start, der gar nicht erst klappt.
  • mail ohne Standard. Wäre log der Standard, würde eine Installation jede Mail als verschickt melden und keine einzige zustellen. Das merkt man erst, wenn sich Kunden beschweren.

Weitere Prüfungen beim Start

Außer fehlenden Angaben fängt CIAS beim Start noch einige Fehler ab, die sonst still Rechte öffnen würden:

Wann CIAS den Start verweigert
Was beim Start auffälltFolge
Ein Modul will einen öffentlichen Pfad wie /** oder / freigebenStart verweigert. So ein Pfad würde die Anmeldung für die ganze Anwendung abschalten.
Ein Modul meldet ein Attribut pro Mandant an, aber nichts kann die Werte lesenStart verweigert. Sonst gälte still der Wert aus dem Token, in jedem Mandanten derselbe.
Eine Zeit ist negativ, ein Zwischenspeicher kleiner als 1, eine Wartezeit 0Start verweigert
Eine Drosselungsgrenze nennt einen Zähler, den es nicht gibt (Tippfehler)Start verweigert. Sonst wäre die Grenze still wirkungslos.
Zwei Module in der Deklarationsliste tragen denselben Namen, oder einem fehlt Name oder ClientStart verweigert
Eine Adresse für den ersten Plattform-Administrator ist eingetragen, aber keine Administratorrolle, oder Keycloak kennt die Adresse nichtStart verweigert

Jede Anwendung mit CIAS prüft außerdem beim Start, ob Entwicklungseinstellungen übrig geblieben sind. Das gilt für das eigenständige CIAS genauso wie für jede Anwendung, die CIAS eingebettet mitbringt. Ist eine dieser Einstellungen gesetzt, startet die Anwendung nicht und nennt jede davon:

EinstellungWarum sie vor Kunden gefährlich ist
codamai.cias.iam-provider: memoryein Identity Provider im Speicher, der beim Neustart alle Konten vergisst
codamai.cias.notification.mail: log, wenn Mails eingeschaltet sindMails landen im Log statt beim Empfänger
codamai.cias.migration.enabled: falseniemand legt die Tabellen von CIAS an oder hebt sie an
spring.jpa.hibernate.ddl-auto nicht validate (nur eigenständiges CIAS)Hibernate ändert das Schema selbst, statt Abweichungen zu melden

Ob ein Fund den Start verhindert, entscheidet eine Einstellung: codamai.safety.mode (als Umgebungsvariable CODAMAI_SAFETY_MODE).

WertWas passiertWofür
enforce (gilt, wenn nichts gesetzt ist)Start verweigert, jede Einstellung wird genanntjede Installation vor Kunden: Stage, Produktion, Blue/Green
warnStart läuft, jede Einstellung steht als Warnung im Lognur der Rechner eines Entwicklers und Tests

Der Wert sagt, was passiert, nicht wo die Anwendung läuft. Deshalb braucht es keine eigenen Werte für jede Umgebung. Das eigenständige CIAS setzt warn nur in seinem Profil local.

Zur Laufzeit: im Zweifel ablehnen

Auch bei jeder einzelnen Anfrage gilt: Was CIAS nicht sicher weiß, wird abgelehnt. Die Tabelle zeigt die wichtigsten Stellen.

SituationWas CIAS nicht tutWas passiert
Betriebsart MULTI, das Token nennt keinen Mandanteneinen Standardmandanten wählen403 cias.authentication.tenant-required
Die Person gehört mehreren Organisationen an, nichts sagt, welche gemeint istdie erste nehmen403 cias.authentication.tenant-unresolved
Das Mandanten-Tor kennt den Mandanten nicht, oder CIAS antwortet nicht und nichts ist gemerktdurchlassen403 cias.authentication.tenant-not-served
Die Attributwerte der Person in diesem Mandanten lassen sich nicht lesenmit leeren Werten weitermachen403 cias.authentication.tenant-not-served
Keycloak liefert beim Token-Tausch kein Tokeneine Identität annehmendie Anfrage läuft ohne Identität weiter, jede Rollenprüfung lehnt ab
Ein Aufrufer ohne Rollen, oder die Liste der Administratorrollen ist leerihn als Administrator behandelner ist kein Plattform-Administrator
Eine Rolle hat keine Delegationjedem erlauben, sie zu vergebennur ein Plattform-Administrator vergibt sie
POST /cias/admin/roles ohne scope„plattformweit“ oder „im Mandanten“ annehmen400, die Anfrage ist ungültig
POST /cias/admin/tenants ohne type„dynamisch“ oder „statisch“ annehmen400, die Anfrage ist ungültig
Ein Registrierungsablauf ist nicht eingestellteinen großzügigen Standardablauf nehmender Ablauf existiert nicht, der Aufruf wird abgelehnt

Warum lehnt CIAS ab, wenn es die Attributwerte nicht lesen kann, statt einfach „keine Werte“ anzunehmen? Weil „keine Werte“ in CDMS gefährlich nah an „alle Werte“ liegt: Ein einziges * schaltet einen Attributfilter ganz ab. Leere Werte wären also keine sichere Annahme, sondern eine Wette.

Ist die Anfrage abgelehnt, schreibt die Filterkette nichts in den RequestContext. Auch Code, der die Ablehnung übersehen würde, fände dort keinen Mandanten und keine Rollen.

Wo es Standardwerte gibt

Nicht alles in CIAS muss man einstellen. Standardwerte gibt es für alles, was keine Rechte vergibt:

EinstellungStandard
codamai.cias.tenant-gate.ttl: wie lange das Mandanten-Tor eine Antwort merkt30 Sekunden
codamai.cias.attribute-lookup.ttl: wie lange Attributwerte pro Mandant gemerkt werden30 Sekunden
codamai.cias.token-exchange.ttl: wie lange ein getauschtes Token wiederverwendet wird5 Minuten
Wartezeit beim Fragen eines getrennten CIASje 2 Sekunden für Verbindung und Antwort
Größe der Zwischenspeicher10 000 Einträge

Auch diese Zeiten sind sicherheitsrelevant, denn so lange kann eine Sperre verzögert wirken. Aber ein falscher Wert macht die Anwendung nur träger oder gesprächiger, er öffnet nichts.

Und manches soll den Start bewusst nicht aufhalten:

  • Eine Moduldeklaration, die CIAS nicht annehmen kann, lehnt nur dieses eine Modul ab. Seine Rollen werden dann nicht geschrieben. Die Anwendung startet trotzdem, denn sonst könnte ein einziges fehlerhaftes Modul die ganze Plattform lahmlegen.
  • Ein Rollenabgleich beim Start, der nicht ganz durchläuft, steht mit allen Einzelheiten im Log. Die Anwendung startet. Sonst würde sie nicht hochkommen, nur weil ein anderer Dienst gerade neu startet.
  • Fehlende Metriken ändern nichts am Verhalten. Das Mandanten-Tor arbeitet ohne Messwerte genauso.

Fallen

Weiter

Quellen im Code und in der Wissensdatenbank
  • CIAS/CLAUDE.md – §12.3 Fail Closed, §32 Security (keine Default-Admin-Rolle, keine stillen Tenant-Fallbacks)
  • CIAS/cias-kernel – PlatformAdministrators (kein Default, leere Menge = niemand, isPlatformAdministrator), TenantRequirement
  • CIAS/cias-authentication – CiasTokenConfiguration (TenantLookupPort Pflicht), TenantBoundAttributeWiringCheck, SessionConfig.collect (OPENS_EVERYTHING), TenantGateProperties, AttributeLookupProperties, TokenExchangeProperties, TokenParser (tokenParser, admit), JwtSessionFilter
  • CIAS/cias-tenancy – CiasTenancyConfiguration (lookup ohne Default, AdministrationConfiguration, LookupRestConfiguration), TenantLookupRoles, TenantAdministrationService.requireAdministrator, TenantRestDtos.CreateTenantRequest (type @NotNull)
  • CIAS/cias-tenancy-client – CiasTenancyClientProperties (base-url), CiasTenancyClientConfiguration (token)
  • CIAS/cias-registration – RegistrationRoles (drei Mengen, kein Default), CiasRegistrationConfiguration (requireClient, RegistrationRoles über ObjectProvider), RegistrationLinks, RateLimiterPort.bucket
  • CIAS/cias-notification – CiasNotificationConfiguration.ciasMailSender (smtp oder log, kein Default), SmtpConfiguration (mail.from)
  • CIAS/cias-user – CiasUserConfiguration (lookup-roles), AttributeLookupRoles
  • CIAS/cias-authorization – CiasAuthorizationConfiguration (PlatformAdministrators, Deklarationsquellen), AuthorizationRestDtos.DefineRoleRequest (scope @NotNull), RoleReconciliationService (abgelehnte Deklaration)
  • CIAS/cias-spring-boot-starter – CiasAutoConfiguration (RegistrationRoles nicht mitgeliefert, Abgleich beim Start), CiasIamAutoConfiguration (iam-provider), CiasDeclarationAutoConfiguration, CiasBootstrap, CiasProperties
  • CIAS/cias-spring-boot-starter – CiasSafetyCheck, SafetyMode (codamai.safety.mode)
  • CIAS/cias-runtime – CiasLocalProfileNotice, CiasPlatformAdministratorConfiguration, CiasTenantLookupRoleConfiguration, CiasRegistrationRoleConfiguration, CiasMailTemplateEditConfiguration
  • CDMS/cdms-authorization – CiasReaderRoles (codamai.cdms.cias.reader-roles ohne Default), CiasApi
  • CIAS/cias-authorization/docs/adr – ADR-028; CIAS/cias-authentication/docs/adr – ADR-021, ADR-042; CIAS/cias-kernel/docs/adr – ADR-022
Suchen