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
| Attribut | Default | Wirkung |
|---|---|---|
LOGIN / NOLOGIN | NOLOGIN | Darf sich anmelden? CREATE USER setzt LOGIN automatisch. |
INHERIT / NOINHERIT | INHERIT | Erbt die Rolle automatisch Rechte ihrer Mitgliedsrollen oder erst nach SET ROLE? |
SUPERUSER / NOSUPERUSER | NOSUPERUSER | Umgeht alle Berechtigungschecks. Sehr mächtig. |
CREATEDB / NOCREATEDB | NOCREATEDB | Darf neue Datenbanken anlegen. |
CREATEROLE / NOCREATEROLE | NOCREATEROLE | Darf neue Rollen anlegen, ändern, droppen. |
REPLICATION / NOREPLICATION | NOREPLICATION | Darf Streaming-Replikation betreiben (Walsender starten). |
BYPASSRLS / NOBYPASSRLS | NOBYPASSRLS | Umgeht Row-Level-Security-Policies. |
CONNECTION LIMIT n | -1 (unlimited) | Maximal gleichzeitige Verbindungen für diese Rolle. |
PASSWORD '…' / PASSWORD NULL | NULL | Passwort. NULL deaktiviert Passwort-Auth komplett. |
VALID UNTIL 'timestamp' | unlimited | Ablaufzeitpunkt für Passwort-Authentifizierung. |
Setzen kann man sie alle bei CREATE ROLE, ändern später mit ALTER ROLE:
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 RechtLOGIN / 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:
psql: error: connection to server on socket "..." failed:
FATAL: role "devs" is not permitted to log inCREATE 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:
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;
-- OKNOINHERIT 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 PfadenALTER SYSTEMfü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:
CREATEDBerlaubtCREATE DATABASE. Nützlich für Migrations-Tools, die eine Test-DB anlegen wollen, ohne Superuser zu sein.CREATEROLEerlaubt das Anlegen, Ändern und Löschen anderer Rollen — inklusive Mitgliedschaften. Eine Rolle mitCREATEROLEdarf 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:CREATEROLEdarf 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:
host replication replicator 10.0.0.0/24 scram-sha-256SUPERUSER 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.
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
- Role Attributes – PostgreSQL Documentation
- CREATE ROLE – PostgreSQL Documentation
- ALTER ROLE – PostgreSQL Documentation
- Predefined Roles – PostgreSQL Documentation
- Release Notes 16: CREATEROLE-Restrictions