Skip to content

it-at-m/BayernID-Plugin

Repository files navigation

KeyCloak (RedHat SSO) BayernID Plugin

Bauen

mvn clean install

Deployen

Entweder:

  • KeyCloak/RH-SSO muss laufen
  • Folgendes ausführen
mvn wildfly:deploy

Oder:

Die Datei bayernid-plugin-[VERSION].jar aus dem Verzeichnis target (existiert nach dem Build-Prozess) in das KeyCloak-Verzeichnis standalone/deployments kopieren. Erst danach den KeyCloak/RH-SSO starten.

Konfigurieren

Siehe Dokument KeyCloak-Konfiguration.pdf

Mapper und Authenticators

Die folgenden Mapper werden durch das Plugin ergänzt:

  • CUSTOM Current-Timestamp mapper: Setzt den aktuellen Timestamp (Unix Epoch) in Sekunden. Sollte als "force" (immer updaten) konfiguriert werden. Damit weiß man später, wann der letzte Login des Users erfolgte.
  • Custom effective scopes mapper: Wird benötigt, damit die angeforderten Scopes beim SSO (Wechsel zwischen zwei Clients) mit betrachtet werden können. Führt dazu, dass kein SSO zugelassen wird, wenn bei einem Wechsel zwischen zwei Clients nicht alle benötigten Scopes im User vorliegen.
  • CUSTOM UUID generator: Setzt eine randomisiert generierte UUID. Sollte als "import" (nur bei der ersten Anlage des Datensatzes) verwendet werden, um eine interne ID zu setzen.
  • Custom ID Template Importer: Erweiterung des ID Template Importers. Zusätzlich kann auch auf die bPK (die ja anders als die bPK2 noch per BASE64 ausgepackt und ausgeschnitten werden muss) zugegriffen werden. Außerdem wird der String ID_MISSING_DO_NOT_USE gesetzt, falls kein Wert ermittelt werden kann.
  • CUSTOM Attribute-with-Scope Importer: Erweiterung des Attribute Importers. Es kann zusätzlich noch ein Scope definiert werden. Nur wenn dieser Scope beim Zugriff auf den Client angefordert wird (explizit oder implizit), wird das entsprechende Attribut bei der BayernID angefordert. Außerdem kann per "Required Attribute" festgelegt werden, ob das Attribut zwingend bei der BayernID angefragt wird (führt zu einem Fehler, wenn es nicht vorliegt).
  • CUSTOM Attribute-with-Mapping Importer: Erweiterung des Attribut Importers. Es kann ein Mapping angegeben werden, so dass ein eingehender Wert auf einen anderen Wert umgeschrieben werden kann.
  • Custom Username Template Importer: Erweiterung des Username Template Importers. Zusätzlich kann auch auf die bPK (die ja anders als die bPK2 noch per BASE64 ausgepackt und ausgeschnitten werden muss) zugegriffen werden. Außerdem wird der String ID_MISSING_DO_NOT_USE gesetzt, falls kein Wert ermittelt werden kann.

Die folgenden Authenticators werden durch das Plugin ergänzt:

  • Require Attribute: Forciert, dass ein User nach dem Login in einem Attribut einen bestimmten Wert hat. Der Wert kann entweder in Form einer Liste angegeben werden oder per RegEx. Zusätzlich kann noch gefordert werden, dass im aktuellen Client ein gleichnamiger Scope mindestens optional zugeordnet ist. Damit kann man bspw. erreichen, dass in einem Client nur bestimmte IDPs zugelassen sind.
  • CUSTOM Identity Provider Redirector: Eine Erweiterung des Identity Provider Redirectors. Ein IDP-Hint kann damit auch in einem SAML-Request mitgegeben werden (im Extensions-Bereich). Außerdem erfolgt eine direkte Weiterleitung zum externen IDP, wenn aufgrund versch. Filterungen nur einer zur Auswahl steht.
  • CUSTOM Require Effective Scopes: Wird im Zusammenspiel mit dem o.g. "Custom effective scopes mapper" genutzt, damit beim SSO (Wechsel zwischen zwei Clients) geprüft wird, ob alle angeforderten Scopes im User auch vorliegen.

Testen

Je nachdem, ob das Plugin per SAML2-Client oder OIDC-Client aufgerufen wird, verhält es sich unterschiedlich (z.B. hinsichtlich des angeforderten Authentifizierungsniveaus), so dass beides getestet werden sollte.

OIDC

Für einen OIDC-Test kann grundsätzlich die Account-Anwendung verwendet werden. Diese ist folgendermaßen zu erreichen: https://<basis-URL-inkl-Realm>/account

Falls das Bürgerkonto als Default-Provider konfiguriert ist (unter Authentication->Identity Provider Redirector->Actions->Config->Default eintragen, z.B. "buergerkonto"), kommt man sofort zur Login-Maske des Bürgerkontos bei der AKDB, an sonsten kommt die Login-Maske des Keycloak/RH-SSO, in der man dann "buergerkonto", "Bayern-ID" o.ä. anklickt (nicht direkt einloggen).

Bei OIDC kann man per Anforderung von Scopes ein höheres Authentifizierungsniveau anfordern. Das funktioniert über die Angabe der folgenden Scopes

  • level1: mindestes Username+Passwort
  • level2: [derzeit nicht belegt]
  • level3: mindestens Authega
  • level4: nPA mit eID

Außerdem gibt es noch die folgenden Scopes in Verbindung mit dem ELSTER Unternehmenskonto (NEZO):

  • any oder (keine explizite Angabe): sowohl Bürgerkonto als auch Unternehmenskonto sind für den Login möglich (falls BayernID und NEZO als Broker konfiguriert sind, erscheinen beide IDPs aus Auswahlmöglichkeit im Keycloak Loginscreen)
  • legalEntity: nur Unternehmenskonto ist für den Login möglich
  • person: nur Login mit Bürgerkonto ist möglich

Die Scopes zum Authentifizierungsniveau und zum Unternehmenskonto sind kombinierbar.

Zudem gibt es noch den Scope debug. Wenn dieser zusätzlich gesetzt wird, werden SAML Request und Response im Logfile ausgegeben.

Außerdem können natürlich die weiteren definierten und als optional im Client konfigurierten Client Scopes angefordert werden, um die darin enthaltenen Attribute zu erhalten (z.B. profile, email oder birthdate).

Das BayernID-Plugin ist derzeit so konfiguriert, dass nur die BayernID-eigenen Authentifizierungsmethoden eID, Authega, ELSTER und Benutzername+Passwort aktiv sind, d.h. die anderen Methoden wie temporär Login und Servicekonten (anderer Bundesländer / NutzerkontoBund oder anderer europäischer Staaten) sind standardmäßig deaktiviert. Der Grund ist, dass die bei den Servicekonten übertragenen Attribute sehr unterschiedlich sind, so dass man u.U. Schwierigkeiten mit der sauberen Verarbeitung im nachgelagerten Fachverfahren bekommt. Man kann aber explizit die anderen Authentifizierungsmethoden erzwingen über den Scope otherOptions.

Ein Test der beschriebenen Scopes kann wie folgt vorgenommen werden:

Schritt 1: Auth Endpoint aufrufen (im Browser):

http://<basis-URL-inkl-Realm>/protocol/openid-connect/auth?response_type=code&client_id=eogov&redirect_uri=https://www.muenchen.de&scope=level3+legalEntity+openid

In diesem Beispiel sollten dann nur noch Authega und nPA zur Auswahl stehen. Login durchführen.

Schritt 2: Muenchen.de wird aufgerufen, sieht in etwa so aus:

https://www.muenchen.de/?session_state=32fca3d2-b398-4be7-9991-43ba9aba8159&code=[code]

Code entnehmen

Schritt 3: Token Endpoint per RESTClient aufrufen (mit Code von oben) und Access-Token besorgen

POST
http://<basis-URL-inkl-Realm>/protocol/openid-connect/token
client_id=eogov&client_secret=<secret>&grant_type=authorization_code&code=<code>

SAML2

Per SAML2 angebundene Clients müssen die Konfiguration, die bei OIDC per Scopes gesteuert wird, stattdessen im SAML-Request mitschicken. Bspw. wie folgt:

<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="Login" Version="2.0" IssueInstant="2012-01-01T00:00:00Z">
    <samlp:Extensions>
        <bayernid:RequestedAttributeSet xmlns:bayernid="urn:bayernid:1.0">person</bayernid:RequestedAttributeSet>
        <akdb:AuthenticationRequest xmlns:akdb="https://www.akdb.de/request/2018/09">
            <akdb:AuthnMethods>
                <akdb:eID>
                    <akdb:Enabled>true</akdb:Enabled>
                </akdb:eID>
                <akdb:Elster>
                    <akdb:Enabled>true</akdb:Enabled>
                </akdb:Elster>
            </akdb:AuthnMethods>
            <akdb:RequestedAttributes>
                <!--gender-->
                <akdb:RequestedAttribute Name="urn:oid:1.3.6.1.4.1.33592.1.3.5"/>
                <!--givenName / Vorname-->
                <akdb:RequestedAttribute Name="urn:oid:2.5.4.42" RequiredAttribute="false"/>
                <!--surname / Nachname-->
                <akdb:RequestedAttribute Name="urn:oid:2.5.4.4" RequiredAttribute="true"/>
                <!--bPK2-->
                <akdb:RequestedAttribute Name="urn:oid:1.3.6.1.4.1.25484.494450.3" RequiredAttribute="true"/>
                <!--authlevel-->
                <akdb:RequestedAttribute Name="urn:oid:1.2.40.0.10.2.1.1.261.94" RequiredAttribute="true"/>
                <!--birthdate / Geburtsdatum - Scope birthdate -->
                <akdb:RequestedAttribute Name="urn:oid:1.2.40.0.10.2.1.1.55" RequiredAttribute="true"/>
            </akdb:RequestedAttributes>
        </akdb:AuthenticationRequest>
        <lhm:otherOptions xmlns:lhm="urn:lhm:1.0">true</lhm:otherOptions>
        <lhm:idpHint xmlns:lhm="urn:lhm:1.0">buergerkonto</lhm:idpHint>
        <lhm:RequestedScopes xmlns:lhm="https://www.muenchen.de/request/2022/03">
            <lhm:Scope>email</lhm:Scope>
            <lhm:Scope>debug</lhm:Scope>
        </lhm:RequestedScopes>
    </samlp:Extensions>
    <samlp:RequestedAuthnContext Comparison="minimum" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
        <saml:AuthnContextClassRef>STORK-QAA-Level-3</saml:AuthnContextClassRef>
    </samlp:RequestedAuthnContext>
</samlp:AuthnRequest>

Dabei gibt es folgende Möglichkeiten:

  • bayernid:RequestedAttributeSet (im Bereich Extensions): any, legalEntity oder person (s. OIDC für Beschreibung)
  • lhm:otherOptions (im Bereich Extensions): Explizites Hinzukonfigurieren der weiteren Authentifizierungsmethoden bei der BayernID wie FINK (aber keine temporären Logins)
  • lhm:idpHint (im Bereich Extensions): Durch Angabe eines Broker-Alias kann die Keylcoak-Loginseite übersprungen und direkt zum entsprechenden externen IDP (z.B. BayernID oder NEZO) weitergeleitet werden.
  • lhm:RequestedScopes (im Bereich Extensions): Angabe der explizit gewünschten Scopes, die bei der BayernID angefordert werden sollen. Falls keine explizite Angabe erfolgt, werden alle im zugehörigen SAML-Client definierten Client Scopes bei der BayernID angefordert.
    In der Schlussfolgerung werden auch nur die Attribute im SAML-Response geliefert, die in den angeforderten Scopes definiert sind (weitere Attribute wurden ja gar nicht von der BayernID eingeholt).
  • akdb:AuthnMethods (im Bereich Extension im Unterbereich akdb:AuthenticationRequest): Hier können explizit die Anmeldeoptionen der BayernID angegeben werden, die bei diesem Request aktiv sein sollen,
    bspw. Benutzername, eID oder Elster, aber da die Anfrage direkt an die BayernID durchgereicht wird, sind auch alle weiteren derzeit oder künftig verfügbaren Anmeldeoptionen möglich.
  • akdb:RequestedAttributes (im Bereich Extension im Unterbereich akdb:AuthenticationRequest): Aus Gründen der Schnittstellenkompatibilität zur BayernID ist es über diesen Parameter zusätzlich zu den o.g. RequestedScopes möglich, direkt einzelne Attribute von der BayernID anzufordern. Es wird aber dringend empfohlen, stattdessen wenn möglich die RequestedScopes zu nutzen oder an sonsten alle Attribute anzufordern, die einen Scope vollständig abdecken, da es sonst zu ungewollten Effekten im SSO-bedingten Wechsel zwischen verschiedenen Anwendungen kommt.
  • RequestedAuthnContext (separater Bereich im SAML-Request): Hierüber lässt sich einschränken, mit welcher Authentifizierungsstufe sich ein*eine User*in an der BayernID anmelden soll. Es stehen hier derzeit die Optionen STORK-QAA-Level-1, STORK-QAA-Level-3 und STORK-QAA-Level-4 zur Verfügung. In diesem Beispiel sollte dann bei der AKDB dann nur noch die Bürgerkonto-Authentifizierungsmethoden mit starkem TrustLevel zur Verfügung stehen

Diese Möglichkeiten kann man bspw. bei Shibboleth erreichen, indem man in der Datei shibboleth2.xml einen SessionInitiator mit entsprechendem Inhalt definiert.

About

Plugin für Keycloak (RH-SSO) zur Anbindung der BayernID über den Brokering-Mechanismus

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages