Have any questions?
+44 1234 567 890
combined.expert - Keycloak und PrivacyIDEA: Das perfekte Paar für unabhängige Authentifizierung
In einer digitalen Landschaft, in der viele Authentifizierungs- und Identitätsmanagement-Lösungen noch immer von ausländischen Infrastrukturen abhängen, haben wir uns für einen anderen Weg entschieden. Mit Keycloak und PrivacyIDEA haben wir eine Infrastruktur aufgebaut, die sich nicht nur auf den Schutz der Daten im Speicher beschränkt, sondern das Prinzip der Unabhängigkeit bis ins Herz des Zugriffs ausdehnt – auf die Authentifizierung selbst.
Keycloak ist eine Open-Source-Software, die Single Sign-On (IdP) mit Identity- und Access-Management für moderne Anwendungen und Dienste bietet. Die Software ist in Java geschrieben und unterstützt die Identitätsföderationsprotokolle SAML v2, OpenID Connect (OIDC) und OAuth2.
PrivacyIDEA ist ein modularer Open-Source-Authentifizierungsserver, der genutzt werden kann, um die Sicherheit bestehender Anwendungen zu erhöhen – etwa beim lokalen Login, bei VPN, beim Remotezugriff, bei SSH-Verbindungen oder beim Zugriff auf Websites oder Webportale mit Zwei-Faktor-Authentifizierung.
Zusammen bilden sie ein robustes Ökosystem, frei von Abhängigkeiten zu Anbietern, die restriktiven ausländischen Vorschriften unterliegen, und perfekt geeignet für den schweizerischen und europäischen Rechtsrahmen.
Wir haben diese leistungsstarke Kombination nicht nur wegen ihrer technischen Reife und erwiesenen Stabilität gewählt, sondern weil sie ein Modell darstellt, das mit unserer Sicherheitsvision übereinstimmt: unabhängig, überprüfbar und ohne jegliche Kompromisse bei der Privatsphäre.
Aber es handelt sich nicht nur um Theorie: Wir haben eine konkrete Implementierung realisiert, die die Leistungsfähigkeit von Keycloak mit der Vielseitigkeit von PrivacyIDEA verbindet und so eine Infrastruktur geschaffen, die sicheres Single Sign-On und erweiterte Multi-Faktor-Authentifizierung für Anwendungen wie Nextcloud und grommunio gewährleistet. In den folgenden Abschnitten zeigen wir, wie wir Keycloak mit PrivacyIDEA integriert und die OIDC-Anbindung für grommunio und Nextcloud realisiert haben.
In diesem Artikel beginnen wir direkt mit der Konfiguration der Integration und setzen voraus, dass Keycloak, PrivacyIDEA und die beteiligten Anwendungen bereits installiert und funktionsfähig sind. Ziel ist es zu zeigen, wie sich diese Technologien kombinieren lassen, um ein sicheres, unabhängiges und produktionsreifes IAM- und MFA-System zu schaffen.
Die Architektur des Authentifizierungssystems sieht einen dedizierten virtuellen Server für Keycloak und einen dedizierten virtuellen Server für PrivacyIDEA vor. Gemeinsam bieten sie Authentifizierungsdienste für alle Kunden an, wobei eine Trennung in sogenannten Realms erfolgt.
Die Konfiguration von PrivacyIDEA sieht einen LDAP-Resolver im für den Kunden dedizierten Realm vor. Dabei verwenden wir die klassischen Einstellungen wie in jeder anderen Software, zum Beispiel bei Citrix NetScaler.
Der wichtigste Teil ist die Festlegung des Benutzernamens, der anschliessend als Attribut für den Zugriff und zur Identifizierung des Objekts (objectGUID) verwendet wird. Diese Informationen müssen in allen Anwendungen, die die Identitätsdienste nutzen, einheitlich konfiguriert sein. Der Parameter objectGUID ist besonders wichtig, wenn Nextcloud direkt mit Active Directory verbunden ist, wie wir später noch sehen werden.
Unser LDAP-Resolver muss mit dem eigenen Realm verbunden sein.
Um den Zugriff für die Benutzer zu gewährleisten, benötigen wir Richtlinien (Policies). Diese Konfiguration variiert stark je nach den Anforderungen der Kunden. Für unsere Demonstration konfigurieren wir eine Richtlinie für TOTP und eine für die Push-Authentifizierung.
Die Enrollment-Richtlinien ermöglichen es dem Benutzer, sein Identitätstoken zu registrieren.
Nun kümmern wir uns um die Konfiguration von Keycloak. Wie bei PrivacyIDEA benötigen wir die Verbindung zu Active Directory im Realm des Kunden.
Wir verwenden dieselben LDAP-Einstellungen wie bei PrivacyIDEA. Auch hier legen wir besonderen Wert auf die Werte für den Benutzernamen und das UUID-Attribut.
Jetzt legen wir fest, welche Attribute aus Active Directory mit Keycloak synchronisiert werden. Diese Konfiguration ist besonders wichtig, da je nach Anwendung zusätzliche Informationen benötigt werden. Wir erstellen die folgenden Mapper:
- displayName
- firstName
- lastName
- ldap-groups
- sAMAccountName
displayName:
email:
firstName:
lastName:
ldap-groups:
sAMAccountName:
An dieser Stelle gehen wir zur Verbindung von grommunio – der Open-Source-Plattform für E-Mail und Groupware – mit Keycloak über. Der grommunio-Server ist bereits mit Active Directory verbunden.
Wir haben uns für OpenID Connect statt SAML entschieden, um eine grössere Flexibilität bei modernen Integrationen, bessere Erweiterungsmöglichkeiten und eine einfachere Verwaltung der Authentifizierungsflüsse zu gewährleisten.
grommunio erfordert ein benutzerdefiniertes Attribut-Mapping:
Für den Rest verwenden wir die Standardeinstellungen.
Die Konfiguration von grommunio ist sehr einfach. Wir erstellen die Datei keycloak.json im Verzeichnis /etc/gromox auf dem grommunio-Server, tragen die erforderlichen Daten ein und speichern die Datei.
vi /etc/gromox/keycloak.json
{
"realm": "Realm-Name aus Keycloak",
"auth-server-url": "https://login.mydomain.ch/",
"ssl-required": "external",
"resource": "grommunio",
"public-client": true,
"confidential-port": 0,
"principal-attribute": "preferred_username"
}
Wir kopieren den öffentlichen RSA-Schlüssel aus der Keycloak-Konsole:
Mit diesem Befehl erstellen wir die Datei bearer_pubkey im Verzeichnis /etc/gromox.
Wichtig: Ersetzen Sie die Zeichenfolge ABC durch den öffentlichen RSA-Schlüssel.
echo "ABC..." | fold -w 64 | sed '1i -----BEGIN PUBLIC KEY-----' | sed '$a -----END PUBLIC KEY-----' > /etc/gromox/bearer_pubkey
Zum Schluss starten wir den Dienst neu:
systemctl restart gromox-http
Die OIDC-Konfiguration für grommunio ist abgeschlossen.
Die Konfiguration für Nextcloud erfordert hingegen mehr Erfahrung.
Bei der Integration von Nextcloud mit Keycloak über LDAP/Active Directory gehört die Verwaltung des Attributs objectGUID zu den häufigsten Herausforderungen. Dieser eindeutige Bezeichner wird von Nextcloud im binären Format, in dem er bereitgestellt wird, nicht nativ interpretiert. Ohne eine Umwandlung in ein lesbares Format (z. B. als hexadezimale Zeichenkette) können Probleme bei der Benutzererkennung auftreten. Die Lösung besteht darin, ein Mapping oder eine Konvertierung auf Verzeichnis- oder Identity-Provider-Seite zu verwenden, sodass Nextcloud einen stabilen und konsistenten Wert zur Benutzeridentifikation erhält.
Die Grundkonfiguration des OIDC-Clients ähnelt der Konfiguration für grommunio:
Nextcloud erfordert ein benutzerdefiniertes Attribut-Mapping:
Wir haben die folgenden Mappings konfiguriert:
- objectGUID.
- sAMAccountName
- userPrincipalName
- displayName
- ldap_uid
- preferred_username
- groups
email:
Besondere Aufmerksamkeit widmen wir dem Mapping des objectGUID.
sAMAccountName:
displayName:
ldap_uid (userPrincipalName):
preferred_username (LDAP_ID)
groups:
Die Konfiguration von Nextcloud erfordert die App OpenID Connect Login, die wir einfach über die grafische Oberfläche von Nextcloud installieren. Diese App verfügt jedoch nicht über eine grafische Oberfläche wie beispielsweise SAML. Die Konfiguration erfolgt über die Datei config.php von Nextcloud, die sich im Verzeichnis /var/www/nextcloud/config befindet.
Wir tragen die OIDC-Einstellungen in die Datei ein:
// OIDC config, reference https://github.com/pulsejet/nextcloud-oidc-login
'oidc_login_provider_url' => 'https://login.mydomain.ch/realms/myrealm',
'oidc_login_client_id' => 'nextcloud',
'oidc_login_client_secret' => 'My$ecretKey',
'oidc_login_auto_redirect' => true,
'oidc_login_logout_url' => 'https://nextcloud.mydomain.ch/apps/oidc_login/oidc',
'oidc_login_end_session_redirect' => true,
'oidc_login_button_text' => 'Log in with OpenID',
'oidc_login_hide_password_form' => true,
'oidc_login_proxy_ldap' => false,
'oidc_login_use_id_token' => true,
'oidc_login_attributes' => array (
'id' => 'preferred_username',
'name' => 'displayName',
'mail' => 'email',
'userPrincipalName' => 'userPrincipalName',
'sAMAccountName' => 'sAMAccountName',
),
'oidc_login_ldap_uid' => 'userPrincipalName',
'oidc_login_scope' => 'openid profile',
'oidc_login_disable_registration' => true,
'oidc_login_redir_fallback' => true,
'oidc_login_tls_verify' => true,
//'oidc_login_debug' => true,
//'loglevel' => 0,
Für ein LDAP-Backend in Nextcloud müssen wir das Attribut objectGUID bei allen Benutzern in Kleinbuchstaben umwandeln. Nextcloud speichert den GUID-Wert in Grossbuchstaben, während Keycloak ihn in Kleinbuchstaben verwendet. Ohne diese Anpassung würden die AD-Benutzer beim Login in Nextcloud nicht gefunden werden. Wir haben uns für die Änderung auf Nextcloud-Seite entschieden. Natürlich wäre auch der umgekehrte Weg möglich, das Attribut auf Keycloak-Seite anzupassen. In jedem Fall ist die beste Lösung eine Automatisierung per Skript, und die Wahl des Ansatzes hängt vom technischen Wissen über die jeweiligen Produkte ab.
Hier ein Beispiel zur Umwandlung in Kleinbuchstaben:
sudo -u postgres psql
\c nextcloud_db
select * from oc_ldap_user_mapping;
UPDATE oc_ldap_user_mapping
SET directory_uuid = LOWER(directory_uuid)
UPDATE oc_ldap_user_mapping
SET owncloud_name = LOWER(owncloud_name);
Der in der grafischen Administrationsoberfläche von Nextcloud konfigurierte LDAP-Filter muss gegebenenfalls angepasst werden. Hier haben wir einen Filter, der mit Keycloak und LDAP funktioniert:
(&(&(objectClass=person)(memberof:1.2.840.113556.1.4.1941:=CN=Nextcloud Users,OU=Security Groups,OU=Groups,OU=MySite,DC=myDomain,DC=local))(|(sAMAccountName=%uid)(mail=%uid)(mailPrimaryAddress=%uid)(userPrincipalName=%uid)(objectGUID=%uid)))
Die beiden OIDC-Clients grommunio und Nextcloud sind nun einsatzbereit.
Jetzt bleibt nur noch die Integration von PrivacyIDEA mit Keycloak. Wir laden das Open-Source-Plugin unter folgender Adresse herunter:
https://github.com/privacyidea/keycloak-provider
Der Blog und zusätzliche Informationen sind online verfügbar:
https://community.privacyidea.org/t/how-to-use-keycloak-with-privacyidea/1132
Wir können die Datei PrivacyIDEA-Keycloak-Provider-1.5.1.1.jar per WinSCP auf den PrivacyIDEA-Server in das Verzeichnis /tmp kopieren und sie anschliessend in das Verzeichnis providers von Keycloak verschieben:
cp /tmp/PrivacyIDEA-Keycloak-Provider-1.5.1.1.jar /opt/keycloak/providers/PrivacyIDEA-Keycloak-Provider-1.5.1.1.jar
Bevor wir fortfahren, müssen wir diesen Befehl ausführen, um den neuen Anbieter zu aktivieren:
sudo -u keycloak /opt/keycloak/bin/kc.sh build
Zum Schluss starten wir den Dienst neu:
sudo systemctl restart keycloak
In der Administrationsoberfläche von Keycloak können wir den Flow «browser» duplizieren und einen neuen Flow «browser with privacyidea» erstellen.
Wir fügen dem Flow eine neue Position hinzu:
Wir suchen den Provider PrivacyIDEA und wählen ihn aus.
Wir deaktivieren die nicht benötigten Positionen wie OTP Form und lassen nur PrivacyIDEA aktiv.
Wir öffnen die Einstellungen des Providers und konfigurieren die erforderlichen Optionen:
Jetzt müssen wir nur noch den Flow zuweisen:
Die sichere Ausführung von Webdiensten erfordert zwingend die Verwendung eines Reverse Proxy, der den Zugriff auf Ressourcen gezielt steuert:
Die Administrationsoberfläche darf nicht von aussen erreichbar sein, während die Ressourcen des Realms gemäss dem Prinzip des «Least Privilege» zugänglich sind – das bedeutet, dass jede Komponente oder jeder Benutzer nur die Berechtigungen erhält, die unbedingt notwendig sind, um ihre bzw. seine Aufgaben zu erfüllen.
Die folgende Konfiguration ist ein guter Ausgangspunkt für Keycloak:
Erlaubte URLs mit den entsprechenden Regex-Schema:
# /favicon.ico
^/favicon\.ico$
# /resources/*
^/resources(/.*)?$
# /realms/myrealm/*
^/realms/myrealm(/.*)?$
Blockierte URLs mit den entsprechenden Regex-Schema:
# / (root)
^(/.*)?$
Für PrivacyIDEA ist die Konfiguration ähnlich:
Erlaubte URLs mit den entsprechenden Regex-Schema:
# /saml/*
^/saml(/.*)?$
# /ttype/push
^/ttype/push$
# /token/init
^/token/init$
# /validate/*
^/validate(/.*)?$
# /static/*
^/static(/.*)?$
# /notification/*
^/notification(/.*)?$
Blockierte URLs mit den entsprechenden Regex-Schema:
# / (root)
^(/.*)?$
Das Ergebnis ist ein flüssiges und sicheres Zugriffserlebnis: Der Nutzer meldet sich nur einmal an, gibt das OTP ein und kann dank Single Sign-On ohne weitere Anmeldedaten von grommunio zu Nextcloud und anderen integrierten Anwendungen wechseln.
Wenn der Schutz von Identitäten und digitale Souveränität für Ihr Unternehmen Priorität haben, stellen wir Ihnen gerne unsere Expertise zur Verfügung — vom sicheren Hosting in der Schweiz bis hin zur spezialisierten Beratung bei der Planung von IAM- und MFA-Architekturen.
Kontaktieren Sie uns jetzt für eine kostenlose und unverbindliche Demonstration.