Jakie uprawnienia są wymagane do wykonania funkcji wyzwalacza w PostgreSQL 8.4?

11

Jakie uprawnienia są wymagane do wykonania funkcji wyzwalacza w PostgreSQL 8.4?

Wygląda na to, że uprawnienia przypisane roli nie mają znaczenia, aby wykonać funkcję wyzwalacza. Wydaje mi się, że widziałem kiedyś, że uprawnienia wymagane do wykonania funkcji wyzwalacza są uprawnieniem WYKONAJ, ale dla właściciela tabeli nie jest to rzeczywista rola, która wykonuje akcję wyzwalającą wyzwalacz wywołujący funkcję wyzwalacza.

Nie mogę znaleźć części dokumentacji, która wyjaśnia ten punkt, jakaś pomoc?

Erwin Brandstetter
źródło

Odpowiedzi:

10

Funkcje wyzwalacza zachowują się tak samo, jak inne funkcje w zakresie uprawnień. Z drobnym wyjątkiem:

Aby utworzyć wyzwalacz dla tabeli, użytkownik musi mieć TRIGGER uprawnienia do tabeli. Użytkownik musi również mieć EXECUTEuprawnienia do funkcji wyzwalacza.

AKTUALIZACJA Po otrzymaniu opinii w komentarzach przeprowadziłem kilka badań. Na Wiki Postgres jest otwarty element DO ZROBIENIA:

Zaostrz sprawdzanie uprawnień do wyzwalania

Powiązany z tym wątkiem na temat hakerów Postgres . Obecnie EXECUTEuprawnienia do funkcji wyzwalacza są sprawdzane tylko w czasie tworzenia wyzwalacza , ale nie w czasie wykonywania. Dlatego odwołanie instrukcji EXECUTE w funkcji wyzwalacza nie ma wpływu na wyzwalacz po utworzeniu. Twoja obserwacja wydaje się poprawna.

Nie daje to żadnych dodatkowych uprawnień do manipulowania obiektami. Jeśli rola wywołująca nie ma uprawnień niezbędnych do wykonania (części) treści funkcji, zgłaszany jest zwykły wyjątek. Aby utorować drogę, możesz uczynić uprzywilejowanego użytkownika OWNERfunkcji i użyć

SECURITY DEFINER

klauzula, jak udokumentowano w tym podręczniku tutaj . Powoduje, że funkcja jest uruchamiana z uprawnieniami właściciela zamiast wywołującego (domyślnie).

Jeśli właściciel jest superużytkownikiem, musisz szczególnie uważać, komu udzielasz EXECUTEuprawnienia i co funkcja może zrobić, aby uniknąć nadużyć. Może chcesz

REVOKE ALL ON FUNCTION foo() FROM public;

na początek i użyj SET search_pathfunkcji.
Przeczytaj rozdział Bezpieczne pisanie SECURITY DEFINERfunkcji .

Znajdź przykładowy kod w tej pokrewnej odpowiedzi na SO.

Erwin Brandstetter
źródło
Nie, nie chcę SECURITY DEFINER, chcę SECURITY INVOKER. Ale wydaje się (dla funkcji wyzwalacza, a nie dla zwykłej funkcji), że użycie domyślnej opcji ( SECURITY INVOKER) nie zachowuje się tak.
1
@EtienneRouxel: funkcje wyzwalające są funkcjami podobnymi do innych funkcji, jeśli chodzi o uprawnienia. Co sprawia, że ​​myślisz inaczej?
Erwin Brandstetter
@EtienneRouxel: Dodałem cytat z instrukcji, aby udokumentować niewielki wyjątek.
Erwin Brandstetter
1
Testowanie: Stworzyłem prostą funkcję wyzwalacza, która podnosi NOTICE. Usunąłem ALLuprawnienia od PUBLICi od właściciela funkcji. Następnie, jeśli użyję właściciela lub innej roli, która nie ma żadnych uprawnień do tej funkcji, powinienem oczekiwać błędu z powodu braku uprawnień, ale wszystko działa poprawnie.
2
@EtienneRouxel: Ciekawe. Też testowałem. Nie można utworzyć wyzwalacza, jeśli nie masz uprawnień do wykonywania funkcji wyzwalacza. Ale nadal możesz odwołać to uprawnienie do wykonywania po utworzeniu wyzwalacza, a wyzwalacz nie przestanie działać. Zrobiłem trochę badań. Dodawanie linków do pytania ...
Erwin Brandstetter,