PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL - DB-Benutzer sollten nur zum Aufrufen von Funktionen berechtigt sein

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.