Det finns ingen "behörighet på SELECT
". Allt du behöver är behörigheten att EXECUTE
funktioner. Relevant funktion kan köras med SÄKERHET DEFINERAR
att ärva ägarens alla privilegier. För att begränsa möjlig privilegieskalering till ett minimum a priori, gör en demonroll till relevanta funktioner med endast de nödvändiga privilegierna - inte en superanvändare!
Recept
Som superanvändare ...
Skapa en icke-superanvändarroll myuser
.
CREATE ROLE myuser PASSWORD ...;
Skapa en grupproll mingrupp
och gör myuser
medlem i den.
CREATE ROLE mygroup;
GRANT mygroup TO myuser;
Du kanske vill lägga till fler användare precis som minanvändare
senare.
Ge inga privilegier alls till minanvändare
.
Ge dessa endast till min grupp
:
GIVE CONNECT ON DATABASE mydb TILL mygroup;
BEHANDLA ANVÄNDNING PÅ SCHEMA public TO mygroup;
GIVNA UTFÖR PÅ FUNKTION foo() TILL min grupp;
Ta bort alla privilegier för public
den minanvändare
borde inte ha.
REVOKE ALL ON ALL TABLES IN SCHEMA myschema FROM public;
Det kan finnas fler. Jag citerar manualen:
Skapa en demonroll att äga relevanta funktioner.
CREATE ROLE mydaemon;
Ge endast behörigheter som är nödvändiga för att utföra dessa funktioner till mydaemon
, (inklusive UTFÖR FUNKTION
för att tillåta att en annan funktion anropas). Återigen kan du använda grupproller för att bunta privilegier och ge dem till mydaemon
GRANT bundle1 TO mydaemon;
Dessutom kan du använda STANDARDPRIVILEGIER
kod>
för att automatiskt ge vissa privilegier för framtida objekt till en bunt eller demonen direkt:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO bundle1;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT USAGE ON SEQUENCES TO bundle1;
Detta gäller endast den roll som den utförs för. Enligt dokumentationen:
För att även täcka redan existerande objekt i schemat (se Robs kommentar ):
GRANT SELECT ON ALL TABLES IN SCHEMA public TO bundle1;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO bundle1;
Gör mydaemon
egna relevanta funktioner. Kan se ut så här:
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
På grund av det här felet
i den nuvarande versionen 1.16.1 av pgAdmin
det nödvändiga kommandot
REVOKE EXECUTE ON FUNCTION foo() FROM public;
saknas i det omvänt konstruerade DDL-skriptet. Kom ihåg att lägga till det när du återskapar.
Det här felet är åtgärdat i den nuvarande versionen pgAdmin 1.18.1.