In der Wunschliste wurde ein Tutorial für authentik gewünscht. Ich habe bei mir auf dem Server schon mit Authelia experimentiert. Parallel dazu wollte ich auch mit authentik experimentieren und habe mich des Themas angenommen. Die Dokumentation von authentik ist zwar super (damit konnte ich dann ohne Probleme später das Benutzer- und Gruppenmanagement regeln), aber bei der Integration in mein traefik-Setup bin ich mit der offiziellen Dokumentation gescheitert. Nach einer Google-Recherche bin ich dann auf die Seite von IBRACORP gestoßen. Die dortige Anleitung hat dann zusammen mit meinem traefik-Wissen aus dem traefik-Setup-Beitrag hier sowie der offiziellen Dokumentation zum Erfolg geführt.
Die Erstveröffentlichung dieser Anleitung ist auf meiner Webseite erfolgt. Hier ist eine leicht überarbeitete, zusammengefasste Version.
0. Versionierung
Datum | Änderung |
---|---|
26.06.2023 | Initiales Release |
1. Voraussetzungen
- Docker mit Docker Compose installiert (Anleitung für Ubuntu / Debian)
- Traefik installiert (Anleitung)
2. Authentik im Stack vorbereiten
2.1. DOTENV Konfiguration
Nachfolgend die ersten Schritte:
mkdir -p /opt/containers/authentik/{certs,custom-templates,media} && cd /opt/containers/authentik sudo apt install -y pwgen echo "PG_PASS=$(pwgen -s 40 1)" >> .env echo "AUTHENTIK_SECRET_KEY=$(pwgen -s 50 1)" >> .env echo "AUTHENTIK_ERROR_REPORTING__ENABLED=true" >> .env
Zusätzlich habe ich noch meinen STMP-Server dem .env File zugefügt:
AUTHENTIK_PORT_HTTP=9000 AUTHENTIK_PORT_HTTPS=9443 # SMTP Host Emails are sent to AUTHENTIK_EMAIL__HOST=localhost AUTHENTIK_EMAIL__PORT=25 # Optionally authenticate (don't add quotation marks to your password) AUTHENTIK_EMAIL__USERNAME= AUTHENTIK_EMAIL__PASSWORD= # Use StartTLS AUTHENTIK_EMAIL__USE_TLS=false # Use SSL AUTHENTIK_EMAIL__USE_SSL=false AUTHENTIK_EMAIL__TIMEOUT=10 # Email address authentik will send from, should have a correct @domain AUTHENTIK_EMAIL__FROM=authentik@localhost
2.2. docker-compose.yml
Als nächstes folgt die docker-compose.yml Datei:
nano docker-compose.yml
version: '3.4' services: postgresql: image: postgres:15-alpine restart: unless-stopped container_name: authentik-postgres healthcheck: test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"] start_period: 20s interval: 30s retries: 5 timeout: 5s volumes: - database:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=${PG_PASS} - POSTGRES_USER=${PG_USER:-authentik} - POSTGRES_DB=${PG_DB:-authentik} env_file: - .env networks: - default redis: image: redis:alpine restart: unless-stopped container_name: authentik-redis healthcheck: test: ["CMD-SHELL", "redis-cli ping | grep PONG"] start_period: 20s interval: 30s retries: 5 timeout: 3s networks: - default server: image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2023.5.4} restart: unless-stopped container_name: authentik-server command: server environment: AUTHENTIK_REDIS__HOST: authentik-redis AUTHENTIK_POSTGRESQL__HOST: authentik-postgres AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik} AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik} AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS} volumes: - ./media:/media - ./custom-templates:/templates env_file: - .env ports: - "0.0.0.0:${AUTHENTIK_PORT_HTTP:-9000}:9000" - "0.0.0.0:${AUTHENTIK_PORT_HTTPS:-9443}:9443" networks: - proxy - default labels: traefik.enable: true traefik.http.routers.authentik.entryPoints: websecure traefik.http.routers.authentik.rule: Host(`auth.deine-domain.de`) || HostRegexp(`{subdomain:[A-Za-z0-9](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?}.deine-domain.de`) && PathPrefix(`/outpost.goauthentik.io/`) traefik.http.routers.authentik.tls: true traefik.http.routers.authentik.tls.certresolver: http_resolver traefik.http.routers.authentik.service: authentik traefik.http.services.authentik.loadbalancer.server.port: 9000 traefik.docker.network: proxy worker: image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2023.5.4} restart: unless-stopped container_name: authentik-worker command: worker environment: AUTHENTIK_REDIS__HOST: authentik-redis AUTHENTIK_POSTGRESQL__HOST: authentik-postgres AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik} AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik} AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS} user: root volumes: - ./media:/media - ./certs:/certs - /var/run/docker.sock:/var/run/docker.sock - ./custom-templates:/templates env_file: - .env networks: - default volumes: database: driver: local networks: proxy: external: true
Notwendige Änderungen:
- Hier müsst ihr noch 2x eure Domaine ändern (traefik.http.routers.authentik.rule)
Aktuell habe ich fast alles der Docker-Compose-Datei von IBRACORP übernommen. Ich habe nur die weiteren traefik-Label hinzugefügt, damit die Seite https://auth.deine-domain.de auch sauber via traefik geroutet wird. Ohne diese Teile hat das bei mir, warum auch immer, nicht funktioniert.
Zusätzlich habe ich noch die Versionen für den authentik-worker und den authentik-server auf die (Stand heute, 26.06.2023) aktuelle Version 2023.5.4 abgehoben. Die PostgreSQL Datenbank habe ich ebenfalls auf die neuste Version 15 aktualisiert.
Und ich habe nur dem authentik-server den Zugriff auf das proxy-Netzwerk gestattet. Alle anderen Services haben das Default-Netzwerk erhalten.
3. Stack starten
Nachdem nun alles vorbereitet ist, wird alles mit docker compose up -d
gestartet.
docker compose up -d
Nachdem die Container sauber gestartet sind, kann das initiale Setup im Browser fortgesetzt werden: https://auth.deine-domain.de/if/flow/initial-setup
.
4. authentik konfigurieren
4.1. Provider
Da zwischen Application und Provider immer eine 1-zu-1 Beziehung besteht, brauchen wir für unsere Anwendung (hier im Beispiel wird es das Traefik-Dashboard) entsprechend zunächst einen Traefik-Provider (Seit der Version 2023.5 gehen wohl auch 1-zu-N Beziehungen, aber damit habe ich mich noch nicht beschäftigt).
Nachdem wir nun als Admin im authentik-Backend angemeldet sind, legen wir als erstes einen neuen Provider an: Applications => Provider => Create => Proxy Provider
Als Namen habe ich Traefik Dashboard ForwardAuth
gewählt. Den Authentifizierungsablauf habe ich leer gelassen. Beim Autorisierungsablauf habe ich default-provider-authorization-explicit-consent
ausgewählt.
Im zweiten Teil der Konfiguration habe ich Forward Auth (einzelne Anwendung)
ausgewählt. Als externer Host dient hier zu Testzwecken das traefik-Dashboard: https://traefik.deine-domain.de
.
Weitere Einstellungen habe ich hier aktuell nicht vorgenommen und mit einem Klick auf Erstellen den neuen Provider erstellt.
4.2. Applications
Im Anschluss habe ich eine neue Application erstellt: Anwendungen => Anwendungen => Erstellen
Als Name habe ich hier Traefik Dashboard
gewählt. Als Provider (Schnittstellen) den zuvor erstellten Forward Auth Provider
.
4.3. Outposts
Last but not least musste ich dann noch unter Anwendungen => Outposts den vorhandenen Embedded Outpost bearbeiten.
Die Integration habe ich auf Local Docker connection gestellt und bei den Anwendungen habe ich die neu erstellte Anwendung Traefik Dashboard markiert.
Zusätzlich muss noch das docker_network
in der Konfiguration von null
auf proxy
geändert werden!
Den Outpost noch flugs mit einem Klick auf aktualisieren gespeichert und damit ist die Konfiguration im authentik-Backend soweit fertig.
5. traefik anpassen
Als nächster Schritt müssen wir eine neue Middleware für traefik anlegen. Hierzu wird die vorhandene Datei traefik-crowdsec-stack/traefik/dynamic_conf.yml
um folgenden Inhalt ergänzt (analog zum vorhanden traefikAuth-Block, unterhalb eben jenes Blockes):
nano /opt/containers/traefik-crowdsec-stack/traefik/dynamic_conf.yml
authentik: forwardauth: address: http://authentik-server:9000/outpost.goauthentik.io/auth/traefik trustForwardHeader: true authResponseHeaders: - X-authentik-username - X-authentik-groups - X-authentik-email - X-authentik-name - X-authentik-uid - X-authentik-jwt - X-authentik-meta-jwks - X-authentik-meta-outpost - X-authentik-meta-provider - X-authentik-meta-app - X-authentik-meta-version
Als letzten Konfigurationsschritt wird nun die traefikAuth Middleware durch die authentik Middleware in der Datei traefik-crowdsec-stack/docker-compose.yml
verändert:
nano /opt/containers/traefik-crowdsec-stack/docker-compose.yml
Vorher: traefik.http.routers.traefik.middlewares: default@file,traefikAuth@file Nachher: traefik.http.routers.traefik.middlewares: default@file,authentik@file
Nun noch abschließend traefik mit docker compose up -d --force-recreate
neu starten
docker compose -f /opt/containers/traefik-crowdsec-stack/docker-compose.yml up -d --force-recreate
und anschließen auf https://traefik.deine-domain.de
wechseln. Wenn bis hier nichts schief gegangen ist, wird man nun zunächst auf die Loginseite von authentik geleitet und erst nach dem Login auf das Dashboard zurückgeleitet.
6. Optionales
6.1. Benutzer und Gruppen
Am Beispiel eines zusätzlichen WhoAmI-Containers zeige ich noch, wie authentik für verschiedene Benutzer und Gruppen eingerichtet wird. Dazu erstelle ich für dieses Beispiel unter Directory => Users zwei neue Benutzer: traefik und whoami. Zusätzlich erstelle ich unter Directory => Groups die passenden Gruppen: traefik und whoami.
Wie ihr einen neuen WhoAmI-Container mit traefik-Anbindung anlegt, beschreibe ich jetzt mal nicht. Da gehe ich mal einfach davon aus, dass ihr das schon wisst.
Aber wir brauchen noch einen passenden WhoAmI-Provider sowie eine WhoAmI-Application. Diese werden analog wie oben im Traefik-Beispiel angelegt.
Noch weise ich keiner der beiden Applications einen Benutzer oder eine Gruppe zu. Damit müsste dann in einem Inkognito-Browser-Fenster mit beiden Benutzern der Zugriff auf beide Seiten gestattet sein.
Als nächstes schränken wir das Traefik-Dashboard und die WhoAmI-Seite für die beiden Benutzer ein. Dazu klickt Ihr unter Applications => Applications auf den Namen der jeweiligen Application und wechselt auf den Reiter Policy/Group/User Bindings.
Nach einem klick auf Create Binding wähle ich als Typ User und wähle für die jeweilige Application den passenden Benutzer.
Anschließend sollte der Benutzer whoami nur noch Zugriff auf die WhoAmI-Seite haben und der Benutzer traefik nur noch Zugriff auf das Traefik-Dashboard haben.
Als letztes testen wir die Gruppen. Zunächst weisen wir unter Directory => Users den jeweiligen Benutzern traefik und whoami die korrespondierenden Gruppen zu. Anschließend wechseln wir wieder in die Ansicht mit den Application Bindings. Dort bearbeiten wir das vorhandene Binding und stellen es auf den Typ Group mit dem passenden Gruppennamen um.
Am Zugriffsverhalten darf sich (noch) nichts geändert haben.
Wenn wir nun aber den Benutzer traefik auch noch in die Gruppe whoami stecken, darf dieser Benutzer auch die WhoAmI-Seite sehen. Umgekehrt darf der whoami-Benutzer weiterhin nicht das Traefik-Dashboard öffnen!
Zum Abschluss noch zwei wichtige Bemerkungen! Wenn Ihr hier mit User- oder Group-Bindings arbeitet, dann könnt Ihr auch Euren Admin-User vom Aufruf aussperren. Sprich, mein Admin Benutzer hat mit der obigen Konfiguration weder Zugriff auf das Traefik-Dashboard noch auf die Who-am-i-Seite. Am besten definiert Ihr Euch also für Eure Anwendungen jeweils Gruppen und weist Eurem Admin Benutzer die jeweiligen Gruppen zu und nutzt nur das Group-Binding. Damit sperrt Ihr Euch dann nicht von den einzelnen Anwendungen aus.
Und wenn Ihr zu schnell mit den Loginversuchen seit, werdet Ihr von crowdsec temporär gebannt. Also nicht zu schnell hintereinander den Login testen (oder zumindest eine Notfall-SSH-Verbindung zu Eurem Server offen haben, womit Ihr Eure IP Adresse wieder entsperren könnt).
Für alle, die wie ich an einer Integration der aktuellen Version von Authentik und Traefik scheitern …
Die Subdomain HostRegexp muss angepasst werden, siehe:
https://doc.traefik.io/traefik/master/routing/routers/#rulesyntax
Demnach also:
HostRegexp(
[A-Za-z0-9](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\\.meine-domain\\.de
)und bei der initialen Einrichtung kann es möglich sein, dass man einen Slash (‘/’) am Ende des Pfads anhängen muss, sonst wird die Einrichtungsmaske nicht gefunden.
Ansonsten tipptopp Anleitung für einen schnellen Einstieg…
Hallo,
hab jetzt bei mir auf dem Server auf die Aktuelle Version von Traefik V3 (nach der Anleitung hier) installiert und wollte jetzt Traefik wir hier in der Anleitung beschrieben mit den Schutz von Authentik ausstatten. Leider bekomme ich das irgendwie nicht hin. Authentik läuft. Wenn ich Traefik wie in den Beispiel hier konfiguriere bekommen ich im Webbrowser nur folgenden Zeilen (als JSON angezeigt)
Im Outposts wir der Eintrag zu Traefik mit einen grünen Haken angezeigt, dass die Anmeldung über https://auth.meinedomain.de erfolgen kann.
Kann es sein, das die Anleitung hier nicht 100% mit dem neuen Traefik V3 Stack kompatibel ist?
Wo kann ich ansetzen um eventuelle Fehler zu finden? Wäre klasse, wenn mir jemand helfen könnte. 😉
Hallo,
vielen Dank für die hervorragende Anleitung – das hat super geklappt. Ich war vorübergehend etwas ernüchtert, weil am die Einrichtung von Anwendungen etwas hakelig vonstatten ging, bis mir das Grundprinzip klarer wurde.
Bei mir ist folgendes Setup:
Authentik-Domain: auth.domain.de
Anwendung: anwendung.domain.de (Beispiel: proxmox.domain.de)
(Ich habe bei mir Proxmox hinter Traefik / Crowdsec gehängt – wie hier beschrieben:
https://community.traefik.io/t/proxmox-behind-traefik/9338)
Probleme bei mir:
Fehlender “/” am Ende der URI bei Proxmox / Authentik
Änderung des Slugs (proxmox in proxmox-1) beim Einrichten des 2. Proxmoxes) muss auch eine Änderung bei Proxmox nach sich ziehen.
Ich habe noch verschiedene ander Anwendungen integriert und es war nicht immer so ganz leicht, die Callback-URI. (auth.domain.de/o/application/proxmox) bei der Anwendung einzutragen. (Bei Gitea war die ganz anders:
https://auth.domain.de/application/o/gitea/.well-known/openid-configuration)
Die Felder /User-id und Scopes – also die User-id mit der ein leerer User angelegt wird, wenn es keinen gibt und die Felder, bei denen Authentik und Anwendung abgeglichen werden – Da ist jede Anwendung anders und das muss genau passen.)
Wenn Proxmox geht, dann muss man dem neuen User Rechte zuweisen. Bei mir ging die Gruppenzuordnung nicht, sondern nur der User direkt.
Dann habe ich Mail-Gateway (Proxmox) und Backup-Server (Proxmox) noch über router und Service in der dynamic_conf.yml konfiguriert. SSO habe ich da nicht gefunden.
Hallo Sternmiere,
die Anleitung ist sehr gut, konnte alles erfolgreich umsetzten.
Nun möchte eine weitere subdomain mit Authentik schützen z.B. dozzle.deine-domain.de) .Ich bin folgendermaßen vorgegangen:
Was muss ich noch machen? Muss ich in dynamic_conf.yml noch Ergänzungen vornehmen? Hab ich eine Denkfehler?
Besten Dank.
DocHofer
Hallo zusammen,
ich habe gerade ein paar Stunden damit verbracht Grafana mittels oauth über Authentik anzumelden.
Lösung war, dass Grafana die falsche lokale Domain und http übergibt. Da man es normalerweise nicht benötigt wurde es nicht definiert wie auch in der Anleitung von hier.
Mit folgenden Variablen funktioniert es dann:
environment:
GR_SERVER_PROTOCOL: “https”
GF_SERVER_DOMAIN: “grafana.domain.tld”
GF_SERVER_ROOT_URL: “https://grafana.domain.tld”
Liebe Grüße
Bei mir läuft auf meinen beiden Servern noch alles (mit Traefik und Authentik)
Hallöchen Sternmiere
Vielen Dank für die Anleitung!
Gibt es eine Möglichkeit, dass Authentik bei einer bestimmten Subdomain auch einfach weiterleitet, also ohne Login/MFA oder sonstiges?
Zu meinem Problem: Ich hab ein Joplin Server laufen, mein Client kann aber nichts synchroniesieren, weil Authentik natürlich einen Login haben will wenn der Client joplin.meinedomain.de aufruft.
Wäre schön wenn du mir da auf die Sprünge helfen könntest, bis jetzt habe ich leider noch nichts im Netz dazu gefunden…
Gruß
Hardwarelappen
Herzlichen Glückwunsch zu deiner ersten Anleitung Sternmiere 😀
Sieht richtig gut aus und klappt direkt 😃