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.