Single Sign On für dein Homelab!
Übersicht
Wir schauen uns heute an, wie wir in unserem Homelab Single Sign On nutzen können. Single Sign On gibt uns die Möglichkeit uns mit einem Account an sämtlichen Anwendungen zu authentifizieren.
Hierfür nutzen wir das Tool Authentik. Authentik ist ein Service, welcher das hosten eines lokalen Identity Providers (IdP
) für Single Sign On (SSO
) ermöglicht.
Das passende Video findet ihr hier: https://youtu.be/e5YUBqsGFgs
Installation
Authentik betreiben wir mit Docker Compose.
Docker Compose
Als erstes laden wir uns die aktuellste docker-compose.yml
Datei von Authentik herunter.
https://goauthentik.io/docker-compose.yml
Anschließend passen wir die compose Datei auf unsere Bedürfnisse an. In meinem Fall möchte ich Authentik später über meinen Nginx Proxy Manager mit einer gültigen Domain erreichen. Daher nehme ich hier wieder die entsprechende Konfiguration vor und entferne die Ports, gebe den Containern einen Namen und füge Docker Netzwerke hinzu. (Genaueres dazu im Video)
Die Fertige Compose sieht so aus.
services:
postgresql:
image: docker.io/library/postgres:16-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
networks:
- authentik-internal
volumes:
- database:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: ${PG_PASS:?database password required}
POSTGRES_USER: ${PG_USER:-authentik}
POSTGRES_DB: ${PG_DB:-authentik}
env_file:
- .env
redis:
image: docker.io/library/redis:alpine
command: --save 60 1 --loglevel warning
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:
- authentik-internal
volumes:
- redis:/data
server:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2024.8.3}
restart: unless-stopped
command: server
container_name: authentik-server
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
networks:
- reverse-proxy
- authentik-internal
volumes:
- ./media:/media
- ./custom-templates:/templates
env_file:
- .env
#ports:
# - ${COMPOSE_PORT_HTTP:-9000}:9000
# - ${COMPOSE_PORT_HTTPS:-9443}:9443
depends_on:
- postgresql
- redis
worker:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2024.8.3}
restart: unless-stopped
command: worker
container_name: authentik-worker
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
# `user: root` and the docker socket volume are optional.
# See more for the docker socket integration here:
# https://goauthentik.io/docs/outposts/integrations/docker
# Removing `user: root` also prevents the worker from fixing the permissions
# on the mounted folders, so when removing this make sure the folders have the correct UID/GID
# (1000:1000 by default)
user: root
networks:
- authentik-internal
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./media:/media
- ./certs:/certs
- ./custom-templates:/templates
env_file:
- .env
depends_on:
- postgresql
- redis
volumes:
database:
driver: local
redis:
driver: local
networks:
authentik-internal: null #for internal communication between containers
reverse-proxy:
external: true
.env File
Wie wir in der Docker Compose Datei schon erkennen haben wir einige Variablen, die wir jetzt noch in unsere .env
Datei schreiben.
Für das Passwort und für den Authentik Secret Key gibt es die Möglichkeit, diese per openssl
Befehl generieren zu lassen. Ihr braucht diese an keiner späteren Stelle und müsst euch auch nichts merken, daher empfehle ich das generieren.
PG_PASS="<generate pass>" #openssl rand -base64 36 | tr -d '\n'
PG_USER="authentik-user"
PG_DB="authentik-db"
AUTHENTIK_SECRET_KEY="<generate secret key>" #openssl rand -base64 60 | tr -d '\n'
Docker Up
Das war auch schon alles, was für das Compose Projekt getan werden muss. Je nachdem könnt ihr die Container jetzt über Dockge oder direkt auf dem Host starten.
Zertifikat & Domain
Wir wollen unsere Instanz nun über unsere lokal genutzte Domain erreichen. Hierfür haben wir dem Server-Container das reverse-proxy
Netzwerk mitgegeben. Das ermöglicht uns nun den Zugriff über unseren Proxy Manager. Alles was wir dafür tun müssen, ist ein neuer Eintrag mit dem Containernamen und dem passenden Port + das Zuweisen des Zertifikats.
Initiales Setup
Die Container brauchen einen Moment beim ersten Start. Sobald alle Container laufen können wir weitermachen mit der Ersteinrichtung von Authentik.
Dafür navigieren wir zu unserer neuen Subdomain und fügen den Pfad für das initiale Setup mit an.
https://<authentik.example.de>/if/flow/initial-setup/
In meinem Fall lautet die ganze URL wie folgt:
https://authentik.home.juseclab.de/if/flow/initial-setup/
Dort angekommen können wir uns ein Passwort für den Admin-Account vergeben.
Fertig! Wir haben nun Zugang zu Authentik und sind mit der Initialen Einrichtung auch schon durch.
Benutzer & Gruppen
Aktuell sind wir der User akadmin
. Dies ist der Default-Account der erstellt wird inklusive allen Admin Rechten. Wir können uns jetzt überlegen, ob wir den Account auf unseren gewünschten Namen umbenennen und nutzen wollen oder eine weiteren Account mit ggf. weniger Rechten für die produktive Nutzung erstellen.
Einen Neuen Benutzer erstellen oder den aktuellen anpassen können wir in der Adminoberfläche unter
Verzeichnis → Benutzer
Desweiterem können auch Gruppen erstellt werden, die ihr später auf entsprechende Anwendungen Berechtigen könnt etc. Hier muss jeder für sich das passende zusammenbauen.
Egal was für ein Account es am ende wird, empfehle ich euch, richtet euch auf jeden Fall einen 2 Faktor ein!
Application & Provider
Nun geht es zum eigentlichen Feature von Authentik. Eine Authentifizierung an einem Dienst per SSO über Authentik, besteht immer aus einer Application und einem Provider. Das ganze klingt Komplizierter als es ist.
Um es besser zu verstehen, richten wir Beispielhaft unsere erste Anwendung gemeinsam ein, Proxmox!
Beispiel Anwendung - Proxmox
Provider
Um uns an unserem Proxmox Host über Authentik anmelden zu können, erstellen wir als erstes einen Provider
(Anbieter).
Dafür Navigieren wir in der Adminoberfläche zu Andwendung → Anbieter
und klicken auf Erstellen.
Wir haben hier eine große Auswahl, allerdings wird in den meisten Fällen die Wahl auf OAuth2/OpenID
Fallen, wie auch in diesem Fall.
Wenn wir auf Weiter Klicken müssen wir nun ein paar Felder ausfüllen.
Felder | Beschreibung |
---|---|
Name | Hier vergebt ihr einen Namen für den “Provider” |
Authentifizierungsablauf | Hier reicht der |
Autorisierungsablauf | Ihr habt hier die Wahl ob Nutzungsbestimmungen angezeigt werden sollen. Da wir das ganze im privaten Umfeld nutzen, vermutlich nicht, also wählt ihr |
Redirect/URIs/Origins | die URL eures Proxmox Hosts. in meinem Fall |
Den Rest belasst ihr so wie er ist. Notiert euch die Client ID
und das Client Geheimnis
, das brauchen wir gleich auf der Gegenseite.
Application
Als nächstes erstellen wir die Application
(Anwendung). Dafür navigieren wir in der Adminoberfläche zu
Anwendungen → Anwendungen
Jetzt gehen wir auf Erstellen, vergeben einen passenden Namen, wählen den Provider aus und vergeben eine Launch URL
.
Proxmox
Als letztes fehlt nun die andere Seite, unzwar Proxmox.
Auf dem Webinterface navigieren wir zu Datacenter → Permissions → Realms
und fügen einen neuen OpenID Connect Server hinzu.
Die Issuer URL
können wir uns vom Provider anzeigen lassen.
Realm ist hier einfach nur ein beliebiger Name und die Client ID + Secret haben wir uns vorhin kopiert. Wir können noch das automatische erstellen von Usern einstellen und geben beim Username Claim username
an.
Login
Wenn wir uns jetzt mit Authentik anmelden wollen, wählen wir den Realm Authentik
aus und werden dann zu Authentik selber weitergeleitet. Dort geben wir unsere Accountdaten ein und werden in Proxmox Authentifiziert.