Es gibt kein "Privileg auf SELECT
". Alles, was Sie brauchen, ist die Berechtigung zum EXECUTE
Funktionen. Die relevante Funktion kann mit SECURITY ausgeführt werden DEFINER
um alle Privilegien des Eigentümers zu erben. Um eine mögliche Rechteausweitung von vornherein auf ein Minimum zu beschränken, machen Sie eine Daemon-Rolle zu Eigentümer relevanter Funktionen mit nur den notwendigen Rechten – nicht zu einem Superuser!
Rezept
Als Superuser ...
Erstellen Sie eine Nicht-Superuser-Rolle myuser
.
CREATE ROLE myuser PASSWORD ...;
Erstellen Sie eine Gruppenrolle mygroup
und machen Sie myuser
Mitglied darin.
CREATE ROLE mygroup;
GRANT mygroup TO myuser;
Vielleicht möchten Sie weitere Benutzer wie myuser
hinzufügen später.
Gewähren Sie überhaupt keine Privilegien zu myuser
.
Gewähren Sie diese nur mygroup
:
GEWÄHREN SIE VERBINDUNG AUF DATENBANK mydb TO mygroup;
GEWÄHREN SIE NUTZUNG AUF SCHEMA public TO mygroup;
GRANT EXECUTE ON FUNCTION foo() TO mygroup;
alle entfernen Privilegien für public
dieser myuser
hätte nicht sein sollen.
REVOKE ALL ON ALL TABLES IN SCHEMA myschema FROM public;
Es können noch mehr sein. Ich zitiere das Handbuch:
Erstellen Sie eine Daemon-Rolle zu besitzen relevanten Funktionen.
CREATE ROLE mydaemon;
Gewähren Sie mydaemon
nur die Berechtigungen, die zum Ausführen dieser Funktionen erforderlich sind , (einschließlich EXECUTE ON FUNCTION
um den Aufruf einer anderen Funktion zu ermöglichen). Auch hier können Sie Gruppenrollen verwenden, um Berechtigungen zu bündeln und sie mydaemon
zuzuweisen
GRANT bundle1 TO mydaemon;
Zusätzlich können Sie DEFAULT PRIVILEGES
bestimmte Privilegien für zukünftige Objekte automatisch einem Bundle oder dem Daemon direkt zu gewähren:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO bundle1;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT USAGE ON SEQUENCES TO bundle1;
Dies gilt nur für die Rolle, für die es ausgeführt wird. Gemäß Dokumentation:
Um auch bereits vorhandene Objekte im Schema abzudecken (siehe Robs Kommentar ):
GRANT SELECT ON ALL TABLES IN SCHEMA public TO bundle1;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO bundle1;
Erstellen Sie mydaemon
eigene relevante Funktionen. Könnte so aussehen:
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 ..
###Hinweis
Aufgrund dieses Fehlers
in der aktuellen Version 1.16.1 von pgAdmin
den notwendigen Befehl
REVOKE EXECUTE ON FUNCTION foo() FROM public;
fehlt im rekonstruierten DDL-Skript. Denken Sie daran, ihn bei der Neuerstellung hinzuzufügen.
Dieser Fehler ist in der aktuellen Version pgAdmin 1.18.1 behoben.