Wer Geschäftsanwendungen für geschäftskritische Lösungen baut, kennt das Problem: Berechtigungslogik verteilt sich schnell über den gesamten Code. Jede Abfrage, jeder Service, jeder Endpunkt muss wissen, welcher Benutzer welche Daten sehen darf. Das funktioniert, solange alle daran denken.
Das Problem mit Berechtigungslogik im Anwendungscode
In vielen Systemen liegt die Verantwortung für die Einhaltung der Zugriffskontrolle ausschliesslich beim Entwickler. Er schreibt seine Datenbankabfrage und setzt manuell einen Filter, damit nur die relevanten Daten in den Applikationscode gelangen. Vielleicht ein WHERE auf die Organisationseinheit, vielleicht ein Annotation im Repository-Layer. Jeder Entwickler, der eine neue Abfrage schreibt, muss diese Regeln kennen und korrekt umsetzen.
Das kann schnell schief gehen. Ein neuer Endpunkt wird gebaut, der Filter fehlt, und plötzlich sieht ein Sachbearbeiter Daten aus einer anderen Abteilung. Für eine sichere Applikation braucht es einen Ansatz, der nicht davon abhängt, dass jeder Entwickler an jeder Stelle alles richtig macht.
Die Berechtigungslogik wird auf jede Datenbankabfrage automatisch angewendet. So kann nichts vergessen gehen.
Unser Ansatz: Regeln unterhalb der Applikation
Regelwerk ist ein Framework, das wir bei Inventage entwickelt haben. Die Idee ist einfach: Zugriffsregeln werden nicht im Anwendungscode implementiert, sondern als dedizierter Security-Layer zwischen Applikationscode und Datenbank durchgesetzt. Jede Datenbankabfrage wird automatisch gefiltert, bevor sie die Datenbank erreicht.
Die Regeln sind zentral in einer XML-Konfiguration deklarativ definiert. Dort steht zum Beispiel: Ein Mitarbeiter sieht nur Datensätze seiner eigenen Organisationseinheit. Oder: Das Feld Gehalt wird für alle Rollen ausser HR maskiert. Diese Regeln gelten für jede Abfrage, egal woher, ob sie aus einem REST-Endpunkt kommt oder aus einem GraphQL-Endpunkt.
Das Entscheidende ist, was das für den Entwickler bedeutet. Er schreibt seine Abfragen ganz normal. Er muss sich nicht darum kümmern, ob der aktuelle Benutzer die Daten sehen darf. Regelwerk erledigt das automatisch. Der Entwickler kann die Filterung nicht vergessen, weil er sie gar nicht selbst einbauen muss.
Wie es technisch funktioniert
Die aktuelle Implementation von Regelwerk ist mit jOOQ integriert, einem typsicheren SQL-Builder für Java. jOOQ bietet eine Listener-Architektur, die es erlaubt, jede SQL-Abfrage abzufangen und zu verändern, bevor sie ausgeführt wird. Regelwerk nutzt diesen Mechanismus als Interceptor.
Konkret passiert Folgendes: Eine Applikation nutzt einen SQL Befehl. Bevor jOOQ das SQL jedoch an die Datenbank schickt, greift Regelwerk ein. Es liest die konfigurierten Regeln für die betroffenen Tabellen und den aktuellen Benutzerkontext, ergänzt die passenden WHERE-Klauseln und maskiert Felder, die der Benutzer nicht sehen darf. Die Applikation bekommt nur die Daten zurück, die sie sehen darf.
Das funktioniert analog zu Row-Level Security auf Datenbankebene, mit einem wichtigen Unterschied: Die Regeln leben in der Applikation und haben Zugriff auf den fachlichen Kontext. Datenbank-RLS kennt nur DB-Session-Variablen wie den aktuellen Datenbankbenutzer. Regelwerk hingegen läuft im Applikationskontext und weiss, zu welcher Organisationseinheit der eingeloggte Benutzer gehört, welche fachliche Rolle er hat, in welcher Abteilung er arbeitet. Wir können nach beliebigen fachlichen Kriterien filtern. Das geht weit über das hinaus, was Datenbanken nativ anbieten.
Regeln definieren ohne Code
Die Zugriffsregeln müssen nicht im XML von Hand geschrieben werden. Die Regelwerk App bietet eine grafische Oberfläche, in der Regeln erstellt, bearbeitet und analysiert werden können. Welche Rolle sieht welche Tabellen, welche Spalten werden maskiert, welche Selektoren greifen. Das lässt sich direkt in der App konfigurieren, ohne eine Zeile Code zu schreiben.

Sicherheit als Architekturentscheid
Sicherheit, die davon abhängt, dass jeder Entwickler an jeder Stelle alles richtig macht, ist keine Sicherheit. Regelwerk verlagert die Zugriffskontrolle von einer Entwickleraufgabe zu einem Architekturentscheid. Der Entwickler schreibt seine Queries, Regelwerk kümmert sich um den Rest.
Gerade bei der heute immer stärkeren Nutzung von KI Werkzeugen für die Programmierung ist der architekturbasierte Ansatz der Berechtigungslogik von grosser Wichtigkeit. Die Möglichkeit von halluziniertem Code darf niemals zu einer Sicherheitsbedrohung führen.
Mehr zu Regelwerk auf regelwerk.com.
