Bevor irgendwo ein GRANT läuft, hat eine Rolle bereits eine ganze Reihe von Attributen, die ihr Verhalten steuern: ob sie sich anmelden darf, ob sie Privilegien von Gruppen erbt, ob sie Datenbanken anlegen kann und so weiter. Diese Attribute sind separat vom GRANT-System — sie werden direkt am CREATE ROLE (oder später per ALTER ROLE) gesetzt.

Übersicht aller Attribute

AttributDefaultWirkung
LOGIN / NOLOGINNOLOGINDarf sich anmelden? CREATE USER setzt LOGIN automatisch.
INHERIT / NOINHERITINHERITErbt die Rolle automatisch Rechte ihrer Mitgliedsrollen oder erst nach SET ROLE?
SUPERUSER / NOSUPERUSERNOSUPERUSERUmgeht alle Berechtigungschecks. Sehr mächtig.
CREATEDB / NOCREATEDBNOCREATEDBDarf neue Datenbanken anlegen.
CREATEROLE / NOCREATEROLENOCREATEROLEDarf neue Rollen anlegen, ändern, droppen.
REPLICATION / NOREPLICATIONNOREPLICATIONDarf Streaming-Replikation betreiben (Walsender starten).
BYPASSRLS / NOBYPASSRLSNOBYPASSRLSUmgeht Row-Level-Security-Policies.
CONNECTION LIMIT n-1 (unlimited)Maximal gleichzeitige Verbindungen für diese Rolle.
PASSWORD '…' / PASSWORD NULLNULLPasswort. NULL deaktiviert Passwort-Auth komplett.
VALID UNTIL 'timestamp'unlimitedAblaufzeitpunkt für Passwort-Authentifizierung.

Setzen kann man sie alle bei CREATE ROLE, ändern später mit ALTER ROLE:

SQL Attribute setzen und aendern
CREATE ROLE app_owner
    CREATEDB CREATEROLE
    CONNECTION LIMIT 5;

ALTER ROLE app_owner SET search_path = app, public;
ALTER ROLE app_owner VALID UNTIL '2027-01-01';
ALTER ROLE app_owner WITH NOCREATEROLE;  -- entzieht das Recht

LOGIN / NOLOGIN

LOGIN macht eine Rolle zu einem „User“. Eine NOLOGIN-Rolle ist ein reiner Container — nützlich für Gruppen-Patterns, bei denen mehrere Service-Accounts gemeinsam Rechte erben.

Wer versucht, sich mit einer NOLOGIN-Rolle anzumelden, bekommt:

Bash
psql: error: connection to server on socket "..." failed:
  FATAL:  role "devs" is not permitted to log in

CREATE USER setzt LOGIN implizit; CREATE ROLE ohne Argument nicht.

INHERIT / NOINHERIT — der subtile Unterschied

INHERIT (Default) bedeutet: wenn alice Mitglied der Rolle devs ist, kann sie deren Rechte automatisch nutzen — ohne SET ROLE. Eine Query als alice greift auf alles zu, was devs darf.

NOINHERIT zwingt explizites Umschalten:

SQL Mit NOINHERIT muss SET ROLE benutzt werden
CREATE ROLE alice WITH LOGIN NOINHERIT PASSWORD 'changeme';
GRANT devs TO alice;

-- Als alice angemeldet:
SELECT * FROM orders;
-- ERROR: permission denied for table orders

SET ROLE devs;
SELECT * FROM orders;
-- OK

NOINHERIT ist sinnvoll, wenn eine Rolle gefährliche Rechte erst dann nutzen soll, wenn der Mensch bewusst umschaltet — Audit-freundlicher, aber unbequem. In den meisten Anwendungen lässt man INHERIT (Default) stehen und arbeitet ohne SET ROLE.

SUPERUSER

SUPERUSER schaltet alle Berechtigungschecks ab — die Rolle darf alles, immer. Viele Bequemlichkeiten der Postgres-Welt setzen einen Superuser voraus:

  • CREATE EXTENSION (für die meisten Extensions)
  • direktes Schreiben in System-Kataloge
  • pg_read_server_files-/COPY FROM '/path/...' mit absoluten Pfaden
  • ALTER SYSTEM für Cluster-weite Konfiguration

Faustregel: so wenige Superuser wie möglich. Anwendungen sollten nie als Superuser laufen. Selbst Migrations-Tools brauchen meist nur CREATEDB oder gezielte Privilegien.

In Cloud-Postgres (RDS, Cloud SQL, Azure …) hast du keinen echten Superuser, sondern eine privilegierte Rolle (rds_superuser, cloudsqlsuperuser, …) — manche Operationen fehlen dort entsprechend.

CREATEDB und CREATEROLE

Beide klingen harmlos, sind es aber nur bedingt:

  • CREATEDB erlaubt CREATE DATABASE. Nützlich für Migrations-Tools, die eine Test-DB anlegen wollen, ohne Superuser zu sein.
  • CREATEROLE erlaubt das Anlegen, Ändern und Löschen anderer Rollen — inklusive Mitgliedschaften. Eine Rolle mit CREATEROLE darf andere Rollen ändern und so indirekt eskalieren. Bis PG 15 konnte sie sogar Superuser-Rechte vergeben (mit Tricks); seit PG 16 ist das eingeschränkt: CREATEROLE darf andere Rollen nur dann ändern, wenn sie als Admin der Ziel-Rolle eingetragen ist.

REPLICATION

Damit eine Rolle Streaming-Replikation aufbauen kann (für Read-Replicas oder logische Replikation auf Cluster-Ebene), braucht sie das REPLICATION-Attribut und einen passenden Eintrag in pg_hba.conf:

Bash pg_hba.conf-Eintrag fuer Replikation
host  replication  replicator  10.0.0.0/24  scram-sha-256

SUPERUSER impliziert REPLICATION automatisch — aber dedizierte Replikations-Rollen sollten eben nicht Superuser sein.

BYPASSRLS

Row-Level-Security-Policies (CREATE POLICY …) gelten für alle Rollen — außer Superuser und Rollen mit BYPASSRLS. Letzteres ist gedacht für Audit- oder Backup-Tools, die alles sehen müssen, ohne RLS-Filterung.

CONNECTION LIMIT

Begrenzt die parallel offenen Verbindungen pro Rolle. Default ist -1 (unbegrenzt). Praktisch, wenn man verhindern will, dass eine einzelne fehlerhafte Anwendung den ganzen Connection-Pool des Clusters blockiert.

SQL
ALTER ROLE app_user CONNECTION LIMIT 20;

Auch auf Datenbank-Ebene möglich: ALTER DATABASE myapp CONNECTION LIMIT 50;.

VALID UNTIL — Passwort-Ablauf

VALID UNTIL '2027-01-01' setzt ein Ablaufdatum für die Passwort-Authentifizierung. Nach diesem Zeitpunkt schlägt die Anmeldung fehl. Wichtig: das wirkt nur bei passwortbasierter Auth — peer, trust oder cert ignorieren das Attribut.

Häufige Stolperfallen

CREATE ROLE ohne LOGIN ist die Falle Nr. 1.

Du legst eine Rolle mit CREATE ROLE app PASSWORD 'secret' an, willst dich verbinden, und Postgres lehnt mit „is not permitted to log in“ ab. Default ist NOLOGIN. Entweder explizit LOGIN ergänzen oder gleich CREATE USER schreiben.

NOINHERIT bricht stille Annahmen.

Manche Tools (z. B. Migrations-Tools) gehen davon aus, dass Mitgliedschaft = Rechte. Mit NOINHERIT müssen sie SET ROLE … aufrufen, sonst bekommen sie „permission denied“. Vor dem Setzen von NOINHERIT prüfen, ob alle Werkzeuge im Stack das mitmachen.

CREATEROLE ist nicht gleich Superuser, aber gefährlich nahe dran.

Bis PG 15 konnte eine Rolle mit CREATEROLE faktisch Superuser-Rechte erlangen. Seit PG 16 ist das eingeschränkt — aber ein User mit CREATEROLE darf trotzdem viele Rollen ändern, Passwörter zurücksetzen und Mitgliedschaften umverteilen. Vergib das Attribut bewusst, nicht aus Bequemlichkeit.

In Cloud-Postgres existieren manche Attribute nicht oder sind eingeschränkt.

Auf RDS, Cloud SQL, Azure und ähnlichen Diensten kannst du keinen echten SUPERUSER anlegen. REPLICATION und BYPASSRLS sind oft nur über die Anbieter-eigene Admin-Rolle zugänglich. Vor dem Einsatz im Cloud-Kontext die Anbieter-Doku prüfen.

VALID UNTIL wirkt nur bei Passwort-Auth.

Wenn eine Rolle per peer, trust oder cert reinkommt, wird VALID UNTIL schlicht ignoriert. Wer Rotation erzwingen will, muss zusätzlich die Auth-Methode in pg_hba.conf konfigurieren — sonst lacht das Attribut nur auf dem Papier.

Attribute werden weder geerbt noch durch Mitgliedschaft transportiert.

Wenn app_user Mitglied von app_owner ist und letzterer CREATEDB hat, darf app_user trotzdem keine DB anlegen. Attribute sind rollen-individuell — nur Privilegien (GRANT) fließen über Membership. Häufige Frustquelle bei Gruppen-Patterns.

Weiterführende Ressourcen

Externe Quellen

/ Weiter

Zurück zu Server-Administration

Zur Übersicht