In der Datenbank durchgesetzt

Wer in Fóir eine Zeile lesen oder ändern darf, entscheidet Postgres. Die Regeln werden einmal in einer Spezifikation geschrieben und zu Row-Level-Security-Policies kompiliert, sodass die Prüfung bei den Daten sitzt, unterhalb des Anwendungscodes.

Eine Spezifikation, kompiliert

Das Zugriffsmodell liegt in einer einzigen Spezifikationsdatei. Demesne, unser Open-Source-Compiler, macht daraus die Policies und die Datenbankfunktionen, die sie aufrufen. Das erzeugte SQL wird genau so ausgeliefert, wie der Compiler es geschrieben hat, und niemand bearbeitet es von Hand. Zum Zeitpunkt der Erstellung regelt es etwa hundert Tabellen.

Erzwungen und gegen das Live-Schema geprüft

Row-Level Security ist auf jeder verwalteten Tabelle sowohl aktiviert als auch erzwungen, wodurch der Weg geschlossen wird, auf dem der Eigentümer einer Tabelle an einer Policy vorbei liest. Ein Test liest beide Einstellungen aus dem Datenbankkatalog und schlägt fehl, wenn eine davon ausgeschaltet ist.

Ein zweiter Test listet jede Tabelle des Schemas auf und schlägt bei jeder fehl, die ohne dokumentierte Entscheidung darüber hinzugekommen ist, wie sie geschützt wird.

Was eine Anfrage erreichen kann

Eine Anfrage an die API wird unter diesen Policies bedient und trägt Workspace, Projekt und Organisation des Aufrufers als Claims, die die Datenbank liest. Die Policy jeder Tabelle vergleicht sie mit der Zeile, bevor irgendeine andere Regel betrachtet wird. Eine Zeile, die der Aufrufer nicht sehen darf, wirkt, als gäbe es sie nicht.

Wo die Anwendung entscheidet

Manche Aktionen kann die Datenbank nicht unterscheiden: Das Veröffentlichen eines Datensatzes ist für Postgres ein Update. Diese Berechtigungen werden geprüft, wenn die Anfrage eintrifft, und zwar gegen eine Map, die aus derselben Spezifikation erzeugt wird. Die Zeilenregeln begrenzen weiterhin, was die Aktion berühren kann.

So funktioniert es

Die Dokumentation behandelt Eigentümerschaft, Sichtbarkeit, Grants und die Auflösung einer Anfrage für jede Art von Zugangsdaten.