SSO im Homelab / self-hosted

  • Hallo zusammen,

    ich wollte das erst im "längsten Thema" ansprechen, dachte mir aber, dass es dort evtl. etwas untergeht und durchaus ein eigenes Thema verdient hätte (schon alleine wegen der Länge). Im Grunde geht es um die ganze SSO Thematik bei selbst gehosteten Services (z.B. Gitea, Nextcloud, Wikijs, ...). Jetzt speziell im privaten oder Vereinsumfeld. Im geschäftlichen Umfeld kommt man ja meist sowieso an Microsoft AD nicht vorbei. Aber auch für den kleineren Bereich gibt es ja einige vielversprechende Lösung wie

    * Authelia (Simpel, aber schlecht skalierbar, da alles über ein großes YAML File konfiguriert wird)
    * Authentik (Vielversprechend, komplex, hat aber einige Probleme zu denen ich später noch komme)
    * Keycloak (Sehr komplex, eher für das Enterprise Umfeld geeignet, schwierige Updates)

    * Zitadel (neu, weniger Features, schwierige Installation)

    Das Protokoll, was man aktuell wohl einsetzen will, ist OpenID Connect (kurz OIDC), das auf OAuth 2.0 aufbaut. Ähnlich zu SAML, was aber durch die XML Struktur sehr komplex ist und daher schwierig is zu implementieren.

    Was mich jetzt mal interessieren würde: Hat es jemand schon geschafft das wirklich zufriedenstellend zu implementieren? Mich beschäftigt dieses Thema schon so lange, baue mir immer wieder einen PoC, den ich aber immer wieder verwerfe, da ich wiederholt mit den gleichen Problemen zu kämpfen habe, für die ich einfach keine Lösung finde.

    1. User bleiben nicht eingeloggt

    Dieses Problem beschäftigt mich vor allem mit Gitea. Das ist im Grunde einer meiner wichtigsten App. Die Integration des OIDC Providers funktioniert im Grunde problemlos. Einmal konfiguriert, können sich User dort anmelden und beim ersten Mal einen bestehende Account verknüpfen (falls vorhanden) oder einen neuen erstellen. Während aber lokale User mit einem Cookie eingeloggt bleiben, werden für OIDC User keine Cookies gesetzt. Sprich diese User müssen sich mit jeder Session neu anmelden. Das ist in der Praxis natürlich sehr nervig. Das passiert mit anderen Apps zum Teil auch, aber oft haben die einen automatischen Redirect zum OIDC Provider und der Login wird automatisch vollzogen. In Gitea muss man z.B. erst auf "Anmelden" klicken, dann auf den Provider und wird anschließend erst wieder eingeloggt.

    Link zum Gitea Issue: https://github.com/go-gitea/gitea/issues/28394

    2. User bleiben eingeloggt

    Das zweite Problem beschreibt im Grunde genau das Gegenteil. Das beobachte ich bei allen Apps, bei denen das mit dem Cookie klappt und User in der App eingeloggt bleiben, nachdem sie sich einmal erfolgreich am OIDC Provider authentifiziert habe. Und zwar bleiben die User auch dann noch eingeloggt, wenn diese sich aus dem eigentlichen OIDC Provider oder aus einer anderen Apps ausgeloggt haben. Entsprechend bleiben diese User auch dann noch eingeloggt, wenn der User sogar im zentralen OIDC Provider gesperrt oder gelöscht wurde. Das stellt aus meiner Sicht ein klares Sicherheitsrisiko da. Als Beispiel verlinkte ich da mal ein Issue bei Authentik:

    Link zum Authentik Issue: https://github.com/goauthentik/authentik/issues/2023


    Jetzt bin ich mal sehr gespannt auf eure Erfahrungen mit dem Thema. Gerade was die zwei genannten Probleme betrifft, die mich wirklich davon abhalten, dass ich das produktiv einsetzen kann. Ich vermute ja fast, dass an dem OIDC Protokoll an sich liegen könnte. Wie macht ihr das?

    Gruß
    Paul

  • 2. User bleiben eingeloggt

    Das zweite Problem beschreibt im Grunde genau das Gegenteil. Das beobachte ich bei allen Apps, bei denen das mit dem Cookie klappt und User in der App eingeloggt bleiben, nachdem sie sich einmal erfolgreich am OIDC Provider authentifiziert habe. Und zwar bleiben die User auch dann noch eingeloggt, wenn diese sich aus dem eigentlichen OIDC Provider oder aus einer anderen Apps ausgeloggt haben. Entsprechend bleiben diese User auch dann noch eingeloggt, wenn der User sogar im zentralen OIDC Provider gesperrt oder gelöscht wurde. Das stellt aus meiner Sicht ein klares Sicherheitsrisiko da.

    So sind die Dienste aber aufgebaut, ich erstelle einen signierten Token unter einer bestimmten Domain (an die ich nicht mehr herankomme) - dieser Token hat eine gewisse Gültigkeit und kann nicht revoked werden.

    Wenn das störend ist, kann die Dauer des Access Tokens reduziert werden, und stattdessen über den Refresh Token kontrolliert werden, wenn die Tokens ihr Gültigkeit verlieren sollen. Das ausstellende Portal sollte hierfür Einstellungsmöglichkeiten haben (z.B. Token Lifetime 5 Minuten).

    Mit Gitea habe ich bisher auf LDAP gesetzt.

    OAuth hängt leider immer von der Implementation ab, wie gut oder schlecht das dann funktioniert.

  • Wenn das störend ist, kann die Dauer des Access Tokens reduziert werden, und stattdessen über den Refresh Token kontrolliert werden, wenn die Tokens ihr Gültigkeit verlieren sollen. Das ausstellende Portal sollte hierfür Einstellungsmöglichkeiten haben (z.B. Token Lifetime 5 Minuten).

    Danke. Ich glaube, das ist auch mein Problem damit. Die Apps ignorieren die Token Lifetime einfach. Innerhalb dieser Litetime würde ich es voll verstehen und das wäre auch mein gewünschtes Verhalten. Aber das die Token Lifetime keinen Einfluss auf die Login Dauer hat, stört mich etwas.


  • * Authelia (Simpel, aber schlecht skalierbar, da alles über ein großes YAML File konfiguriert wird)

    Ich kann Dir nur wärmstens die Kombination aus Authelia und lldap empfehlen. Du kannst Authelia und gitea/forgejo dann gegen LDAP authentifizieren lassen, und musst nur für die Applikationen, die kein LDAP können, zu OIDC via Authelia greifen.

  • Das ist ja auch okay, solange mit dem Refresh Token dann ein neuer Access Token beantragt wird.

    Ich hatte zum Test auch mal die Refresh Token Lifetime auf 5 Minuten reduziert und die Access Token Lifetime auf 2 Minuten. Trotzdem bin ich Tage später immer noch eingeloggt. Ich muss aber auch zugegeben, dass mir hier etwas die Motivation fehlt, hier intensiver zu debuggen. Wenn ich mal Zeit habe, werde ich das machen. Aber das Eingeloggt bleiben stört mich jetzt auch weniger als das Problem mit dem fehlenden Cookie bei Gitea. Hier werde ich mal weitere Tests mit LDAP unternehmen.

  • Oft nutzen die Apps nur den Token für den Initialen Login und nutzen dann ihre eigene Session unabhängig vom Auth-Provider. Das führt dann zum von dir beschriebenen Verhalten.

    Das passiert dir potentiell auch bei LDAP - nachdem die Anwendungssession offen ist wird nicht unbedingt nochmal geprüft ob der LDAP-User noch existiert...

    Einzige mir bekannte Lösung wäre die Session der Anwendung so kurz zu halten, dass der OIDC-Prozess entsprechend oft gestartet wird. Ggf. lässt sich das ja auf wenige Stunden begrenzen - zumindest besser als mehrere Tage!

    serverkueche.de - praxisnahe Selfhosting-Tutorials, getestet auf Netcup-Servern

    Einmal editiert, zuletzt von tldev (10. November 2024 um 13:07)