PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL - Pengguna DB hanya boleh memanggil fungsi

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbedaan antara indeks GiST dan GIN

  2. Deklarasikan variabel tipe komposit di PostgreSQL menggunakan %TYPE

  3. postgresql createb dan CREATE DATABASE menghasilkan database yang tidak kosong. apa garpu?

  4. Agregat tidak diizinkan dalam klausa WHERE dalam kesalahan postgreSQL

  5. Penulisan kerangka data ke Postgresql berkinerja buruk