Authelia

Authelia to serwer uwierzytelniania i autoryzacji. Działa jako companion do reverse proxy (Traefik, nginx, HAProxy) — przechwytuje requesty przez mechanizm forwardAuth i wymusza logowanie przed dostępem do chronionych serwisów. Obsługuje one-factor (hasło), two-factor (TOTP, WebAuthn, Duo) i single sign-on (jedna sesja na wszystkie subdomeny).

W tej konfiguracji Authelia chroni panel administracyjne (Dozzle, Webmin, Homer, dashboard Traefik) przed nieautoryzowanym dostępem. Serwisy publiczne (blog, analytics) omijają Authelię. Integracja z Traefik opisana w wpisie o Traefiku — middleware authelia-auth typu forwardAuth.

Jak działa forwardAuth

sequenceDiagram
    participant U as Przeglądarka
    participant T as Traefik
    participant A as Authelia
    participant B as Backend

    U->>T: GET dozzle.robertolechowski.com
    T->>A: forwardAuth /api/verify
    alt Sesja ważna
        A-->>T: 200 OK + nagłówki Remote-User
        T->>B: request do backendu
        B-->>T: odpowiedź
        T-->>U: odpowiedź
    else Brak sesji / wygasła
        A-->>T: 302 → auth.robertolechowski.com
        T-->>U: redirect na stronę logowania
        U->>A: logowanie (hasło + opcjonalnie TOTP)
        A-->>U: redirect z powrotem + ciasteczko sesji
    end

Traefik nie wie nic o użytkownikach ani hasłach. Przy każdym requeście do chronionego serwisu pyta Authelię „czy ten request jest autoryzowany?". Authelia sprawdza ciasteczko sesji i odpowiada 200 (OK, przepuść) albo 302 (redirect na login).

Konfiguracja

docker-compose.yml

services:
  authelia:
    image: authelia/authelia:4
    container_name: authelia
    restart: unless-stopped
    command: >
      authelia
      --config=/config/configuration.yml
      --config=/config/authentication_backend.yml
      --config=/config/access_control.yml
      --config=/config/session.yml
      --config=/config/identity_providers.yml
    dns: ["8.8.8.8", "1.1.1.1"]
    environment:
      TZ: Europe/Warsaw
      X_AUTHELIA_CONFIG_FILTERS: template
      AUTHELIA_STORAGE_ENCRYPTION_KEY: "<losowy-hex-64-znaki>"
      AUTHELIA_SESSION_SECRET: "<losowy-hex-64-znaki>"
    volumes:
      - ./config:/config:ro
      - ./authelia:/var/lib/authelia
    networks: [traefik_network]

networks:
  traefik_network:
    external: true

Authelia merguje pliki konfiguracyjne w kolejności podania. Sekrety (ENCRYPTION_KEY, SESSION_SECRET) przekazane przez zmienne środowiskowe, a w configach ustawione na "" z komentarzem # ENV — Authelia automatycznie nadpisuje puste wartości zmiennymi AUTHELIA_*.

dns: ["8.8.8.8", "1.1.1.1"] — jawne DNS, żeby Authelia mogła rozwiązywać domeny niezależnie od konfiguracji hosta.

Zmienne środowiskowe Authelia w docker-compose
ZmiennaOpis
TZStrefa czasowa kontenera
X_AUTHELIA_CONFIG_FILTERSWłącza template filter (zmienne w configach)
AUTHELIA_STORAGE_ENCRYPTION_KEYKlucz szyfrowania bazy SQLite
AUTHELIA_SESSION_SECRETSekret do podpisu ciasteczek sesji

Struktura plików konfiguracyjnych

authelia/
├── docker-compose.yml
├── config/
│   ├── configuration.yml          # serwer, storage, notifier
│   ├── authentication_backend.yml # backend użytkowników (file)
│   ├── access_control.yml         # polityki dostępu
│   ├── session.yml                # sesje i ciasteczka
│   ├── identity_providers.yml     # OpenID Connect (pusty)
│   └── users_database.yml         # baza użytkowników
└── authelia/
    └── db.sqlite3                 # baza danych (auto-generowana)

configuration.yml — serwer, storage, notifier

log:
  level: info

server:
  address: 'tcp://0.0.0.0:8080'

storage:
  encryption_key: "" # ENV
  local:
    path: /var/lib/authelia/db.sqlite3

notifier:
  disable_startup_check: true
  filesystem:
    filename: /config/notification.txt

storage.local — SQLite, bez zewnętrznej bazy danych. Plik db.sqlite3 w volume ./authelia. encryption_key puste — nadpisane zmienną AUTHELIA_STORAGE_ENCRYPTION_KEY.

notifier.filesystem — powiadomienia (np. link do resetu hasła, rejestracja TOTP) zapisywane do pliku zamiast wysyłane mailem. Wystarczające w setupie jednoosobowym.

authentication_backend.yml — backend użytkowników

authentication_backend:
  password_reset:
    disable: true

  file:
    path: /config/users_database.yml
    watch: true

File backend — użytkownicy definiowani w pliku YAML. watch: true pozwala na edycję użytkowników bez restartu kontenera. password_reset: disable: true — wyłączony reset hasła (jednosobowy setup, hasło zmieniane ręcznie).

users_database.yml

users:
  robert:
    displayname: "Robert"
    password: "$argon2id$v=19$m=65536,t=3,p=4$<salt>$<hash>"
    email: user@example.com
    groups:
      - admins

Hasło zahaszowane Argon2id. Generowanie hasha:

docker run --rm authelia/authelia:4 \
  authelia crypto hash generate argon2 \
  --password '<haslo>'

access_control.yml — polityki dostępu

access_control:
  default_policy: one_factor

default_policy: one_factor — wszystkie chronione serwisy wymagają logowania hasłem. Polityka dotyczy tylko serwisów, które mają middleware authelia-auth w Traefik. Serwisy bez tego middleware (blog, analytics) są dostępne publicznie bez zmian.

Dostępne polityki: bypass (bez logowania), one_factor (hasło), two_factor (hasło + TOTP/WebAuthn). Można definiować reguły per domena, ścieżka, sieć źródłowa i grupa użytkownika.

session.yml — sesje

session:
  name: authelia_session
  secret: "" # ENV
  same_site: 'none'
  inactivity: '5d'
  expiration: '1M'
  remember_me: '1y'
  cookies:
  - domain: 'robertolechowski.com'
    authelia_url: 'https://auth.robertolechowski.com'
    default_redirection_url: 'https://dashboard.robertolechowski.com'

Jedna sesja na całą domenę robertolechowski.com — SSO dla wszystkich subdomen (dozzle., traefik., homer., itd.). Ciasteczko authelia_session z SameSite=None (wymagane dla cross-subdomain). secret puste — nadpisane zmienną AUTHELIA_SESSION_SECRET.

identity_providers.yml

Plik pusty — OpenID Connect nie skonfigurowany. Authelia obsługuje OIDC jako identity provider dla serwisów typu Grafana, Portainer, Gitea. Na razie nie używane.

Architektura

graph LR
    I[Internet<br/>:443] --> T[Traefik]
    T -->|forwardAuth| A[Authelia<br/>:8080]
    T --> PUB[Serwisy publiczne<br/>blog, analytics]
    T -->|po autoryzacji| PRIV[Serwisy chronione<br/>Dozzle, Webmin, Homer, Dashboard]
    A -->|sesja w SQLite| DB[(db.sqlite3)]
    A -->|użytkownicy| UDB[users_database.yml]

Generowanie sekretów

Sekrety (ENCRYPTION_KEY, SESSION_SECRET) to losowe ciągi hex. Generowanie:

openssl rand -hex 32

Wynik (64 znaki hex) wkleić do docker-compose.yml jako wartość zmiennej środowiskowej. Każdy sekret powinien być inny.

Router Authelia w Traefik

Authelia musi być dostępna pod własną domeną (auth.robertolechowski.com) bez middleware authelia-auth — w przeciwnym razie powstanie circular dependency (Authelia chroniłaby samą siebie). Konfiguracja routera w wpisie o Traefiku .