PostgreSQL-Fehler: 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
Zuerst die gute Nachricht: der Netzwerkpfad funktioniert und Sie haben PostgreSQL erreicht. Es hat Sie abgewiesen, weil keine Zeile in pg_hba.conf die Kombination in der Meldung trifft: Client-Adresse, Datenbank, Benutzer und ob die Verbindung SSL verwendet. Der Fehler liefert Ihnen alle vier — die Lösung ist das Schreiben einer Regel, die sie trifft.
Was dieser Fehler bedeutet
pg_hba.conf wird von oben nach unten ausgewertet, erste Übereinstimmung gewinnt — und eine Verbindung, die keine Zeile trifft, erhält diesen Fehler. Jede Zeile trifft nach Verbindungstyp (local, host, hostssl, hostnossl), Datenbank, Benutzer und Client-Adresse und nennt dann die anzuwendende Authentifizierungsmethode.
Das Ende der Meldung ("SSL encryption" / "no encryption") ist wichtiger, als es aussieht: eine hostssl-Zeile kann niemals einen Nicht-SSL-Versuch treffen und umgekehrt. Wenn die Meldung "no encryption" sagt und alle Ihre Regeln hostssl lauten, liegt die Lösung beim Client (sslmode=require), nicht in der Datei.
Häufige Ursachen
- Client-Adresse außerhalb jedes CIDR in der Datei — typisch, wenn eine App das Subnetz wechselt oder der erste entfernte Client gegen eine nur-localhost-Standardkonfiguration erscheint.
- SSL-Mismatch zwischen dem Versuch des Clients und den
hostssl/hostnossl-Regeln. - Regeln, die auf andere Datenbanken oder Benutzer beschränkt sind als die, mit denen Sie verbinden.
- Die Datei wurde bearbeitet, aber nie neu geladen — pg_hba-Änderungen greifen erst beim Neuladen.
So diagnostizieren Sie ihn
Nehmen Sie die vier Werte aus der Fehlermeldung und gehen Sie die Regeln damit durch:
-- Die View zeigt die Regeln so, wie der Server sie gelesen hat,
-- mit etwaigen Parsing-Fehlern je Zeile:
SELECT line_number, type, database, user_name, address, auth_method, error
FROM pg_hba_file_rules;
Prüfen Sie der Reihe nach: gibt es eine Zeile, deren Verbindungstyp passt (SSL!)? deren Datenbankliste Ihre einschließt? deren Benutzerliste Ihren einschließt? deren Adresse die Client-IP aus der Meldung enthält?
So beheben Sie ihn
Fügen Sie eine so eng wie der tatsächliche Bedarf gefasste Regel hinzu und laden Sie dann neu:
# /etc/postgresql/.../pg_hba.conf — Beispiel: App aus dem privaten Subnetz, SSL, SCRAM
hostssl appdb app_user 10.0.0.0/24 scram-sha-256
SELECT pg_reload_conf(); -- oder: systemctl reload postgresql
- Widerstehen Sie
host all all 0.0.0.0/0— grenzen Sie nach Datenbank, Benutzer und CIDR ein. Und niemalstrustbei Netzwerkverbindungen. - Wenn der Mismatch SSL ist, setzen Sie
sslmode=require(oder stärker) im Connection-String des Clients, statt die Server-Regeln zu schwächen.
