Welche Berechtigungen sind erforderlich, um eine Triggerfunktion in PostgreSQL 8.4 auszuführen?

11

Welche Berechtigungen sind erforderlich, um eine Triggerfunktion in PostgreSQL 8.4 auszuführen?

Es scheint, dass die für eine Rolle festgelegten Berechtigungen für die Ausführung einer Triggerfunktion keine Rolle spielen. Ich glaube, ich habe eines Tages gesehen, dass die zum Ausführen einer Triggerfunktion erforderlichen Berechtigungen das EXECUTE-Privileg sind, aber für den Eigentümer der Tabelle nicht die tatsächliche Rolle, die die Aktion ausführt, die den Trigger auslöst, der die Triggerfunktion aufruft.

Ich kann den Dokumentationsteil, der diesen Punkt erklärt, nicht finden. Gibt es Hilfe?

Erwin Brandstetter
quelle

Antworten:

10

Triggerfunktionen verhalten sich in Bezug auf Berechtigungen genauso wie andere Funktionen. Mit einer kleinen Ausnahme:

Um einen Trigger für eine Tabelle zu erstellen, muss der Benutzer über die TRIGGER Berechtigung für die Tabelle verfügen . Der Benutzer muss auch über EXECUTEBerechtigungen für die Triggerfunktion verfügen.

UPDATE Nach dem Feedback in den Kommentaren habe ich einige Nachforschungen angestellt. Es gibt ein offenes TODO-Element im Postgres-Wiki:

Ziehen Sie die Triggerberechtigungsprüfungen fest

Verknüpft mit diesem Thread über Postgres-Hacker . Derzeit EXECUTEwerden Berechtigungen für eine Trigger - Funktion nur überprüft bei Trigger erstellen Zeit, aber nicht zur Laufzeit. Das Widerrufen von EXECUTE für die Triggerfunktion hat also keine Auswirkung auf einen einmal erstellten Trigger. Ihre Beobachtung scheint richtig zu sein.

Dies gewährt keine zusätzlichen Berechtigungen zum Bearbeiten von Objekten. Wenn der aufrufenden Rolle die Berechtigungen fehlen, die zum Ausführen (von Teilen) des Funktionskörpers erforderlich sind, wird die übliche Ausnahme ausgelöst. Um den Weg zu ebnen, können Sie einen privilegierten Benutzer OWNERder Funktion erstellen und die verwenden

SECURITY DEFINER

Klausel, wie im Handbuch hier dokumentiert . Dadurch wird die Funktion mit den Berechtigungen des Eigentümers anstelle des Aufrufers ausgeführt (Standard).

Wenn der Eigentümer ein Superuser ist, müssen Sie besonders vorsichtig sein, wem Sie das EXECUTEPrivileg gewähren und was die Funktion tun kann, um Missbrauch zu vermeiden. Du möchtest vielleicht

REVOKE ALL ON FUNCTION foo() FROM public;

zu Beginn und SET search_pathfür die Funktion verwenden.
Lesen Sie unbedingt das Kapitel über das sichere Schreiben von SECURITY DEFINERFunktionen .

Finden Sie ein Codebeispiel in dieser verwandten Antwort auf SO.

Erwin Brandstetter
quelle
Nein, ich will kein SECURITY DEFINER, ich will ein SECURITY INVOKER. Es scheint jedoch (für die Triggerfunktion, nicht für die reguläre Funktion), dass die Verwendung der Standardoption ( SECURITY INVOKER) nicht so funktioniert.
1
@EtienneRouxel: Triggerfunktionen sind Funktionen wie andere Funktionen, was Privilegien betrifft. Was lässt dich anders denken?
Erwin Brandstetter
@EtienneRouxel: Ich habe ein Zitat aus dem Handbuch hinzugefügt, um eine kleine Ausnahme zu dokumentieren.
Erwin Brandstetter
1
Testen: Ich habe eine einfache Triggerfunktion erstellt, die a auslöst NOTICE. Ich habe ALLBerechtigungen vom PUBLICund vom Eigentümer der Funktion entfernt. Wenn ich dann den Eigentümer oder eine andere Rolle verwende, die keine Berechtigung für diese Funktion hat, sollte ich einen Fehler aufgrund fehlender Berechtigungen erwarten, aber alles wird erfolgreich ausgeführt.
2
@ EtienneRouxel: Interessant. Ich habe auch getestet. Sie können den Trigger nicht erstellen, wenn Sie nicht über die Ausführungsberechtigung für die Triggerfunktion verfügen. Sie können dieses Ausführungsprivileg jedoch nach dem Erstellen des Triggers widerrufen, und der Trigger funktioniert nicht mehr. Ich habe etwas recherchiert. Links zur Frage
Erwin Brandstetter