Errore PostgreSQL: no pg_hba.conf entry for host
FATAL: no pg_hba.conf entry for host "10.0.0.23", user "app_user", database "appdb", SSL encryption
Prima la buona notizia: il percorso di rete funziona e hai raggiunto PostgreSQL. Ti ha rifiutato perché nessuna riga in pg_hba.conf corrisponde alla combinazione nel messaggio: indirizzo client, database, user, e se la connessione usa SSL. L'errore ti fornisce tutti e quattro — la soluzione è scrivere una regola che li faccia corrispondere.
Cosa significa questo errore
pg_hba.conf è valutato dall'alto verso il basso, vince la prima corrispondenza — e una connessione che non corrisponde a nessuna riga riceve questo errore. Ogni riga corrisponde per tipo di connessione (local, host, hostssl, hostnossl), database, user e indirizzo del client, poi indica il metodo di autenticazione da applicare.
La coda del messaggio ("SSL encryption" / "no encryption") conta più di quanto sembri: una riga hostssl non può mai corrispondere a un tentativo non-SSL, e viceversa. Se il messaggio dice "no encryption" e tutte le tue regole dicono hostssl, la soluzione è sul client (sslmode=require), non nel file.
Cause comuni
- Indirizzo del client fuori da ogni CIDR nel file — tipico quando un'app cambia subnet, o compare il primo client remoto contro una configurazione di default solo-localhost.
- Mismatch SSL tra il tentativo del client e le regole
hostssl/hostnossl. - Regole circoscritte ad altri database o utenti rispetto a quelli con cui ti stai connettendo.
- Il file è stato modificato ma mai ricaricato — le modifiche a pg_hba hanno effetto solo al reload.
Come diagnosticarlo
Prendi i quattro valori dal messaggio di errore e percorri le regole con essi:
-- La vista mostra le regole così come il server le ha lette,
-- con eventuali errori di parsing per riga:
SELECT line_number, type, database, user_name, address, auth_method, error
FROM pg_hba_file_rules;
Controlla, in ordine: c'è una riga il cui tipo di connessione corrisponde (SSL!)? la cui lista di database include il tuo? la cui lista di utenti include il tuo? il cui indirizzo contiene l'IP del client nel messaggio?
Come risolverlo
Aggiungi una regola stretta quanto il bisogno reale, poi ricarica:
# /etc/postgresql/.../pg_hba.conf — esempio: app dal subnet privato, SSL, SCRAM
hostssl appdb app_user 10.0.0.0/24 scram-sha-256
SELECT pg_reload_conf(); -- oppure: systemctl reload postgresql
- Resisti a
host all all 0.0.0.0/0— circoscrivi per database, user e CIDR. E maitrustsu connessioni di rete. - Se il mismatch è SSL, imposta
sslmode=require(o più forte) nella stringa di connessione del client invece di indebolire le regole del server.
