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.
- Niemand hat etwas hingeschrieben.
- Die Anwendung startet nicht.
- Die Meldung nennt die fehlende Angabe oder den fehlenden Typ.
- Die Installation schreibt eine leere Liste hin.
- Die Anwendung startet.
- Die Regel gilt für niemanden.
- 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.
| Angabe | Wofür | Wann Pflicht |
|---|---|---|
Bean PlatformAdministrators | welche Rollen die Plattform verwalten | sobald ein Verwaltungsmodul eingeschaltet ist |
Bean RegistrationRoles | welche Rollen eine Registrierung vergibt: für Gründer, für Mitglieder, ohne Mandant | wenn die Registrierung eingeschaltet ist |
codamai.cias.tenancy.lookup | woher das Mandanten-Tor seine Antworten holt: local oder remote | immer, wenn die Filterkette von CIAS läuft |
codamai.cias.tenancy.client.base-url und .token | wo CIAS erreichbar ist und mit welchem Token gefragt wird | bei lookup: remote |
codamai.cias.tenancy.lookup-roles | wer den Mandanten-Endpunkt für Dienste fragen darf | wenn codamai.cias.tenancy.lookup-rest an ist |
codamai.cias.user.lookup-roles | wer die Attributwerte pro Mandant für Dienste abfragen darf | wenn codamai.cias.user.lookup-rest an ist |
codamai.cdms.cias.reader-roles | wer in CDMS GET /cias/fetch lesen darf, also die Liste aller Rollen und Attribute | immer in CDMS |
codamai.cias.iam-provider | mit welchem Identity Provider CIAS spricht: keycloak oder memory | im Starter |
codamai.cias.notification.mail | wie Mails das Haus verlassen: smtp oder log | wenn das Mailmodul eingeschaltet ist |
codamai.cias.notification.mail.from | der Absender der Mails | bei mail: smtp |
cias_client | der Client, an dem Modulrollen hängen | wenn die Registrierung eingeschaltet ist |
| öffentliche Basisadresse der Registrierung | wohin die Links in den Mails zeigen | wenn die Registrierung eingeschaltet ist |
Die Gründe sind immer dieselben. Zwei Beispiele:
lookupohne Standard. Wärelocalder Standard, würde ein CDMS-Dienst, der die Einstellung vergessen hat, ein CIAS im eigenen Prozess fragen, das es dort gar nicht gibt. Wäreremoteder Standard, würde ein eigenständiges CIAS sich selbst über HTTP fragen. Beides ist schlechter als ein Start, der gar nicht erst klappt.mailohne Standard. Wärelogder 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:
| Was beim Start auffällt | Folge |
|---|---|
Ein Modul will einen öffentlichen Pfad wie /** oder / freigeben | Start 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 lesen | Start 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 0 | Start 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 Client | Start verweigert |
| Eine Adresse für den ersten Plattform-Administrator ist eingetragen, aber keine Administratorrolle, oder Keycloak kennt die Adresse nicht | Start 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:
| Einstellung | Warum sie vor Kunden gefährlich ist |
|---|---|
codamai.cias.iam-provider: memory | ein Identity Provider im Speicher, der beim Neustart alle Konten vergisst |
codamai.cias.notification.mail: log, wenn Mails eingeschaltet sind | Mails landen im Log statt beim Empfänger |
codamai.cias.migration.enabled: false | niemand 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).
| Wert | Was passiert | Wofür |
|---|---|---|
enforce (gilt, wenn nichts gesetzt ist) | Start verweigert, jede Einstellung wird genannt | jede Installation vor Kunden: Stage, Produktion, Blue/Green |
warn | Start läuft, jede Einstellung steht als Warnung im Log | nur 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.
| Situation | Was CIAS nicht tut | Was passiert |
|---|---|---|
Betriebsart MULTI, das Token nennt keinen Mandanten | einen Standardmandanten wählen | 403 cias.authentication.tenant-required |
| Die Person gehört mehreren Organisationen an, nichts sagt, welche gemeint ist | die erste nehmen | 403 cias.authentication.tenant-unresolved |
| Das Mandanten-Tor kennt den Mandanten nicht, oder CIAS antwortet nicht und nichts ist gemerkt | durchlassen | 403 cias.authentication.tenant-not-served |
| Die Attributwerte der Person in diesem Mandanten lassen sich nicht lesen | mit leeren Werten weitermachen | 403 cias.authentication.tenant-not-served |
| Keycloak liefert beim Token-Tausch kein Token | eine Identität annehmen | die Anfrage läuft ohne Identität weiter, jede Rollenprüfung lehnt ab |
| Ein Aufrufer ohne Rollen, oder die Liste der Administratorrollen ist leer | ihn als Administrator behandeln | er ist kein Plattform-Administrator |
| Eine Rolle hat keine Delegation | jedem erlauben, sie zu vergeben | nur ein Plattform-Administrator vergibt sie |
POST /cias/admin/roles ohne scope | „plattformweit“ oder „im Mandanten“ annehmen | 400, die Anfrage ist ungültig |
POST /cias/admin/tenants ohne type | „dynamisch“ oder „statisch“ annehmen | 400, die Anfrage ist ungültig |
| Ein Registrierungsablauf ist nicht eingestellt | einen großzügigen Standardablauf nehmen | der 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:
| Einstellung | Standard |
|---|---|
codamai.cias.tenant-gate.ttl: wie lange das Mandanten-Tor eine Antwort merkt | 30 Sekunden |
codamai.cias.attribute-lookup.ttl: wie lange Attributwerte pro Mandant gemerkt werden | 30 Sekunden |
codamai.cias.token-exchange.ttl: wie lange ein getauschtes Token wiederverwendet wird | 5 Minuten |
| Wartezeit beim Fragen eines getrennten CIAS | je 2 Sekunden für Verbindung und Antwort |
| Größe der Zwischenspeicher | 10 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.