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.
| Zmienna | Opis |
|---|---|
TZ | Strefa czasowa kontenera |
X_AUTHELIA_CONFIG_FILTERS | Włącza template filter (zmienne w configach) |
AUTHELIA_STORAGE_ENCRYPTION_KEY | Klucz szyfrowania bazy SQLite |
AUTHELIA_SESSION_SECRET | Sekret 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 .