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 OAuth. In der Professional Edition sind dann noch zusätzlich ADFS, SAML 2.0 und CAS enthalten. 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 OpenSource 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.

Neben seiner Einfachheit besticht Keycloak durch einen beeindruckenden Funktionsumfang mit dem auch komplexe Business-Szenarien abgedeckt werden können. Keycloak unterstützt nicht nur die Protokolle SAML und OpenID Connect sondern ist auch kompatibel mit anderen Identity Providern oder 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 Directory als Basis für die Nutzerinformationen zu verwenden. So übernimmt Keycloak dank User Federation den zentralisierte Login während die zentrale Benutzerverwaltung in LDAP oder Active Directory erfolgt.

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

Wie alles beginnt

Im Folgenden gehe ich davon aus, dass die folgenen System installiert und die nachfolgenden Voraussetzungen erfüllt sind:

Wenn dies alles gegeben ist, kann es losgehen.

Registrierung von Seafile als neuer Client in Keycloak

In Keycloak wählt man zuerst den Bereich “Clients” im Hauptmenü aus. Im Hauptfenster werden nun die aktuell existierenden Clients angezeigt.

Existierende Clients in Keycloak

Hier muss nun Seafile als neuer Client angelegt werden. Ein Klick auf “Create” führt zu einem ersten Eingabeformular in dem die Client-ID, das Protokoll und die Root-URL des neuen Clients festgelegt werden muss. Die Client-ID darf einen beschreibenden Namen wie z.B. Seafile haben. Als Client-Protokoll wählt man openid-connect und im Eingabefeld der Root-URL trägt man die URL des existierenden Seafile-Systems ein.

Neuen Client in Keycloak hinzufügen

Nach einem Klick auf Save wird der neue Client angelegt und man gelangt zu den Details. Über Tabs sind die möglichen Konfigurationseinstellungen gegliedert und erlauben eine einfache und schnelle Anpassung des neuen Seafile-Clients in Keycloak.

Konfiguration des neuen Keycloak Clients

Auf der ersten Seite müssen ein paar Einstellungen vorgenommen werden:

Das waren bereits alle notwendigen Einstellungen in Keycloak. Als nächstes wechselt man zum Tab Credentials und speichert sich das Secret in die Zwischenablage. Wir werden diesen Wert im nächsten Schritt bei der Konfiguration von Seafile benötigen.

Auslesen der Zugangsdaten für den Client

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. Hierfür klickt man links auf Users und erzeugt dann einen neuen Anwender.

Ein neuer Anwender wird in Keycloak angelegt

Im Tab Credentials muss noch ein Passwort für diesen User gesetzt werden.

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 Seafile-Video habe ich gezeigt, welche Anpassungen man für Microsoft Azure bzw. Office365 machen muss. 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 man den Seafile-Client in Keycloak nicht im master sondern in einem anderen Realm erzeugt hat, muss 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 man jetzt den Seafile Login aufruft, wird unterhalb der Eingabefelder ein neuer Link Single Sign-On angezeigt. Wenn man diesen Link klickt, wird man zur Anmeldeseite von Keycloak umgeleitet.

Anmeldeseite von Keycloak

Auf dieser Login-Seite gibt der Anwender nun seine Zugangsdaten ein bzw. man testet diesen Login mit dem eben in Keycloak erzeugen 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.