Які привілеї потрібні для виконання функції тригера в PostgreSQL 8.4?


11

Які привілеї потрібні для виконання функції тригера в PostgreSQL 8.4?

Здається, що привілеї, встановлені для ролі, не мають значення для виконання тригерної функції. Я думаю, що я бачив одного дня, що привілеї, необхідні для виконання функції тригера, є привілеєм EXECUTE, але для власника таблиці, а не фактичної ролі, яка виконує дію, яка спрацьовує тригер, який викликає функцію тригера.

Я не можу знайти документаційну частину, яка пояснює цю точку, будь-яку допомогу?

Відповіді:


10

Функції тригера поводяться так само, як і інші функції, що стосується привілеїв. За незначним винятком:

Щоб створити тригер на столі, користувач повинен мати TRIGGER привілей на стіл. Користувач також повинен мати EXECUTEпривілей на функцію тригера.

ОНОВЛЕННЯ Після відгуків у коментарях я провів кілька досліджень. У Вікі Postgres є відкритий пункт TODO:

Затягніть перевірки дозволу на тригер

Пов’язане з цією темою на хакерах Postgres . В даний час EXECUTEпривілеї функції тригера перевіряються лише під час створення тригера , але не під час виконання. Таким чином, відкликання EXECUTE на функцію тригера не впливає на щойно створений тригер. Ваше спостереження здається правильним.

Це не дає додаткових привілеїв для маніпулювання об'єктами. Якщо в ролі виклику відсутні привілеї, необхідні для виконання (частин) тіла функції, звичайний виняток піднімається. Щоб прокласти шлях, ви можете зробити привілейованого користувача OWNERфункції та використовувати

SECURITY DEFINER

пункт, як це зафіксовано в посібнику, розміщеному тут . Це призводить до запуску функції з дозволами власника замість виклику (за замовчуванням).

Якщо власник є супер-користувачем, вам потрібно бути особливо обережним, кому ви надаєте EXECUTEпривілей, і що функція може зробити, щоб уникнути зловживань. Ви можете захотіти

REVOKE ALL ON FUNCTION foo() FROM public;

для початку і використання SET search_pathдля функції.
Обов’язково прочитайте розділ про написання SECURITY DEFINERфункцій .

Знайдіть приклад коду в цій відповіді на відповідь.


Ні, я не хочу SECURITY DEFINER, я хочу SECURITY INVOKER. Але здається (для функції тригера, а не для звичайної функції), що використовуючи параметр за замовчуванням ( SECURITY INVOKER), він не діє так.

1
@EtienneRouxel: тригерні функції - це функції, як і інші функції, що стосуються привілеїв. Що змушує вас думати інакше?
Ервін Брандстеттер

@EtienneRouxel: Я додав форму керівництва цитатою, щоб документувати незначний виняток.
Ервін Брандстеттер

1
Тестування: Я створив просту функцію запуску, яка піднімає a NOTICE. Я видалив ALLпривілеї з PUBLICі від власника функції. Тоді, якщо я використовую власника або будь-яку іншу роль, яка не має привілеїв на цю функцію, я повинен очікувати помилки через відсутність привілеїв, але все працює успішно.

2
@EtienneRouxel: Цікаво. Я також тестував. Ви не можете створити тригер, якщо у вас немає привілею виконання функції тригера. Але ви все одно можете відкликати привілей виконання після створення тригера, і тригер не перестане працювати. Я провів деякі дослідження. Додавання посилань на питання ...
Ервін Брандштеттер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.