Erreur 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
Bonne nouvelle d'abord : le chemin réseau fonctionne et vous avez atteint PostgreSQL. Il vous a refusé parce qu'aucune ligne de pg_hba.conf ne correspond à la combinaison du message : adresse cliente, base, utilisateur, et si la connexion utilise SSL. L'erreur vous donne les quatre — la solution consiste à écrire une règle qui leur correspond.
Ce que signifie cette erreur
pg_hba.conf est évalué de haut en bas, la première correspondance l'emporte — et une connexion qui ne correspond à aucune ligne obtient cette erreur. Chaque ligne correspond sur le type de connexion (local, host, hostssl, hostnossl), la base, l'utilisateur et l'adresse cliente, puis nomme la méthode d'authentification à appliquer.
La fin du message (« SSL encryption » / « no encryption ») compte plus qu'il n'y paraît : une ligne hostssl ne peut jamais correspondre à une tentative non-SSL, et vice versa. Si le message dit « no encryption » et que toutes vos règles disent hostssl, la solution est côté client (sslmode=require), pas dans le fichier.
Causes fréquentes
- Adresse cliente hors de tout CIDR du fichier — typique quand une application change de sous-réseau, ou que le premier client distant apparaît face à une configuration localhost-seulement par défaut.
- Incohérence SSL entre la tentative du client et les règles
hostssl/hostnossl. - Règles cadrées sur d'autres bases ou utilisateurs que ceux avec lesquels vous vous connectez.
- Le fichier a été édité mais jamais rechargé — les changements de pg_hba ne prennent effet qu'au rechargement.
Comment la diagnostiquer
Prenez les quatre valeurs du message d'erreur et parcourez les règles avec elles :
-- La vue montre les règles telles que le serveur les a lues,
-- avec d'éventuelles erreurs d'analyse par ligne :
SELECT line_number, type, database, user_name, address, auth_method, error
FROM pg_hba_file_rules;
Vérifiez, dans l'ordre : y a-t-il une ligne dont le type de connexion correspond (SSL !) ? dont la liste de bases inclut la vôtre ? dont la liste d'utilisateurs inclut le vôtre ? dont l'adresse contient l'IP cliente du message ?
Comment la corriger
Ajoutez une règle aussi étroite que le besoin réel, puis rechargez :
# /etc/postgresql/.../pg_hba.conf — exemple : app depuis le sous-réseau privé, SSL, SCRAM
hostssl appdb app_user 10.0.0.0/24 scram-sha-256
SELECT pg_reload_conf(); -- ou bien : systemctl reload postgresql
- Résistez à
host all all 0.0.0.0/0— cadrez par base, utilisateur et CIDR. Et jamaistrustsur des connexions réseau. - Si l'incohérence est SSL, définissez
sslmode=require(ou plus fort) dans la chaîne de connexion du client au lieu d'affaiblir les règles serveur.
