Single Sign On für dein Homelab!

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.

nginx Proxy Manager

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.

password for Admin-Account

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.

create provider

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 default-authentication-flow vollkommen aus

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 default-provider-authorization-implicit-consent

Redirect/URIs/Origins

die URL eures Proxmox Hosts. in meinem Fall https://pve.home.juseclab.de

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

provider

Jetzt gehen wir auf Erstellen, vergeben einen passenden Namen, wählen den Provider aus und vergeben eine Launch URL.

provider settings

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.

issuer url

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.

openid settings

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.

logged in