Ich brauche eine strenge Kontrolle über das Lesen und Schreiben meiner Postgres-Daten. Aktualisierbare Ansichten haben immer eine sehr gute, strenge Kontrolle über das Lesen meiner Daten ermöglicht und es mir ermöglicht, wertvolle berechnete Spalten hinzuzufügen. Mit Postgres 9.5 row level security wurde eine neue und leistungsstarke Möglichkeit zur Kontrolle meiner Daten eingeführt. Aber ich kann nicht beide Technologien Ansichten und Zeilenebene Sicherheit zusammen verwenden. Warum?Warum ist die Sicherheit auf Zeilenebene für Postgres-Ansichten nicht aktiviert?
Antwort
Grundsätzlich, weil es nicht möglich war, nachträglich zu ändern, wie Ansichten funktionieren. Ich würde gerne in der Lage sein, SECURITY INVOKER
(oder gleichwertig) für Ansichten zu unterstützen, aber soweit ich weiß, gibt es kein solches Feature.
Sie können den Zugriff auf die Ansicht selbst normal mit Zeilensicherheit filtern.
In den Tabellen, auf die die Ansicht zugreift, werden auch die Sicherheitsregeln für Zeilen angewendet. Sie sehen jedoch die current_user
als View Creator, weil Ansichten auf Tabellen (und andere Ansichten) mit den Rechten des Benutzers zugreifen, der die Ansicht erstellt/besitzt.
Vielleicht lohnt es sich, dies auf pgsql-Hacker zu erhöhen, wenn Sie bereit sind, bei der Entwicklung der Funktion, die Sie benötigen, oder pgsql-general zu helfen?
Das heißt, während Ansichten auf Tabellen als Ersteller zugreifen und current_user
entsprechend ändern, verhindern sie nicht die Verwendung benutzerdefinierter GUCs, die session_user
oder andere kontextbezogene Informationen in Zeilensicherheitsrichtlinien. Sie können Zeilensicherheit mit Sichten verwenden, nur nicht (sinnvoll) zum Filtern basierend auf current_user
.
Wie würde es die Arbeit der View verändern? Ist RLS nicht grundsätzlich nur das Hinzufügen einiger "WHERE" -Klauseln? Und ist eine View nicht einfach eine SQL-Anweisung? – Calebmer
@Calebmer Zeigt Zugriffstabellen an, die von der Ansicht mit den Zugriffsrechten des Benutzers verwendet werden, der die Ansicht erstellt hat. Damit die Zeilensicherheit den Zugriff auf Tabellen, die über eine Ansicht auf der Grundlage des "Top Level" -Benutzers zugänglich sind, sinnvollerweise filtern kann, müsste der Zugriff der Ansichten auf die Tabellen in der Ansicht so geändert werden, dass "current_user" nicht gesetzt ist 'session_user', aber das ändert sich nicht, wenn Sie 'SESSION AUTHORIZATION' setzen, also ist es nicht sinnvoll, wenn Sie gepoolte Verbindungen über pgbouncer oder ähnliches verwenden. –
Wow .. das muss wirklich auf der Policies Dokumentationsseite erwähnt werden. Ich habe gerade dieses Problem in unserer Anwendung entdeckt, wo alle Tabellen in einem privaten Schema gefunden werden und sie nur der externen API über eine Ansicht in einem anderen Schema zur Verfügung gestellt werden. Da diese Ansicht vom Superuser erstellt wurde, war das RLS vollständig zerstört, obwohl es getestet wurde und gegen den realen Tisch funktionierte. – deinspanjer
Wenn Sie die Sicherheit auf Zeilenebene in der Tabelle aktivieren und dann die aktualisierbare Ansicht in der Tabelle verwenden, funktioniert die Sicherheit nicht? – mehmet
Nein, weil die Abfrage die durch die Sicht definierte Rolle durchläuft, nicht die aktuelle Rolle. – Calebmer
Wie richte ich dann die Sicherheit auf Zeilenebene für die definierte Rolle ein? – mehmet