sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL - DB-bruger bør kun have lov til at kalde funktioner

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.




  1. SQL:Styrer hvor mange poster der returneres

  2. Wildcard-søgning i MySQL fuldtekstsøgning

  3. Hvad er forskellen mellem JOIN og CROSS JOIN i SQL?

  4. Kombination af SUM(), GROUP_BY() og LEFT_JOIN() giver forkerte resultater:hvordan rettes det?