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):

SQL Eigenes Passwort aendern (als alice eingeloggt)
myapp=> \password
Enter new password for user "alice":
Enter it again:

Oder als Admin für eine andere Rolle:

SQL
myapp=# \password bob
Enter new password for user "bob":
Enter it again:

Was hier passiert:

  1. psql fragt das neue Passwort interaktiv ab — es taucht nicht im Eingabe-Buffer auf.
  2. psql hasht das Passwort lokal mit dem aktuellen Verfahren (scram-sha-256 ab PG 14).
  3. 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!)

SQL
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_statements normalisiert 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/all stehen 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:

Bash SCRAM-Hash erzeugen
# Mit psql lokal — kein Server beteiligt:
echo "SELECT pg_catalog.scram_sha_256_hash('newpass123', 'bob');" | psql

Oder pragmatisch: einmal mit \password setzen, dann den Hash aus pg_authid (Superuser-only) auslesen und in das Bootstrap-Skript übernehmen:

SQL
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:

Bash ~/.pgpass
# hostname:port:database:username:password
localhost:5432:myapp:app_user:secret123
db.example.com:5432:*:reporting:reporting_pass

Permissions sind Pflicht — Postgres weigert sich sonst:

Bash
chmod 600 ~/.pgpass

Damit kann psql -h db.example.com -U reporting -d analytics ohne Passwortabfrage laufen.

Alternativen für Production-Setups:

  • PGPASSWORD-Umgebungsvariable — funktioniert, aber landet in ps-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):

SQL
ALTER ROLE bob WITH PASSWORD NULL;

Anmeldungen mit Passwort schlagen ab sofort fehl — andere Auth-Methoden (peer, ident, cert, ldap) gehen weiter.

Mit Ablaufdatum:

SQL
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

/ Weiter

Zurück zu Server-Administration

Zur Übersicht