Support

Lorem ipsum dolor sit amet:

24h / 365days

We offer support for our customers

Mon - Fri 8:00am - 5:00pm (GMT +1)

Get in touch

Cybersteel Inc.
376-293 City Road, Suite 600
San Francisco, CA 94102

Have any questions?
+44 1234 567 890

Drop us a line
info@yourdomain.com

About us

Lorem ipsum dolor sit amet, consectetuer adipiscing elit.

Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec.

, von Stefano Bosio

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äts­föderations­protokolle 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
  • email
  • 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:

  • email
  • 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.

NEHMEN SIE KONTAKT MIT UNS AUF

+41 79 444 07 92
Unsere Mission

Die Zukunft unseres Landes liegt nicht in den Händen anonymer Grosskonzerne, sondern in den mutigen Entscheidungen unserer Unternehmer. Wer seine Daten und seine digitale Existenz fremden Mächten überlässt, gibt seine Unabhängigkeit preis. Wir stehen für eine starke Wirtschaft, für nationale Verantwortung und für digitale Souveränität. Unsere Daten bleiben hier – unsere Zukunft auch!

Copyright 2026. All Rights Reserved.
Einstellungen gespeichert
Datenschutzeinstellungen

Wir verwenden Cookies und ähnliche Technologien, um Ihre Erfahrung auf unserer Website zu verbessern.

Dies sind Blindinhalte in jeglicher Hinsicht. Bitte ersetzen Sie diese Inhalte durch Ihre eigenen Inhalte. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo.

user_privacy_settings

Domainname: Domain hier eintragen
Ablauf: 30 Tage
Speicherort: Localstorage
Beschreibung: Speichert die Privacy Level Einstellungen aus dem Cookie Consent Tool "Privacy Manager".

user_privacy_settings_expires

Domainname: Domain hier eintragen
Ablauf: 30 Tage
Speicherort: Localstorage
Beschreibung: Speichert die Speicherdauer der Privacy Level Einstellungen aus dem Cookie Consent Tool "Privacy Manager".

ce_popup_isClosed

Domainname: Domain hier eintragen
Ablauf: 30 Tage
Speicherort: Localstorage
Beschreibung: Speichert, dass das Popup (Inhaltselement - Popup) durch einen Klick des Benutzers geschlossen wurde.

onepage_animate

Domainname: Domain hier eintragen
Ablauf: 30 Tage
Speicherort: Localstorage
Beschreibung: Speichert, dass der Scrollscript für die Onepage Navigation gestartet wurde.

onepage_position

Domainname: Domain hier eintragen
Ablauf: 30 Tage
Speicherort: Localstorage
Beschreibung: Speichert die Offset-Position für die Onepage Navigation.

onepage_active

Domainname: Domain hier eintragen
Ablauf: 30 Tage
Speicherort: Localstorage
Beschreibung: Speichert, dass die aktuelle Seite eine "Onepage" Seite ist.

view_isGrid

Domainname: Domain hier eintragen
Ablauf: 30 Tage
Speicherort: Localstorage
Beschreibung: Speichert die gewählte Listen/Grid Ansicht in der Demo CarDealer / CustomCatalog List.

portfolio_MODULE_ID

Domainname: Domain hier eintragen
Ablauf: 30 Tage
Speicherort: Localstorage
Beschreibung: Speichert den gewählten Filter des Portfoliofilters.

Eclipse.outdated-browser: "confirmed"

Domainname: Domain hier eintragen
Ablauf: 30 Tage
Speicherort: Localstorage
Beschreibung: Speichert den Zustand der Hinweisleiste "Outdated Browser".
You are using an outdated browser. The website may not be displayed correctly. Close