PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL - użytkownik DB powinien mieć możliwość wywoływania funkcji

Nie ma „uprawnień do SELECT ". Wszystko czego potrzebujesz to uprawnienie do WYKONAJ Funkcje. Odpowiednia funkcja może działać z SECURITY DEFINIERA odziedziczyć wszystkie przywileje właściciela. Aby ograniczyć możliwą eskalację uprawnień do minimum a priori, spraw, aby rola demona posiadała odpowiednie funkcje tylko z niezbędnymi uprawnieniami - nie jako superużytkownik!

Przepis

Jako superużytkownik...

Utwórz rolę niebędącą superużytkownikiem mójużytkownik .

CREATE ROLE myuser PASSWORD ...;

Utwórz rolę grupową mojagrupa i utwórz mójużytkownik członek w nim.

CREATE ROLE mygroup;
GRANT mygroup TO myuser;

Możesz dodać więcej użytkowników, tak jak myuser później.

Nie przyznawaj żadnych uprawnień do mojego użytkownika .
Przyznaj je tylko do mojagrupa :

  • UZNAJ POŁĄCZENIE Z BAZY DANYCH mydb DO mygroup;
  • ZGODA NA WYKORZYSTANIE SCHEMATU public DO mygroup;
  • ZEZWOLENIE NA WYKONANIE FUNKCJI foo() DO mygroup;

Usuń wszystkie uprawnienia dla public ten mójużytkownik nie powinien.

REVOKE ALL ON ALL TABLES IN SCHEMA myschema FROM public;

Może być więcej. Cytuję instrukcję:

Utwórz rolę demona do własności odpowiednie funkcje.

CREATE ROLE mydaemon;

Przyznaj mydaemonowi tylko uprawnienia niezbędne do wykonania tych funkcji , (w tym WYKONAJ FUNKCJĘ aby umożliwić wywołanie innej funkcji). Ponownie, możesz użyć ról grupowych, aby połączyć uprawnienia i przyznać je mydaemonowi

GRANT bundle1 TO mydaemon;

Ponadto możesz użyć DOMYŚLNE UPRAWNIENIA aby automatycznie nadać pewne uprawnienia dla przyszłych obiektów bezpośrednio do pakietu lub demona:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES    TO bundle1;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT USAGE  ON SEQUENCES TO bundle1;

Dotyczy to tylko roli, dla której jest wykonywany. Zgodnie z dokumentacją:

Aby objąć również istniejące wcześniej obiekty w schemacie (patrz komentarz Roba ):

GRANT SELECT ON ALL TABLES    IN SCHEMA public TO bundle1;
GRANT USAGE  ON ALL SEQUENCES IN SCHEMA public TO bundle1;

Utwórz mydaemona własne odpowiednie funkcje. Może wyglądać tak:

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 ..

###Note
Z powodu tego błędu w aktualnej wersji 1.16.1 pgAdmin niezbędne polecenie

REVOKE EXECUTE ON FUNCTION foo() FROM public;

brakuje w skrypcie DDL poddanym inżynierii wstecznej. Pamiętaj, aby dodać go podczas odtwarzania.
Ten błąd został naprawiony w obecnej wersji 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. Wywołanie niezdefiniowanej funkcji pg_connect() - Wamp

  2. ustaw puste hasło dla użytkownika PostgreSQL

  3. Zapytanie Railsowe typu danych Postgres JSON

  4. Generowanie szeregów czasowych między dwiema datami w PostgreSQL

  5. Używanie symfony z postgresql