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.