PostgreSQL: password authentication failed for user
PostgreSQL meldet „password authentication failed“? Falsches Passwort, falscher Nutzer oder pg_hba.conf erlaubt die Methode nicht. So kommst du rein.
Aufwand:
ca. 20 Min.
Voraussetzung:
Zugriff als PostgreSQL-Superuser (meist der Systemnutzer postgres)
Gilt für:
PostgreSQL
Das Symptom
Eine App oder ein psql-Aufruf kommt nicht mehr an die Datenbank und meldet
FATAL: password authentication failed for user "appuser". Gestern lief noch alles,
oder das Setup ist frisch und will partout keine Verbindung annehmen. Das Passwort
sieht im Connection-String korrekt aus, und trotzdem bleibt die Tür zu.
Die „Layer 8“-Wahrheit
Diese Meldung ist absichtlich vage – und genau das führt in die Irre. Sie sagt nicht
„falsches Passwort“, sondern nur „Passwort-Anmeldung fehlgeschlagen“, und dahinter
verbergen sich mehrere sehr verschiedene Ursachen, die PostgreSQL bewusst nicht
auseinanderhält, damit niemand über die Fehlermeldung gültige Nutzernamen errät. Der
harmloseste Fall ist tatsächlich ein falsches oder veraltetes Passwort in der App.
Fast ebenso häufig existiert die Rolle gar nicht wie geschrieben, oder es wurde für
sie nie ein Passwort gesetzt – dann muss die Passwort-Anmeldung zwangsläufig
scheitern.
Der tückischste Fall aber liegt in pg_hba.conf, der Zugangsregel-Datei, die vor jeder
Prüfung entscheidet, welche Anmeldemethode für welche Herkunft überhaupt gilt. Erwartet
die passende Zeile eine andere Methode als das Passwort, das die App schickt, hilft das
korrekteste Passwort nichts. Deshalb lohnt es sich, die Verbindung mit genau den
Parametern der App nachzustellen: Eine lokale Anmeldung über den Unix-Socket landet oft
auf einer ganz anderen Regel als dieselbe über TCP. Wer erst die Zugangsdaten prüft,
dann die Rolle, und zuletzt pg_hba.conf, findet die richtige der drei Türen – statt
blind am falschen Schloss zu drehen.
Die echte, verifizierte Lösung
1000 % faktenbasiert. Jeder Befehl ist real, jeder Pfad existiert. Schritt für Schritt:
1.
Zugangsdaten und Rollennamen prüfen
Zuerst die naheliegende Ursache ausschließen: Stimmt der Rollenname, ist das Passwort aktuell? Als Superuser nachsehen, ob die Rolle überhaupt existiert und anmelden darf. Nicht per curl gegen Port 5432 testen – PostgreSQL spricht kein HTTP, dafür ist psql da:
sudo -u postgres psql -c "\du appuser"
2.
Ein Passwort setzen oder zurücksetzen
Hat die Rolle kein oder ein falsches Passwort, als Superuser ein neues setzen. Das behebt sowohl den Fall „nie ein Passwort vergeben“ als auch schlicht ein vergessenes Passwort:
sudo -u postgres psql -c "ALTER ROLE appuser WITH PASSWORD 'einNeuesGeheimnis';"
3.
Die Verbindung gezielt nachstellen
Mit denselben Parametern anmelden, die auch die App verwendet – Host, Nutzer und Datenbank explizit angeben. So trennst du „falsche Zugangsdaten“ von „pg_hba.conf blockiert“, denn eine lokale Anmeldung über den Socket läuft oft über eine andere Regel als eine über TCP:
Scheitern selbst korrekte Zugangsdaten, entscheidet pg_hba.conf. Jede Zeile bindet Verbindungstyp, Datenbank, Nutzer und Herkunft an eine Methode. Für passwortbasierte Anmeldung sollte in der passenden Zeile scram-sha-256 stehen, nicht ident oder peer. Den Pfad der Datei erfragen und die Regeln prüfen:
sudo -u postgres psql -c "SHOW hba_file;"
5.
Konfiguration neu einlesen
Änderungen an pg_hba.conf werden nicht automatisch aktiv. Ein Reload liest die Regeln neu ein, ohne bestehende Verbindungen zu trennen – ein voller Neustart ist dafür nicht nötig:
?Das Passwort stimmt garantiert – warum werde ich trotzdem abgewiesen?
Weil „password authentication failed“ nicht nur bei falschem Passwort erscheint. Dieselbe Meldung kommt, wenn der angegebene Rollenname gar nicht existiert, wenn für die Rolle nie ein Passwort gesetzt wurde (dann schlägt die Passwort-Anmeldung grundsätzlich fehl) oder wenn pg_hba.conf für diese Verbindung eine andere Methode erzwingt. PostgreSQL verrät bewusst nicht, welcher der Fälle vorliegt, damit Angreifer keine gültigen Nutzernamen erraten können.
?Muss ich pg_hba.conf oder das Passwort anfassen?
Kommt darauf an. Verbindest du dich aus einer App mit falschen oder veralteten Zugangsdaten, reicht das richtige Passwort im Connection-String. Existiert die Rolle nicht oder hat kein Passwort, setzt du es mit ALTER ROLE. Erst wenn selbst korrekte Zugangsdaten scheitern, liegt es an pg_hba.conf – etwa an einer trust- oder ident-Zeile, die eine ganz andere Anmeldung erwartet, als die App liefert.
Belege
Diese Seite ist gegen die folgenden Primärquellen geprüft – Hersteller, Standard oder Gesetzestext. Wer es nicht glaubt, muss es nicht: Da steht, wo es nachzulesen ist.
Der Login wird abgewiesen, obwohl das Passwort stimmt? Bei MySQL zählt auch, von welchem Host aus man kommt — der Benutzer ist an eine Herkunft gebunden.