Quali sono i privilegi richiesti per eseguire una funzione trigger in PostgreSQL 8.4?


11

Quali sono i privilegi richiesti per eseguire una funzione trigger in PostgreSQL 8.4?

Sembra che i privilegi impostati su un ruolo non siano importanti per eseguire una funzione di trigger. Penso di aver visto un giorno che i privilegi richiesti per eseguire una funzione di trigger sono il privilegio EXECUTE ma per il proprietario della tabella, non il ruolo effettivo che esegue l'azione che attiva il trigger che chiama la funzione di trigger.

Non riesco a trovare la parte della documentazione che spiega questo punto, qualche aiuto?

Risposte:


10

Le funzioni di trigger si comportano esattamente come le altre funzioni per quanto riguarda i privilegi. Con una piccola eccezione:

Per creare un trigger su una tabella, l'utente deve disporre del TRIGGER privilegio sulla tabella. L'utente deve inoltre disporre dei EXECUTEprivilegi sulla funzione trigger.

AGGIORNAMENTO Dopo il feedback nei commenti ho fatto alcune ricerche. C'è un oggetto TODO aperto nel Wiki di Postgres:

Stringere i controlli delle autorizzazioni di trigger

Collegato a questa discussione sugli hacker di Postgres . Attualmente, i EXECUTEprivilegi su una funzione di trigger vengono controllati solo al momento della creazione del trigger , ma non in fase di esecuzione. Quindi la revoca di EXECUTE sulla funzione trigger non ha alcun effetto su un trigger una volta creato. La tua osservazione sembra essere corretta.

Ciò non garantisce alcun privilegio aggiuntivo per manipolare gli oggetti. Se al ruolo chiamante mancano i privilegi necessari per eseguire (parti di) il corpo della funzione, viene sollevata la solita eccezione. Per aprire la strada, è possibile rendere un utente privilegiato OWNERdella funzione e utilizzare il

SECURITY DEFINER

clausola, come documentato nel manuale qui . Fa sì che la funzione venga eseguita con le autorizzazioni del proprietario anziché del chiamante (impostazione predefinita).

Se il proprietario è un superutente, devi prestare particolare attenzione a chi concedi il EXECUTEprivilegio e a cosa può fare la funzione per evitare abusi. Potresti volerlo

REVOKE ALL ON FUNCTION foo() FROM public;

per iniziare e utilizzare SET search_pathper la funzione.
Assicurati di leggere il capitolo sulle funzioni di scrittura in modo SECURITY DEFINERsicuro .

Trova un esempio di codice in questa risposta correlata su SO.


No, non voglio un SECURITY DEFINER, voglio un SECURITY INVOKER. Ma sembra (per la funzione trigger, non per la funzione normale) che utilizzando l'opzione predefinita ( SECURITY INVOKER), non si comporta in questo modo.

1
@EtienneRouxel: le funzioni trigger sono funzioni come altre funzioni per quanto riguarda i privilegi. Cosa ti fa pensare diversamente?
Erwin Brandstetter,

@EtienneRouxel: ho aggiunto un preventivo dal manuale per documentare un'eccezione minore.
Erwin Brandstetter,

1
Test: ho creato una semplice funzione di trigger che genera a NOTICE. Ho rimosso i ALLprivilegi da PUBLICe per il proprietario della funzione. Quindi, se uso il proprietario o qualsiasi altro ruolo che non ha alcun privilegio su quella funzione, dovrei aspettarmi un errore a causa della mancanza di privilegi, ma tutto funziona correttamente.

2
@EtienneRouxel: interessante. Ho anche testato. Non è possibile creare il trigger se non si dispone del privilegio di esecuzione per la funzione trigger. Ma puoi comunque revocare quel privilegio di esecuzione dopo aver creato il trigger e il trigger non smetterà di funzionare. Ho fatto delle ricerche. Aggiunta di collegamenti alla domanda ...
Erwin Brandstetter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.