
In un contesto in cui la sicurezza dei servizi web è sempre più cruciale Authelia si è affermata come una delle soluzioni open source più complete per gestire autenticazione e autorizzazione centralizzate.
Grazie al suo supporto per Single Sign-On (SSO), autenticazione a più fattori (2FA) e integrazione con reverse proxy come Nginx o Traefik, Authelia consente di proteggere con un’unica interfaccia tutte le applicazioni web self-hosted.
In questo articolo vedremo passo dopo passo come installare e configurare Authelia su Ubuntu Server 24.04 partendo da una configurazione base ma già pronta all’uso.
L’obiettivo è ottenere un sistema sicuro, stabile e facilmente integrabile con i servizi più comuni ideale per chi gestisce un homelab o un piccolo ambiente di produzione.
PREREQUISITI
Server Ubuntu 24.04 con accesso root/sudo.
DNS che punti al tuo reverse proxy (es. auth.tuodominio.it) → Authelia normalmente vierne esposta dietro Nginx/Traefik e protegge altri servizi.
Raggiungibilità delle porte 80 e 443
AGGIORNAMENTO DEL SERVER UBUNTU
Aggiornare il server con il seguente comando:
|
0 |
sudo apt-get update && sudo apt-get upgrade -y
|
Per sicurezza installare anche qualche tool utile con il comando:
|
0 |
sudo apt install -y curl wget tar openssl jq gnupg2 nano
|
NOTA BENE:
openssl → lo utilizzeremo per generare le secret
tar → lo utilizzeremo per estrarre i sorgenti
jq → aiuta nel debug ma non è strettamente obbligatorio
CREAZIONE UTENTE E DIRECTORY PER AUTHELIA
In questo tutorial utilizzeremo la seguente struttura:
- binario in /opt/authelia/authelia
- config in /etc/authelia
- dati (sqlite, notifiche ecc.) in /var/lib/authelia
Aggiungere l’utente con il comando:
|
0 |
sudo useradd --system --no-create-home --shell /usr/sbin/nologin authelia
|
Creare le cartelle con i seguenti comandi:
|
0
1
2
|
sudo mkdir -p /opt/authelia
sudo mkdir -p /etc/authelia
sudo mkdir -p /var/lib/authelia
|
SCARICARE AUTHELIA v4.39.13
Prima di tutto controllare l’architettura della macchina con il comando:
|
0 |
uname -m
|
Se si ottiene x86_64 → sei su amd64 (Intel/AMD)
Se si ottiene aarch64 → sei su arm64 (tipico ARM 64 bit, Raspberry Pi 4/5 64 bit, AWS Graviton ecc.)
A questo punto procedere con il download:
Per amd64 (x86_64):
|
0
1
|
cd /tmp
wget https://github.com/authelia/authelia/releases/download/v4.39.13/authelia-v4.39.13-linux-amd64.tar.gz
|
Per arm64 (aarch64):
|
0
1
|
cd /tmp
wget https://github.com/authelia/authelia/releases/download/v4.39.13/authelia-v4.39.13-linux-arm64.tar.gz
|
ESTRARRE ED ESTRARRE IL BINARIO
Posizionarsi nelle cartella /tmp con il comando:
|
0 |
cd /tmp
|
Unzippare il file con il comando:
|
0 |
tar -xzf authelia-v4.39.13-linux-*.tar.gz
|
Il tar contiene un binario chiamato authelia quindi eseguire i comandi:
|
0
1
2
|
sudo mv authelia /opt/authelia/authelia
sudo chown authelia:authelia /opt/authelia/authelia
sudo chmod 755 /opt/authelia/authelia
|
Verificare la versione di Authelia con il comando:
|
0 |
/opt/authelia/authelia --version
|
Dovremmo voisualizzare il seguente output:
|
0 |
authelia version v4.39.13
|
GENERAZIONE DEI SECRETS
Authelia richiede secrets forti per:
- JWT
- sessione
- cifratura storage
Generare tre secret lunghi e salvarli da parte (li useremo nel file di configurazione)
Eseguire il comando:
|
0
1
2
3
4
5
6
|
JWT_SECRET=$(openssl rand -base64 64)
SESSION_SECRET=$(openssl rand -base64 64)
STORAGE_KEY=$(openssl rand -base64 64)
echo "JWT_SECRET=$JWT_SECRET"
echo "SESSION_SECRET=$SESSION_SECRET"
echo "STORAGE_KEY=$STORAGE_KEY"
|
⚠️ATTENZIONE: Copiare questi valori da qualche parte sicuro. Non perderli.
Dovremmo visualizzare un output simile al seguente:
|
0
1
2
|
JWT_SECRET=OWne6GnIlXI/Cn+0ea0y4kiFqOCF+X66nbnxN79RRbE25jLIEeq3SrY5CxyseQeurkSHJpihOs0t6LVpgCKJaw==
SESSION_SECRET=pAy+xb2351r5DxivSsuCM31ezT4+l/uFzlGawkoVtbzhTVIp0fpvPLtpznYtRCRl0Ognsw5Sij+ICMH2Rw2yJQ==
STORAGE_KEY=pAy+xb2351r5DxivSsuCM31ezT4+l/uFzlGawkoVtbzhTVIp0fpvPLtpznYtRCRlGRUOV3pfDnAefON+CW0RJA==
|
CREAZIONE DEL DATABASE E DELL’UTENTE LOCALE
Authelia può usare LDAP, etc., ma per partire useremo il backend file.
Generare l’hash Argon2id della password dell’utente admin con il seguete comando:
|
0 |
/opt/authelia/authelia crypto hash generate argon2
|
Inserire due volte la password che si intende utilizzare e dovremmo visualizzare il seguente output:
|
0
1
2
3
|
Enter Password:
Confirm Password:
Digest: $argon2id$v=19$m=65536,t=3,p=4$3HLu2x17e6xSGKkPnKvSng$AnSh9rsI8kvId+EwWO/puUwCAesuXhmmbDPAvsgo2rk
|
Creare il file utenti con il comando:
|
0 |
sudo nano /etc/authelia/users_database.yml
|
Inserire all’interno del file questo output di esempio:
|
0
1
2
3
4
5
6
7
8
9
10
11
12
13
|
users:
admin:
displayname: "Admin User"
password: "$argon2id$v=19$m=65536,t=3,p=4$INCROLLA_L_HASH_QUI"
groups:
- admins
- users
user1:
displayname: "User One"
password: "$argon2id$v=19$m=65536,t=3,p=4$ALTRO_HASH_SE_VUOI"
groups:
- users
|
Salvare e chiudere il file di configurazione.
Impostare quindi i permessi restrittivi con i seguenti comandi:
|
0
1
|
sudo chown authelia:authelia /etc/authelia/users_database.yml
sudo chmod 640 /etc/authelia/users_database.yml
|
CONFIGURAZIONE PRINCIPALE DI AUTHELIA
Creare il file di configurazione di Authelia /etc/authelia/configuration.yml con il comando:
|
0 |
sudo nano /etc/authelia/configuration.yml
|
Incollare e personalizzare le cose marcate con # <– (domini, email, segreti):
|
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
#################################################
# Server
#################################################
server:
address: '0.0.0.0:9091'
log:
level: info
format: text
theme: light
#################################################
# Password reset / JWT
#################################################
identity_validation:
reset_password:
jwt_secret: "AAA_JWT_SECRET_BASE64_UNICO" # <-- sostituire col tuo segreto
#################################################
# Session
# Formato multi-dominio richiesto dai log
#################################################
session:
# valore boolean che dice se permettere "ricordami"
remember_me: true
cookies:
- domain: test.lab # <-- tuo dominio principale
authelia_url: https://auth.test.lab # <-- URL pubblico del portale Authelia
name: authelia_session
same_site: lax
expiration: 1h
inactivity: 5m
# campi sicurezza cookie nelle build recenti:
# secure/http_only li inferisce dal contesto reverse proxy HTTPS.
# non li mettiamo perché i log dicono "key not expected".
# secret del cookie/sessione ora spesso NON si mette qui ma viene
# derivato internamente oppure da storage crypto.
# Il log dice "key not expected: secret", quindi NON lo mettiamo.
#################################################
# Storage (SQLite locale)
#################################################
storage:
encryption_key: "BBB_STORAGE_KEY_BASE64_UNICO" # <-- sostituire col tuo terzo segreto
local:
path: /var/lib/authelia/authelia.sqlite3
#################################################
# Authentication backend (file utenti locale)
#################################################
authentication_backend:
file:
path: /etc/authelia/users_database.yml
password:
algorithm: argon2id
iterations: 3
key_length: 32
salt_length: 16
memory: 65536
parallelism: 4
#################################################
# 2FA / TOTP
#################################################
totp:
issuer: "test.lab" # questo è solo label visualizzata nelle app OTP
period: 30
skew: 1
#################################################
# Notifier
#################################################
notifier:
filesystem:
filename: /var/lib/authelia/notification.txt
disable_startup_check: true
#################################################
# Access Control
#################################################
access_control:
default_policy: deny
rules:
- domain: "app.test.lab"
policy: two_factor
- domain: "public.test.lab"
policy: bypass
- domain: "admin.test.lab"
policy: two_factor
subject:
- "group:admins"
#################################################
# Anti brute force
#################################################
regulation:
max_retries: 5
find_time: 2m
ban_time: 5m
|
Ora sistemare i permessi con i seguenti comandi:
|
0
1
2
3
|
sudo chown -R authelia:authelia /etc/authelia /var/lib/authelia
sudo chmod 640 /etc/authelia/configuration.yml
sudo chmod 640 /etc/authelia/users_database.yml
sudo chmod 700 /var/lib/authelia
|
Di seguito un breve recap delle cose da fare:
jwt_secret, session.secret, storage.encryption_key → sostituirli con i tre segreti generati
test.lab, app.test.lab, ecc. → inserire i nomi dei veri domini.
CREAZIONE DEL SERVIZIO SYSTEMD
Per permettere ad Authelia di partire all’avvio e girare come utente dedicato è necessario creare il file .service.
Eseguire il comando:
|
0 |
sudo nano /etc/systemd/system/authelia.service
|
Quindi inserire all’interno del file il seguente output:
|
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[Unit]
Description=Authelia authentication portal
After=network.target
[Service]
User=authelia
Group=authelia
WorkingDirectory=/opt/authelia
ExecStart=/opt/authelia/authelia --config /etc/authelia/configuration.yml
Restart=on-failure
RestartSec=5
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
[Install]
WantedBy=multi-user.target
|
Salvare e chiudere il file di configurazione
Abilitare e avviare Authelia con i seguenti comandi:
|
0
1
2
|
sudo systemctl daemon-reload
sudo systemctl enable --now authelia
sudo systemctl status authelia
|
Dovremmo visualizzare il seguente output:
|
0
1
2
3
4
5
6
7
8
|
● authelia.service - Authelia authentication portal
Loaded: loaded (/etc/systemd/system/authelia.service; enabled; preset: enabled)
Active: active (running) since Sun 2025-10-26 18:04:43 CET; 17ms ago
Main PID: 14933 (authelia)
Tasks: 6 (limit: 979)
Memory: 9.2M (peak: 9.7M)
CPU: 14ms
CGroup: /system.slice/authelia.service
└─14933 /opt/authelia/authelia --config /etc/authelia/configuration.yml
|
Se lo stato è active (running), Authelia sta ascoltando su 127.0.0.1:9091 (o 0.0.0.0:9091 se abbiamo la sciato la configurazione di default).
Puoi vedere i log live di Authelia con il comando:
|
0 |
journalctl -u authelia -f
|
INSTALLAZIONE DI NGINX COME REVERSE PROXY
Installare Nginx con il comando:
|
0 |
sudo apt install -y nginx
|
Configuare il reverse proxy per Authelia creando il file authelia.conf con il comando:
|
0 |
sudo nano /etc/nginx/sites-available/authelia.conf
|
Incollare quindi il seguente output:
|
0
1
2
3
4
5
6
7
8
9
10
11
|
server {
listen 80;
server_name auth.example.com; # TODO: sostituisci
location / {
proxy_pass http://127.0.0.1:9091;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
|
Salvare e chiudere il file di configurazione
Abilitare e ricaricare con i seguenti comandi:
|
0
1
2
|
sudo ln -s /etc/nginx/sites-available/authelia.conf /etc/nginx/sites-enabled/authelia.conf
sudo nginx -t
sudo systemctl reload nginx
|
ACCESSO AD AUTHELIA DA INTERFACCIA WEB
Richiamare da un qualsiasi browser il seguente link:
https://<your-domain-name>
Inserire le credenziali create in precedenza quindi cliccare Sign In
A questo punto è possibile configurare Authelia…
FUNZIONALITA’ E CONSIDERAZIONI FINALI
Authelia è un portale di autenticazione e autorizzazione centralizzato (Identity Provider self-hosted) che aggiunge:
- autenticazione a più fattori (2FA)
- Single Sign-On (SSO)
- controllo accessi basato su regole (per dominio, percorso, gruppo, utente, ecc.)
In pratica: è un guardiano davanti alle tue app web interne.
⚙️ FUNZIONALITÀ PRINCIPALI
1. Autenticazione e SSO
Supporta file backend locale (utenti YAML) o LDAP (es. Active Directory).
Dopo il login su Authelia, le altre app configurate con SSO si riconoscono automaticamente.
Funziona tramite cookie di sessione condiviso sul dominio configurato.
2. Autorizzazione granulare
Puoi definire regole in access_control:
rules:
- domain: app1.example.com
- policy: two_factor
- domain: grafana.example.com
- subject: [“group:admins”]
- policy: one_factor
Policy disponibili:
- bypass (nessun login)
- one_factor (solo username/password)
- two_factor (2FA obbligatorio)
- deny
♂️ 3. Gestione utenti
Modalità file (semplice per pochi utenti)
Modalità LDAP (scalabile per aziende)
Possibilità di password reset via mail (se configuri SMTP)
4. 2FA / MFA
Supporta TOTP (Google Authenticator, Authy, ecc.)
Possibilità di enforcement per dominio o gruppo
QR code generato al primo login
5. Notifiche
Notifiche email (reset password, alert) tramite SMTP o filesystem (debug)
Gestione anti brute-force (tentativi falliti, lock temporanei)
6. Storage
Database SQLite, MySQL, o PostgreSQL
Dati cifrati con chiavi definite in storage.encryption_key
7. Compatibilità proxy
Nginx, Traefik, Caddy — pienamente supportati.
Integrazione tramite forwardAuth (autenticazione inversa via header HTTP)
✅ PRO — PUNTI DI FORZA
Sicurezza: MFA, SSO, brute-force protection, JWT sicuri
Configurabilità: YAML chiaro, regole granulari per dominio/percorso
Self-hosted: Nessuna dipendenza da provider esterni (es. Google, Auth0)
Integrazione: Funziona con qualunque reverse proxy moderno
Flessibilità: Backend file o LDAP, storage locale o SQL
UX: Interfaccia web semplice, 2FA QR integrato
Performance: Binario Go nativo, molto leggero (RAM ~50–100MB)
Debug: Log strutturati e dettagliati, facile tracing dei problemi
Community: Attiva, ottima documentazione e aggiornamenti continui
⚠️ CONTRO — LIMITAZIONI / PUNTI DI ATTENZIONE
️Configurazione: YAML molto sensibile all’indentazione e ai formati (errore → crash immediato)
Aggiornamenti: Cambi di sintassi frequenti (es. session.cookies[] → session.domains[]) tra versioni minori
Gestione utenti: Nessuna UI per gestione utenti in modalità file (modifica manuale YAML)
Email / reset: Reset password via mail richiede configurazione SMTP perfetta
Backup: Devi salvare manualmente chiavi JWT / session / encryption (nessun recovery se perse)
Integrazione: Richiede configurazione attenta di Nginx (headers, redirect, cookies, HTTPS)
Scalabilità: Ottima per ambienti piccoli / medi; per grandi SSO conviene Keycloak o Authentik
Debug API: API interne non documentate per uso diretto (es. test via curl possono fallire anche se tutto funziona via browser)
CONSIDERAZIONI FINALI
Authelia è una soluzione eccellente per chi vuole:
- mettere in sicurezza applicazioni interne (es. Grafana, Portainer, Nextcloud…)
- gestire accessi con SSO e 2FA
- restare indipendente da servizi esterni (Google, Okta, AzureAD)
- mantenere il controllo completo dei dati e dell’infrastruttura
Ma:
- richiede una curva di apprendimento iniziale (YAML, reverse proxy, cookie domain)
- e un po’ di manutenzione attiva dopo gli aggiornamenti.
In ambienti aziendali piccoli/medi o per un homelab avanzato, è probabilmente la miglior opzione self-hosted per SSO+2FA.

0 commenti