Single Sign-On mit Seafile und Keycloak

Seafile bietet Administratoren eine große Anzahl von Single Sign-On Authentifizierungsprotokollen. Seafile Community unterstützt neben Shibboleth und Remove User mit Kerberos auch das zunehmend beliebte OAuth2. Die Professional Edition kommen dann noch ADFS, SAML 2.0 und CAS hinzu. In diesem Artikel geht es explizit um die Einrichtung von Single Sign-On (SSO) mit der Hilfe des Identity Providers (IDP) Keycloak. Keycloak ist ein Open Source Projekt, welches federführend von Red Hat entwickelt wird und sich zum Ziel gesetzt hat, moderne Applikationen mit wenig oder sogar gar keinem Coding-Aufwand abzusichern.

Identity Management mit Keycloak

Neben seiner Einfachheit besticht Keycloak durch einen beeindruckenden Funktionsumfang, der auch komplexe Business-Szenarien abdeckt. Keycloak unterstützt nicht nur die Protokolle SAML und OpenID Connect, sondern ist auch kompatibel mit anderen Identity Providern und erlaubt die einfache Anbindung an weitere Identity Provider in Form eines Identity Brokerings.

Zusätzlich bietet Keycloak die Möglichkeit, LDAP-Server und Microsoft Active Directories als Basis für die Nutzerinformationen zu verwenden. So übernimmt Keycloak dank User Federation den zentralisierte Login, während die zentrale Benutzerverwaltung in einem LDAP oder Active Directory erfolgt.

Wer mehr über den Funktionsumfang von Keycloak erfahren will, sollte einen Blick in die offizielle Dokumentation von Keycloak werfen. In diesem Artikel geht es lediglich darum zu zeigen, wie einfach es ist, Seafile als eine Client-Applikation in Keycloak anzulegen.

Vorbereitung

Folgenden Voraussetzungen werden im Weitern unterstellt:

Wenn dies alles gegeben ist, kann es losgehen. Ansonsten finden Sie eine Videoanleitung für die Installation von Seafile auf YouTube. Die Installation von Keycloak auf Ubuntu 18.04 findet sich Blog des Seafile Partners datamate.

Registrierung von Seafile als neuer Client in Keycloak

Existierende Clients in Keycloak

Öffnen Sie das Webinterface von Keycloak und wählen Sie den Bereich Clients in der Hauptnavigation aus. Im Hauptfenster werden nun die aktuell existierenden Clients angezeigt.

Neuen Client in Keycloak hinzufügen

Hier werden wir nun Seafile als neuen Client anlegen. Ein Klick auf oben rechts auf Create führt zu einem ersten Eingabeformular, in dem die Client-ID, das Client Protokoll und die Root URL des neuen Clients festgelegt werden müssen. Die Client-ID darf ein beschreibender Namen wie z.B. Seafile sein. Als Client Protokoll wählen Sie openid-connect. Im Eingabefeld für die Root URL tragen Sie schließlich die URL des Seafile Systems ein.

Konfiguration des neuen Keycloak Clients

Nach einem Klick auf Save wird der neue Client angelegt und man gelangt zu den Details. In mindestens neun Tabs sind die Konfigurationseinstellungen gegliedert und erlauben eine einfache und schnelle Anpassung des neuen Seafile Clients in Keycloak.

Im ersten Tab Settings müssen Sie die folgenden Einstellungen vornehmen:

Auslesen der Zugangsdaten für den Client

Als nächstes wechseln Sie in den Tab Credentials und speichern das Secret in die Zwischenablage. Wir werden diesen Wert im nächsten Schritt bei der Konfiguration von Seafile benötigen.

Die Werte in den anderen Tabs müssen nicht angepasst werden. Wer möchte, kann die Client Scopes reduzieren, so dass nur noch email, profile verwendet werden. Dies ist aber nicht zwingend notwendig.

Anlage eines Anwenders in Keycloak

Wie bereits oben beschrieben, ist Keycloak nicht zwingend das System, in dem die Anwender gespeichert und administriert werden müssen. Der Einfachheit halber, legt man jedoch für diesen Test einfach einen Testuser an. Klicken Sie dafür links auf Users und erzeugen dann einen neuen Anwender.

Ein neuer Anwender wird in Keycloak angelegt

Im Tab Credentials setzen Sie noch ein Passwort für diesen User.

Konfiguration von SSO in Seafile

Im nächsten Schritt erfolgt die Konfiguration dieses neuen Keycloak Clients in den Konfigurationsdateien von Seafile. Im englischsprachigen Seafile Handbuch ist die Konfiguration anhand von Github oder Google beschrieben. In diesem deutschsprachigen Video unseres Partners datamate wird gezeigt, welche Anpassungen für Microsoft Azure bzw. Office365 vorgenommen werden müssen. Analog dieser Beschreibungen müssen für Keycloak in der seahub_settings.py die folgenden Einstellungen hinzugefügt werden.


ENABLE_OAUTH = True
OAUTH_ENABLE_INSECURE_TRANSPORT = True

OAUTH_CLIENT_ID = "seafile"
OAUTH_CLIENT_SECRET = "<replace-with-client-secret>"
OAUTH_REDIRECT_URL = 'https://<seafile-url>/oauth/callback/'
 
OAUTH_PROVIDER_DOMAIN   = '<seafile-url-without https>'
OAUTH_AUTHORIZATION_URL = 'https://<keycloak-url>/auth/realms/master/protocol/openid-connect/auth'
OAUTH_TOKEN_URL         = 'https://<keycloak-url>/auth/realms/master/protocol/openid-connect/token'
OAUTH_USER_INFO_URL     = 'https://<keycloak-url>/auth/realms/master/protocol/openid-connect/userinfo'
OAUTH_SCOPE = ["profile", "email"]
OAUTH_ATTRIBUTE_MAP = {
    "id":    (False, "not used"),
    "name":  (False, "full name"),
    "email": (True, "email"),
}

Die Werte in den spitzen Klammern müssen natürlich entsprechend angepasst werden. Wenn Sie den Seafile Client in Keycloak nicht im master, sondern in einem anderen Realm erzeugt haben, müssen Sie auch diesen Wert drei Mal entsprechend anpassen.

Nach diesen Änderungen muss der Seafile Server noch neu gestartet werden.

SSO, jetzt geht es los!

SSO wird auf der Login Maske von Seafile angezeigt

Wenn Sie nun den Seafile Login aufrufen, wird unterhalb der Eingabefelder ein neuer Link Single Sign-On angezeigt. Einen Klick darf leitet den Besucher auf die Anmeldeseite von Keycloak um.

Anmeldeseite von Keycloak

Auf dieser Login-Seite gibt der Anwender nun seine Zugangsdaten ein bzw. man testet diesen Login mit dem eben in Keycloak angelegten User. Wenn Benutzername und Passwort richtig sind, wird man wieder zurück zu Seafile geleitet und direkt eingeloggt. Sollte man noch andere Anwendung mit Keycloak verbunden haben, muss man sich in diesen Anwendungen nun nicht mehr einloggen. Die einmalige Anmeldung genügt für die Dauer der konfigurierten Session und erlaubt die Nutzung aller Anwendungen ohne erneute Authentifizierung.

Typische Fehler, die bei Single Sign-On auftreten können

Wie so häufig in der IT, können selbst kleinste Fehler in der Konfiguration verhindern, dass dieses Zusammenspiel von Seafile und Keycloak funktioniert. Die folgende Auflistung versucht die typischen Fehlerquellen mit Ursache und Lösungen zu benenen.

Fehlerbild: SSO-Link wird auf der Seafile Loginseite nicht angezeigt.
Normalerweise wird dieser Link immer eingeblendet, sobald in der seahub_settings.py oauth aktiviert wurde. Wenn er also nicht angezeigt wird, kann dies verschiedenste Gründe haben:

Fehlerbild: Keycloak Login bleibt weiß oder öffnet sich nicht.
Seafile öffnet einfach nur die URL, welche im Wert OAUTH_AUTHORIZATION_URL definiert ist. Ist dieser Wert korrekt? Läuft eventuell ein Memcache, welches neu gestartet werden muss?

Fehlerbild: Es erscheint kein Keycloak Login sondern die Fehlermeldung Missing parameters: client_id
Die Konfigurationsparameter OAUTH_CLIENT_ID und OAUTH_CLIENT_SECRET sollten überprüft werden. Anscheinend sind diese nicht richtig. Eventuell ist auch der Realm falsch.

Fehlerbild: Keycloak zeigt an Invalid username or password.
Wurde der User im richtigen Realm angelegt? Hat der User in Keycloak auch wirklich ein Passwort? Steht seine E-Mailadresse auf validiert?

Fehlerbild: Keycloak login erfolgreich, Seafile zeigt die Fehlermeldung Please contact the administrator
In diesem Fall scheint die Authentifizierung in Keycloak erfolgreich gewesen zu sein und der Browser wurde zurück zu Seafile geleitet. Dort ist aber ein Fehler aufgetreten, der von der Fehlermeldung nicht weiter spezifiziert wird. Das kann daran liegen, dass der OAUTH_SCOPE oder die OAUTH_ATTRIBUTE_MAP falsch ist. Es kann aber auch daran liegen, dass in der seahub_settings.py eventuell die Anlage von neuen Usern unterbunden wird. Zur Sicherheit sollte man die Werte ACTIVATE_AFTER_REGISTRATION = True und ENABLE_SIGNUP = True setzen und Seafile neu starten. Ansonsten lohnt sich ein Blick in die seahub_settings.py um weitere Hinweise auf den Fehler zu erhalten.

Seafile und Keycloak für Single Sign-On

Single Sign-On in Seafile im Zusammenspiel mit Keycloak ist nicht schwer einzurichten. Wenn man keine Fehler macht und sowohl Seafile als auch Keycloak zur Verfügung stehen, ist die Arbeit in weniger als 15 Minuten erledigt. Die Anwender werden dafür mit dem Komfort einer zentralen und einmaligen Anmeldung belohnt. Ich wünsche viel Spaß beim Ausprobieren.