sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL - DB-användare ska endast tillåtas anropa funktioner

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.




  1. Använda String[] selectionArgs i SQLiteDatabase.query()

  2. PHP mysql automatisk infoga tidsstämpel

  3. MYSQL LEFT JOIN FEL RESULTAT

  4. månader mellan två datum i sql server med start- och slutdatum för var och en av dem i sql server