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.