SELECT nemá žádné "privilegium". Vše, co potřebujete, je oprávnění EXECUTE funkcí. Příslušnou funkci lze spustit s SECURITY DEFINOVAČ
zdědit všechna privilegia vlastníka. Chcete-li a priori omezit možnou eskalaci oprávnění na minimum, udělejte roli démona vlastní relevantní funkce pouze s nezbytnými oprávněními – nikoli superuživatel!
Recept
Jako superuživatel ...
Vytvořte roli bez superuživatele myuser .
CREATE ROLE myuser PASSWORD ...;
Vytvořte skupinovou roli mygroup a udělejte myuser členem.
CREATE ROLE mygroup;
GRANT mygroup TO myuser;
Možná budete chtít přidat další uživatele, jako je myuser později.
Neudělujte vůbec žádná oprávnění na myuser .
Udělte je pouze mygroup :
UDĚLEJTE PŘIPOJENÍ NA DATABÁZI mydb TO mygroup;UDĚLEJTE POUŽITÍ NA SCHÉMATU veřejné skupině mygroup;GRANT EXECUTE ON FUNCTION foo() TO mygroup;
Odebrat vše oprávnění pro veřejné že myuser neměl.
REVOKE ALL ON ALL TABLES IN SCHEMA myschema FROM public;
Může jich být víc. Cituji manuál:
Vytvořte roli démona vlastnit relevantní funkce.
CREATE ROLE mydaemon;
mydaemon udělte pouze oprávnění nezbytná k provádění těchto funkcí , (včetně EXECUTE ON FUNCTION aby bylo možné volat jinou funkci). Opět můžete použít skupinové role k seskupení oprávnění a jejich udělení mydaemon
GRANT bundle1 TO mydaemon;
Kromě toho můžete použít VÝCHOZÍ PRIVILEGIA
k automatickému udělení určitých oprávnění pro budoucí objekty přímo balíčku nebo démonu:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO bundle1;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT USAGE ON SEQUENCES TO bundle1;
To platí pouze pro roli, pro kterou je vykonáván. Podle dokumentace:
Chcete-li také pokrýt již existující objekty ve schématu (viz robův komentář ):
GRANT SELECT ON ALL TABLES IN SCHEMA public TO bundle1;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO bundle1;
Vytvořte mydaemon vlastní relevantní funkce. Mohlo by to vypadat takto:
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
Kvůli této chybě
v aktuální verzi 1.16.1 pgAdmin
potřebný příkaz
REVOKE EXECUTE ON FUNCTION foo() FROM public;
chybí v reverzním inženýrství skriptu DDL. Nezapomeňte ji přidat při opětovném vytváření.
Tato chyba je opravena v aktuální verzi pgAdmin 1.18.1.