Der er ingen "privilegium på SELECT
". Alt du behøver er privilegiet til at EXECUTE
funktioner. Relevant funktion kan køre med SIKKERHED DEFINER
at arve alle ejerens privilegier. For at begrænse mulig privilegieeskalering til et minimum a priori, lav en dæmonrolle til at eje relevante funktioner med kun de nødvendige privilegier - ikke en superbruger!
Opskrift
Som superbruger ...
Opret en ikke-superbrugerrolle myuser
.
CREATE ROLE myuser PASSWORD ...;
Opret en grupperolle mygroup
og lav myuser
medlem af den.
CREATE ROLE mygroup;
GRANT mygroup TO myuser;
Du ønsker måske at tilføje flere brugere ligesom myuser
senere.
Giv ikke nogen privilegier overhovedet til min bruger
.
Giv kun disse til min gruppe
:
GIV FORBINDELSE PÅ DATABASE mydb TIL min gruppe;
GIV BRUG PÅ SCHEMA offentlig TIL min gruppe;
GIV UDFØR PÅ FUNKTION foo() TIL min gruppe;
Fjern alle privilegier for offentlige
den myuser
burde ikke have.
REVOKE ALL ON ALL TABLES IN SCHEMA myschema FROM public;
Der kan være flere. Jeg citerer manualen:
Opret en dæmonrolle at eje relevante funktioner.
CREATE ROLE mydaemon;
Giv kun privilegier, der er nødvendige for at udføre disse funktioner til mydaemon
, (inklusive UDFØR PÅ FUNKTION
for at tillade, at en anden funktion kaldes). Igen kan du bruge grupperoller til at samle privilegier og give dem til mydaemon
GRANT bundle1 TO mydaemon;
Derudover kan du bruge STANDARDPRIVILEGIER
kode>
for automatisk at give visse privilegier til fremtidige objekter til en bundle eller dæmonen direkte:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO bundle1;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT USAGE ON SEQUENCES TO bundle1;
Dette gælder kun for den rolle, den udføres for. Ifølge dokumentationen:
For også at dække allerede eksisterende objekter i skemaet (se robs kommentar ):
GRANT SELECT ON ALL TABLES IN SCHEMA public TO bundle1;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO bundle1;
Lav mydaemon
egne relevante funktioner. Kunne se sådan ud:
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 ..
###Bemærk
På grund af denne fejl
i den nuværende version 1.16.1 af pgAdmin
den nødvendige kommando
REVOKE EXECUTE ON FUNCTION foo() FROM public;
mangler i det omvendt manipulerede DDL-script. Husk at tilføje det, når du genskaber.
Denne fejl er rettet i den nuværende version pgAdmin 1.18.1.