Keycloak installieren
Allgemein
Keycloak [1] ist eine Open Source Lösung, die ein Single Sign On für verschiedene Anwendungen ermöglicht. Dabei ermöglicht es sowohl die Identitätsverwaltung als auch Zugriffsmanagement.
Es kann die Benutzer entweder aus einem existierenden Verzeichnisdienst (LDAP, Active Directory) auslesen, oder die Gruppen und Benutzer auch selber verwalten.
Technische Details
Keycloak ist in Java geschrieben. Bisher lief es in einem Wildfly Server, aber seit Version 17 (Februar 2022) benutzt es Quarkus, welches ein leichtgewichtiges Java Framework ist.
Es gibt ein Ansible Skript, das die Installationsschritte für Keycloak automatisiert durchführt.
Die Quellen für das Ansible Skript können hier eingesehen werden: [2]
Installation
Was das Ansible Skript macht, lässt sich mit diesen Worten beschreiben:
- Es wird ein Linux Benutzer eingerichtet.
- Es wird eine Postgresql Datenbank eingerichtet.
- Es wird eine Domain aufgeschaltet.
- Es wird Keycloak als Zip Datei heruntergeladen, z.B. [3], und ins Verzeichnis $HOME/keycloak-17.0.0 entpackt.
- Dann werden ein paar Konfigurationen an der Datei
keycloak/conf/keycloak.conf
vorgenommen, um die Postgresql Datenbank einzurichten, und um den Proxymodus auf edge zu setzen und den Hostname zu setzen. - Nun wird die Keycloak Instanz initialisiert, mit dem Befehl:
keycloak/bin/kc.sh --profile=prod build
- Es muss der Server einmal gestartet werden, während der Admin Benutzer mit Passwort in einer Umgebungsvariable gesetzt ist, damit der Benutzer eingerichtet wird.
- Es wird Monit konfiguriert, um den Keycloak Service zu starten, der auf einem internen Port lauscht.
- Es wird der Apache in der htaccess Datei konfiguriert, damit die aufgeschaltete Domain über Proxy auf den Keycloak Dienst verweist. Dabei ist wichtig, dass der Java Prozess mitbekommt, dass die Seite über https läuft. Dazu wird in der htaccess Datei der Wert X-Forwarded-Proto auf https gesetzt.
Beispiel einer Einrichtung
- Auf https://keycloak.example.org/admin anmelden.
Realm einrichten
- Es soll nicht mit der master Realm gearbeitet werden, sondern sollte eine weitere Realm eingerichtet werden, z.B. "MeineFirma"
- Diese neue Realm wird dann ausgewählt
Benutzer einrichten
- Innerhalb der neuen Realm wird dann ein neuer Benutzer angelegt.
- Beim neuen Benutzer kann ausgewählt werden, dass die E-Mail bereits bestätigt ist.
- Nach dem Speichern des Benutzers kann man dann auch bei Credentials das Passwort setzen. Wenn es nur temporär ist, muss der Benutzer es bei der ersten Anmeldung ändern.
- Nun kann man sich als Administrator abmelden und sich als der Benutzer anmelden, auf https://keycloak.example.org/realms/MeineFirma/account/#/
- Achtung: in anderen Anleitungen heißen die URLs /auth/realms usw, aber auth scheint nicht mehr Teil der Standardeinrichtung zu sein.
- Als Benutzer kann man sein Passwort ändern.
- Wieder abmelden, und wieder als Administrator anmelden.
Client einrichten
- Achtung: erst aus der Master Realm in die vorher angelegte Realm wechseln, z.B. "MeineFirma"
- Nun sollte ein Client hinzugefügt werden, also eine beliebige Anwendung, die mit Keycloak zusammenarbeiten soll
- Als Client-Protokoll wählt man "OpenID Connect"
- Die Client-ID kann so aussehen: my-nextcloud
- Anwählen: 'Client Authentication', um den OID Typ auf 'Confidential Access Type' zu setzen.
- Anwählen: 'Standard Flow', 'Implicit Flow' und 'Direct Access Grants'
- Eine Root Url eingeben, z.B. https://nextcloud.example.org
- Eine Valid Redirect URI eingeben, z.B. https://nextcloud.example.org/*
- Gültige Web Origins eingeben, z.B. https://nextcloud.example.org
- Speichern
- Unter Roles eine neue Rolle mit Namen admin anlegen.
- Wieder unter den Client Nextcloud gehen, und bei "Client Scopes" klicke auf "my-nextcloud-dedicated", und wähle dort "Add predefined Mapper". Wähle "client roles", und klicke auf "Add". Dann diesen neuen Mapper "client roles" Bearbeiten, und Client ID auf "my-nextcloud" setzen, und "Token Claim Name" mit "roles" setzen, und "Add to userinfo" auf "ON" stellen. Dann Speichern.
- Dann zu nochmal zu Client Scopes (im Client) gehen, und auf "my-nextcloud-dedicated" klicken, und dort im Reiter "Scope" die Option "Full Scope Allowed" abschalten.
- Dann unter Configure / Realm Settings, in General, bei Endpoints auf "OpenID Endpoint Configuration" klicken, dann wird eine Seite geöffnet, auf dieser URL: https://keycloak.example.org/realms/MeineFirma/.well-known/openid-configuration; diese Seite offen halten, wir brauchen daraus die Daten für die Nextcloud Einrichtung
Nextcloud einrichten
- Als Administrator anmelden, und bei den Apps die App "Social Login" installieren.
- Dann bei Einstellungen, unter Verwaltung, Social Login, die gewünschten Einstellungen vornehmen.
- Es sollte ein Kreuz sein bei: Anlegen eines Kontos verhindern, wenn die E-Mail-Adresse bereits von einem anderen Konto verwendet wird.
- Es sollte ein Kreuz sein bei: Verhindern, dass sich Benutzer ohne gemappte Gruppe anmelden können.
- Speichern
- Dann bei "Benutzerdefinierte OpenID Connect Anbindung" auf das Plus klicken
- Nun die Daten aus der "OpenID Endpoint Configuration" (siehe oben) übernehmen: Authorize URL, Token URL, User info URL, Logout URL
- Client ID: nc (Name des Clients in Keycloak)
- Client Secret: hier kommt das Secret hinein, das in Keycloak im Client unter Credentials "Client Secret" zu finden ist. Das kann über die Zwischenablage kopiert werden.
- Scope: openid
- Speichern
Benutzer einrichten
- Einen Benutzer im Keycloak einrichten, in der Realm "MeineFirma".
- Den Benutzer bearbeiten, und unter "Role Mappings", "Assign Role", "Filter by Clients", wähle "my-nextcloud admin" und klicke auf "Assign".
Fehler beheben
Problem: Gerade beim Experimentieren kommt schon mal die Meldung: "expected expression, got end of script"
- Lösung: Webseite aus der Firefox Chronik komplett löschen, oder in einem privaten Fenster öffnen, dann geht es wieder.
Links
- Webseite von Keycloak
- Ansible Playbook für Hostsharing
- Getting started with Keycloak
- OpenID Connect with Nextcloud and Keycloak von Janik Vonrotz, Oktober 2020
- Nextcloud SSO using Keycloak von Jörns Blog, Dezember 2019