Apa hak istimewa yang diperlukan untuk menjalankan fungsi pemicu di PostgreSQL 8.4?

11

Apa hak istimewa yang diperlukan untuk menjalankan fungsi pemicu di PostgreSQL 8.4?

Tampaknya hak istimewa yang ditetapkan untuk suatu peran tidak masalah untuk menjalankan fungsi pemicu. Saya pikir saya telah melihat suatu hari bahwa hak istimewa yang diperlukan untuk menjalankan fungsi pemicu adalah hak istimewa EXECUTE tetapi untuk pemilik tabel, bukan peran sebenarnya yang melakukan tindakan yang menembakkan pemicu yang memanggil fungsi pemicu.

Saya tidak dapat menemukan bagian dokumentasi yang menjelaskan poin itu, ada bantuan?

Erwin Brandstetter
sumber

Jawaban:

10

Fungsi pemicu berperilaku seperti fungsi lainnya sejauh menyangkut hak istimewa. Dengan pengecualian kecil:

Untuk membuat pemicu di atas meja, pengguna harus memiliki TRIGGER hak istimewa di atas meja. Pengguna juga harus memiliki EXECUTEhak istimewa pada fungsi pemicu.

UPDATE Setelah umpan balik dalam komentar saya melakukan riset. Ada item TODO terbuka di Postgres Wiki:

Kencangkan cek izin pemicu

Ditautkan ke utas ini di peretas Postgres . Saat ini, EXECUTEhak istimewa pada fungsi pemicu hanya diperiksa pada pemicu membuat waktu, tapi tidak pada saat runtime. Jadi mencabut EXECUTE pada fungsi pemicu tidak berpengaruh pada pemicu yang pernah dibuat. Pengamatan Anda tampaknya benar.

Ini tidak memberikan hak tambahan apa pun untuk memanipulasi objek. Jika peran panggilan tidak memiliki hak istimewa yang diperlukan untuk mengeksekusi (bagian dari) badan fungsi, pengecualian biasa dinaikkan. Untuk membuka jalan, Anda dapat membuat pengguna OWNERfungsi yang istimewa dan menggunakan

SECURITY DEFINER

klausa, seperti yang didokumentasikan dalam manual di sini . Ini menyebabkan fungsi dijalankan dengan izin pemilik dan bukan penyerang (default).

Jika pemiliknya adalah pengguna super, Anda harus ekstra hati-hati dengan siapa Anda memberikan EXECUTEhak istimewa dan apa fungsi yang dapat dilakukan untuk menghindari penyalahgunaan. Anda mungkin mau

REVOKE ALL ON FUNCTION foo() FROM public;

untuk memulai dan menggunakan SET search_pathuntuk fungsi.
Pastikan untuk membaca bab tentang Fungsi Menulis dengan SECURITY DEFINERAman .

Temukan contoh kode dalam jawaban terkait ini di SO.

Erwin Brandstetter
sumber
Tidak, saya tidak mau SECURITY DEFINER, saya ingin SECURITY INVOKER. Tetapi tampaknya (untuk fungsi pemicu, bukan untuk fungsi biasa) bahwa dengan menggunakan opsi default ( SECURITY INVOKER), ia tidak bertindak seperti itu.
1
@ EtienneRouxel: fungsi pemicu adalah fungsi seperti fungsi lainnya sejauh menyangkut hak istimewa. Apa yang membuat Anda berpikir sebaliknya?
Erwin Brandstetter
@ EtienneRouxel: Saya menambahkan kutipan dari manual untuk mendokumentasikan pengecualian kecil.
Erwin Brandstetter
1
Pengujian: Saya membuat fungsi pemicu sederhana yang memunculkan a NOTICE. Saya menghapus ALLhak istimewa dari PUBLICdan dari pemilik fungsi. Kemudian, jika saya menggunakan pemilik atau peran lain yang tidak memiliki hak istimewa pada fungsi itu, saya harus mengharapkan kesalahan karena kurangnya hak istimewa tetapi semuanya berjalan dengan sukses.
2
@EtienneRouxel: Menarik. Saya juga diuji. Anda tidak dapat membuat pelatuk jika Anda tidak memiliki hak istimewa eksekusi untuk fungsi pelatuk. Tapi Anda masih bisa mencabut hak istimewa eksekusi setelah membuat pemicu dan pemicu tidak akan berhenti berfungsi. Saya melakukan riset. Menambahkan tautan ke pertanyaan ...
Erwin Brandstetter