Passwörter ändern klingt nach einem Einzeiler — und ist es auch, wenn man die richtige Variante kennt. Falsch gemacht, landet das Klartext-Passwort im Server-Log. Dieser Artikel zeigt die drei sauberen Wege: \password in psql (interaktiv), ALTER ROLE mit vorgehashtem Passwort, und das .pgpass-Mechanismus für App-Seiten, die das Passwort nicht jedes Mal neu eintippen sollen.
Variante 1 — \password (empfohlen)
In psql, für die eigene Rolle (psql nimmt automatisch den aktuell eingeloggten User):
myapp=> \password
Enter new password for user "alice":
Enter it again:Oder als Admin für eine andere Rolle:
myapp=# \password bob
Enter new password for user "bob":
Enter it again:Was hier passiert:
- psql fragt das neue Passwort interaktiv ab — es taucht nicht im Eingabe-Buffer auf.
- psql hasht das Passwort lokal mit dem aktuellen Verfahren (
scram-sha-256ab PG 14). - Es sendet nur den Hash an den Server — niemals Klartext.
Damit landet das Passwort weder im Shell-History, noch im Server-Log, noch in pg_stat_statements. Das ist die einzig richtige Variante für Produktion.
Variante 2 — ALTER ROLE mit Klartext (vorsichtig!)
ALTER ROLE bob WITH PASSWORD 'newpass123';Was du wissen musst:
- Wenn
log_statement = 'ddl'oder'all'gesetzt ist, landet'newpass123'als Klartext im Server-Log. pg_stat_statementsnormalisiert das Statement, kann aber Konstanten enthalten — je nach Konfiguration.- Bei
psql -c "ALTER ROLE bob WITH PASSWORD 'newpass123'"landet das Passwort zusätzlich im Shell-History.
Diese Variante ist nur sicher, wenn:
- du das Server-Log explizit nicht auf
ddl/allstehen hast, und - du nicht über die Shell-CLI arbeitest.
In der Praxis: nur für Bootstrap-Skripte (Setup, Tests, CI) — und dort lieber Variante 3.
Variante 3 — ALTER ROLE mit vorgehashtem Passwort
Wenn du ALTER ROLE brauchst (z. B. in einer Migration oder einem Bootstrap-Skript), aber kein Klartext-Passwort verschicken willst:
# Mit psql lokal — kein Server beteiligt:
echo "SELECT pg_catalog.scram_sha_256_hash('newpass123', 'bob');" | psqlOder pragmatisch: einmal mit \password setzen, dann den Hash aus pg_authid (Superuser-only) auslesen und in das Bootstrap-Skript übernehmen:
SELECT rolpassword FROM pg_authid WHERE rolname = 'bob';
-- rolpassword
-- ---------------------------------------------------
-- SCRAM-SHA-256$4096:abc...$xyz...:lmn...
-- Den Hash kannst du dann verwenden:
ALTER ROLE bob WITH PASSWORD 'SCRAM-SHA-256$4096:abc...$xyz...:lmn...';Postgres erkennt den SCRAM-SHA-256$…-String und übernimmt ihn als bereits gehashtes Passwort — das Klartext kommt nirgendwo vor.
Anwendungs-Seite: .pgpass
Damit Anwendungen oder Skripte das Passwort nicht jedes Mal interaktiv eingeben müssen, gibt es die Datei ~/.pgpass:
# hostname:port:database:username:password
localhost:5432:myapp:app_user:secret123
db.example.com:5432:*:reporting:reporting_passPermissions sind Pflicht — Postgres weigert sich sonst:
chmod 600 ~/.pgpassDamit kann psql -h db.example.com -U reporting -d analytics ohne Passwortabfrage laufen.
Alternativen für Production-Setups:
PGPASSWORD-Umgebungsvariable — funktioniert, aber landet inps-Listen sichtbar. Nicht empfohlen.- Connection-Service-Datei (
~/.pg_service.conf) — strukturierte Connection-Profile. - Secret-Manager (Vault, AWS Secrets Manager, Doppler, …) — die App holt das Passwort beim Start ab. Standard für Produktion.
Passwort deaktivieren
Wer einer Rolle die Passwort-Authentifizierung entziehen will (etwa weil der User nur noch per Cert oder peer reinkommen darf):
ALTER ROLE bob WITH PASSWORD NULL;Anmeldungen mit Passwort schlagen ab sofort fehl — andere Auth-Methoden (peer, ident, cert, ldap) gehen weiter.
Mit Ablaufdatum:
ALTER ROLE bob VALID UNTIL '2027-01-01';Nach dem Datum scheitert die passwortbasierte Anmeldung.
FAQ
Wie wechsle ich vom md5- zum scram-sha-256-Verfahren?
Drei Schritte. Erstens: password_encryption = scram-sha-256 in postgresql.conf setzen und reload. Zweitens: in pg_hba.conf die md5-Methode auf scram-sha-256 ändern. Drittens: für jeden User \password <name> ausführen, damit der Hash neu generiert wird. Erst nach Schritt 3 funktioniert die Anmeldung mit dem neuen Verfahren.
Warum landet das Passwort manchmal trotz \password im Log?
\password ist log-sicher — solange der Client wirklich psql ist. Manche GUI-Tools oder Wrapper-Skripte implementieren das eigene „Passwort ändern”-Feature über ALTER ROLE … PASSWORD '…' und sind nicht log-sicher. Wenn du nicht sicher bist, was dein Tool macht, lieber explizit psql nutzen.
Kann ich das Passwort eines Users sehen?
Nein — nur den Hash. SELECT rolpassword FROM pg_authid; (Superuser-only) zeigt einen SCRAM-String. Der Klartext ist nicht rekonstruierbar; nur ein Brute-Force-Angriff auf den Hash könnte ihn liefern. Das ist Absicht.
Was tun, wenn ich das Passwort des Superusers vergessen habe?
Postgres temporär auf trust (in pg_hba.conf) umstellen, neu starten, mit psql einloggen, ALTER USER postgres WITH PASSWORD '…' setzen, pg_hba.conf wieder auf scram-sha-256 zurück, neu starten. Voraussetzung: Filesystem-Zugriff auf den Server. Bei Cloud-Postgres geht das nicht — dort hat der Anbieter eigene Reset-Mechanismen.
Wie automatisiere ich Passwort-Rotation?
Variante 1: Secret-Manager-Integration (z. B. AWS Secrets Manager kann Postgres-Passwörter automatisch rotieren). Variante 2: ein Cron-Job, der periodisch ein neues Passwort generiert, per \password-equivalent setzt und im Secret-Manager hinterlegt. Wichtig dabei: nicht beide Pfade gleichzeitig — Race Conditions führen zu Authentifizierungs-Ausfällen.
Weiterführende Ressourcen
Externe Quellen
- psql – \password documentation
- ALTER ROLE – PostgreSQL Documentation
- The Password File (.pgpass)
- Password Authentication
- Connection Service File