Authentik – sso.software2eu.de – Docker-Setup

Wozu Authentik?

Authentik ist ein zentrales Single Sign-On (SSO) System — quasi der „Türsteher“ für alle Anwendungen. Da es eine gute Ergänzung zu unserem Portfolio ist, habe ich mich damit etwas asusführlicher beschäftigt und für unser Web-Applikationen ein „Singel Sign On“ Umgebung aufgebaut.
Somit sind folgende System über SSO und Multifakrot Login geschützt und aus dem Internet heraus erreichbar:

  • VergeIO – Hypervisor mit unseren zentralen Systemdiensten
  • Proxmox – Spielwiese und RDP-Sessionhosts
  • Parallels RAS VDI
  • Apporto VFI
  • Appsaanywhere

Ganz besonder schick empfinde ich die VDI Lösung mit Apport NEXTGEN, da man im Browser auf 3 Monitoren auf dem RDP Gerät in der Firma arbeiten kann und das lästige Eintunnel VIA VPN komplett entfällt. Man arbeitet trotzdem SSO und MFA geschützt verschlüsselt auf dem gewohnt Desktop über den lokalen Browser. Egal, welches Betriebssystem das eigene Gerät hat,

Einfach erklärt:

Statt dass sich unsere Mitarbeiter bei jeder einzelnen Anwendung (z.B. Nextcloud, GitLab, Jira, Odoo, WordPress, etc.) separat anmelden müssen, melden sie sich nur einmal bei Authentik an — und können dann auf alle verbundenen Anwendungen zugreifen.

Konkrete Vorteile:

  • Ein Login für alle Tools (Single Sign-On)
  • Zentrale Benutzerverwaltung (z.B. mit Active Directory, LDAP, oder lokal)
  • Sicherere Authentifizierung (z.B. mit 2FA, Passkeys, etc.)
  • Einfache Berechtigungsvergabe (wer darf welche App nutzen?)
  • Audit-Log: Wer hat sich wann wo angemeldet?
  • Moderne Alternative zu Keycloak, Zitadel oder Azure AD

1. Allgemeine Übersicht

  • Anwendung: Authentik (Open Source Identity Provider)
  • Zweck: Zentrales Single Sign-On (SSO) für verschiedene Anwendungen
  • Betrieb: Hinter KEMP Load Balancer mit SSL Acceleration
  • Domain: https://sso.software2eu.de

2. Technische Architektur

EbeneKomponenteDetails
Load BalancerKEMPSSL-Offloading, Header-Modifikation
Application ServerAuthentik Server + WorkerDocker Compose
DatenbankPostgreSQL 16Alpine Image
SpeicherDocker Volumes./data, PostgreSQL Volume

3. Aktueller Container-Status

sudo docker compose ps
  • authentik-postgresql-1 → Healthy
  • authentik-server-1 → Healthy (Ports 9000 + 9443)
  • authentik-worker-1 → Healthy

4. Wichtige Konfiguration (Authentik)

Verzeichnisstruktur

Das Projekt liegt unter /opt/authentik.

  • /opt/authentik/docker-compose.yml (Service-Definition)
  • /opt/authentik/.env (Umgebungsvariablen & Secrets)
  • /opt/authentik/data/ (Persistente Daten)
  • /opt/authentik/custom-templates/ (Anpassungen)

Datei: /opt/authentik/.env

PG_PASS=[NEUES_STARKES_PASSWORT]
AUTHENTIK_SECRET_KEY=[NEUER_ZUFÄLLIGER_KEY]
AUTHENTIK_EXTERNAL_URL=https://sso.software2eu.de
AUTHENTIK_EXTERNAL_URL=https://sso.software2eu.de
AUTHENTIK_HOST=https://sso.software2eu.de
AUTHENTIK_BASE_URL=https://sso.software2eu.de
AUTHENTIK_ERROR_REPORTING__ENABLED=false

Wichtige Einstellungen in docker-compose.yml (server & worker):

Das Setup verwendet drei Services:

  1. postgresql: Datenbank für Benutzerdaten und Konfigurationen.
  2. server: Die Hauptanwendung (User-Interface & API).
  3. worker: Hintergrundprozesse (OIDC-Sync, Aufgaben).
# environment:
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?secret key required}
AUTHENTIK_DEFAULT_LANGUAGE: en
AUTHENTIK_HOST: "https://sso.software2eu.de"
AUTHENTIK_TRUSTED_PROXIES: "192.168.111.4"
AUTHENTIK_EXTERNAL_URL: "https://sso.software2eu.de"

# Proxy-Konfiguration für KEMP
XForwardedFor	Add Header	 	X-Forwarded-For	 	%a
XForwardedHost	Add Header	 	X-Forwarded-Host	sso.software2eu.de
XForwardedProto	Add Header	 	X-Forwarded-Proto	https

5. KEMP Load Balancer Konfiguration

5.1 Übersicht

  • Dienstname: from sso.software2eu.de_443
  • Virtueller Port: 443
  • Protokoll: TCP

5.2 Header-Regeln (Traffic-Weitergabe)

Um die korrekte Kommunikation zwischen LoadMaster und dem Authentik-Backend zu gewährleisten, werden folgende Header-Regeln in den Content-rules angelegt und im Service angewendet:

  • X-Forwarded-Proto: Wird auf https gesetzt.
  • X-Forwarded-Host: Wird auf sso.software2eu.de gesetzt.
  • X-Forwarded-For: Übergibt die Client-IP-Adresse (%a) an das Backend.
ReihenfolgeHeader NameWertTypBemerkung
1X-Forwarded-ProtohttpsAdd HeaderSehr wichtig
2X-Forwarded-Hostsso.software2eu.deAdd HeaderKritisch für Authentik
3X-Forwarded-For%aAdd HeaderClient-IP

5.3 Virtueller Dienst (VIP) Konfiguration

Der virtuelle Dienst verwendet SSL-Beschleunigung (sslaccel) und ist für Layer-7-Traffic optimiert (forcel7).

  • SSL/TLS: Unterstützt tlstype 3 mit dem Standard-Cipher-Set (cipherset "Default").
  • Persistenz/Timeout: Das Timeout ist auf 3600 Sekunden eingestellt.
  • Load Balancing: Es wird ein Round-Robin-Verfahren (schedule "rr") verwendet.
  • Regel-Integration: Die unter Punkt 2 genannten Header-Regeln sind aktiv dem Dienst zugeordnet (addhrule).

5.4 Real Server Konfiguration

  • Server: s2kirsaml01.software2eu.de_9000
  • Typ: HTTP-Modus
  • Healthcheck: Es ist ein HTTP-basierter Healthcheck konfiguriert.
  • Netzwerk: Subnet-Origin (subnetorig) ist aktiviert.

Diese Konfiguration stellt sicher, dass der Kemp LoadMaster als transparenter Proxy für den Authentik-Service fungiert, indem er SSL terminiert und die für die Authentifizierung notwendigen Client-Informationen in den HTTP-Headern weiterreicht.

6. Authentik Konfiguration

6.1 Active Directory vorbereiten

Service Account anlegen

Öffne Active Directory Users and Computers auf dem Domain Controller und erstelle einen neuen Benutzer, z.B.:

  • Username: svcauthentik
  • Passwort: Sicheres Passwort, „Passwort läuft nie ab“ aktivieren
  • Kein interaktiver Login notwendig

Gib dem Account folgende Rechte (minimale Berechtigungen reichen):

  • Read auf die relevanten OUs
  • Replicate Directory Changes (für Passwort-Sync optional)

6.2 LDAP Source in Authentik konfigurieren

Da die UPN mit der E-Mailadresse befüllt ist, wird in → Customization → Property Mapping ein neues Property Mapping erstellt um die E-Mailadresse in Authentik zu befüllen.

Mapping Type = LDAP Source Property Mapping
Mapping Name= AD UPN to Email
Expression = return {
„email“: ldap.get(„userPrincipalName“)
}

Dadurch wird in der User-Verwaltung die E-Mailadresse gesetzt.

Als nächstes wird die LDAP Source angelegt → Directory → Federation & Social Login → Create → LDAP Source wählen.

Unter Choose Source Type wird „LDAP Source“ gewählt.

Folgende Werte für software2eu.de eintragen:

FeldWert
NameSoftware2-AD-LDAP
Slugldap
EnabledYES
Update internal passowrd on loginYES
Sync usersYES
User password writebackNO
Sync groupsYES
Delete Not Found ObjectsNO
Server URIldaps://dc01.software2eu.de,ldaps://dc02.software2eu.de
Bind CNCN=svcauthentik,OU=Authentik,DC=software2eu,DC=de
Bind PasswordPasswort des Service Accounts
Base DNDC=software2eu,DC=de
User Property MappingAD UON to Email
Alle „authentik default LDAP“
Alle „authentik default Active Directory“
Group Property Mappingsauthentik default LDAP Mapping:Name
User path%(slug)s
User object filter(&(objectClass=user)(!(objectClass=computer)))
Group object filter(objectClass=group)
Group membership fieldmemberOf
User Memvership attributedistinguishedName
Object uniqueness fieldobjectSid
Outgoing sync trigger modeDeferred until end

Ab diesem Zeitpunkt kann man sich über den LDAP User an Authentik anmelden.

6.4 Stage für Erstellung eines MFA erstellen.

Unter → Flows and Stages → Stages wird ein neuer Stage für die Erstellung eines MFA erstellt sollte keiner vorhanden sein.

Neuer Stage mit dem Stage Type „TOTP Authenticator Setup Stage“.
Name = MFA Authenticator App
Authenticator type name = MFA Authenticator App
Digits = 6 digits, widely compatible

6.3 Flows konfigurieren

Ich verwende den vordefinierten default-source-authentication Flow und ändere ihn ab. Ich bennen ihn Willkomen bei Software2! und stelle den slug auf „willkommen“.

Unter den Stage Bindings wird Order=30 abgeändert um die MFA Erstellung zu initiieren, wenn keiner vorhanden ist. Mit Edit Stage beginnt die Konfiguration

Stage Name = TOTP Authenticators
Device Classes = TOTP Authenticators
Last validation tresgold = seconds=0
Not cnfigured action = Force the user to configure an authenticator.
Condigure stages = MFA Authenticator App