sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL - DB-gebruiker mag alleen functies aanroepen

Er is geen "privilege op SELECT ". Alles wat je nodig hebt is het recht om UITVOEREN functies. Relevante functie kan worden uitgevoerd met SECURITY DEFINER om alle privileges van de eigenaar te erven. Om mogelijke escalatie van bevoegdheden tot een minimum a priori te beperken, moet een daemon-rol eigenaar zijn van relevante functies met alleen de benodigde bevoegdheden - geen superuser!

Recept

Als supergebruiker ...

Maak een niet-superuser-rol mijngebruiker .

CREATE ROLE myuser PASSWORD ...;

Maak een groepsrol mijngroep en maak mijngebruiker lid erin.

CREATE ROLE mygroup;
GRANT mygroup TO myuser;

Misschien wilt u meer gebruikers toevoegen, zoals mijngebruiker later.

Geef helemaal geen privileges naar mijngebruiker .
Verleen deze alleen aan mijngroep :

  • VERBINDING VERBINDEN OP DATABASE mydb NAAR mygroup;
  • VERLENEN GEBRUIK OP SCHEMA openbaar AAN mijngroep;
  • VERLENEN UITVOERING OP FUNCTIE foo() AAN mijngroep;

Verwijder alle privileges voor publiek die mijngebruiker niet had moeten doen.

REVOKE ALL ON ALL TABLES IN SCHEMA myschema FROM public;

Er kan meer zijn. Ik citeer de handleiding:

Maak een daemonrol te bezitten relevante functies.

CREATE ROLE mydaemon;

Verleen alleen privileges die nodig zijn om deze functies uit te voeren aan mydaemon , (inclusief UITVOEREN OP FUNCTIE om het aanroepen van een andere functie mogelijk te maken). Nogmaals, je kunt groepsrollen gebruiken om privileges te bundelen en ze toe te kennen aan mydaemon

GRANT bundle1 TO mydaemon;

Daarnaast kunt u STANDAARDPRIVILEGES om automatisch bepaalde rechten voor toekomstige objecten rechtstreeks aan een bundel of de daemon toe te kennen:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES    TO bundle1;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT USAGE  ON SEQUENCES TO bundle1;

Dit geldt alleen voor de rol waarvoor het wordt uitgevoerd. Volgens de documentatie:

Om ook reeds bestaande objecten in het schema te dekken (zie commentaar van rob ):

GRANT SELECT ON ALL TABLES    IN SCHEMA public TO bundle1;
GRANT USAGE  ON ALL SEQUENCES IN SCHEMA public TO bundle1;

Maak mijndaemon eigen relevante functies. Zou er zo uit kunnen zien:

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
Vanwege deze bug in de huidige versie 1.16.1 van pgAdmin het benodigde commando

REVOKE EXECUTE ON FUNCTION foo() FROM public;

ontbreekt in het reverse-engineered DDL-script. Vergeet niet om het toe te voegen bij het opnieuw maken.
Deze bug is opgelost in de huidige versie pgAdmin 1.18.1.




  1. Query om alle records te krijgen totdat de som van de kolom kleiner is dan of gelijk is aan een waarde

  2. Kan MySQL niet vinden in NodeJS met AWS Lambda

  3. Het uitvoeren van een opgeslagen proces vanuit DotNet duurt erg lang, maar in SSMS is het onmiddellijk

  4. mysql kruisen