Tidak ada "hak istimewa di SELECT
". Yang Anda butuhkan hanyalah hak istimewa untuk EXECUTE
fungsi. Fungsi yang relevan dapat dijalankan dengan SECURITY DEFINER
untuk mewarisi semua hak istimewa dari pemiliknya. Untuk membatasi kemungkinan eskalasi hak istimewa ke minimum apriori, buat peran daemon memiliki fungsi yang relevan hanya dengan hak istimewa yang diperlukan - bukan pengguna super!
Resep
Sebagai pengguna super ...
Buat peran non-pengguna super myuser
.
CREATE ROLE myuser PASSWORD ...;
Buat peran grup mygroup
dan buat myuser
anggota di dalamnya.
CREATE ROLE mygroup;
GRANT mygroup TO myuser;
Anda mungkin ingin menambahkan lebih banyak pengguna seperti myuser
nanti.
Jangan jangan berikan hak istimewa sama sekali ke myuser
.
Hanya berikan ini ke mygroup
:
GRANT CONNECT ON DATABASE mydb TO mygroup;
GRANT USAGE ON SCHEMA public TO mygroup;
GRANT EXECUTE ON FUNCTION foo() TO mygroup;
Hapus semua hak istimewa untuk public
myuser
seharusnya tidak.
REVOKE ALL ON ALL TABLES IN SCHEMA myschema FROM public;
Mungkin ada lebih banyak. Saya mengutip manualnya:
Buat peran daemon untuk memiliki fungsi yang relevan.
CREATE ROLE mydaemon;
Berikan hanya hak istimewa yang diperlukan untuk menjalankan fungsi ini ke mydaemon
, (termasuk EXECUTE ON FUNCTION
untuk memungkinkan fungsi lain dipanggil). Sekali lagi, Anda dapat menggunakan peran grup untuk menggabungkan hak istimewa dan memberikannya ke mydaemon
GRANT bundle1 TO mydaemon;
Selain itu, Anda dapat menggunakan DEFAULT PRIVILEGES
untuk secara otomatis memberikan hak istimewa tertentu untuk objek masa depan ke bundel atau daemon secara langsung:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO bundle1;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT USAGE ON SEQUENCES TO bundle1;
Ini hanya berlaku untuk peran yang dijalankannya. Sesuai dokumentasi:
Untuk juga mencakup objek yang sudah ada sebelumnya dalam skema (lihat komentar rampok ):
GRANT SELECT ON ALL TABLES IN SCHEMA public TO bundle1;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO bundle1;
Buat mydaemon
memiliki fungsi yang relevan. Bisa terlihat seperti ini:
CREATE OR REPLACE FUNCTION foo()
...
SECURITY DEFINER SET search_path = myschema, pg_temp;
ALTER FUNCTION foo() OWNER TO mydaemon;
REVOKE EXECUTE ON FUNCTION foo() FROM public;
GRANT EXECUTE ON FUNCTION foo() TO mydaemon;
GRANT EXECUTE ON FUNCTION foo() TO mygroup;
-- possibly others ..
###Catatan
Karena bug ini
dalam versi 1.16.1 saat ini dari pgAdmin
perintah yang diperlukan
REVOKE EXECUTE ON FUNCTION foo() FROM public;
tidak ada dalam skrip DDL rekayasa balik. Ingatlah untuk menambahkannya, saat membuat ulang.
Bug ini diperbaiki di versi saat ini pgAdmin 1.18.1.