PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL - L'utente DB dovrebbe essere autorizzato solo a chiamare funzioni

Non esiste alcun "privilegio su SELECT ". Tutto ciò di cui hai bisogno è il privilegio di EXECUTE funzioni. La funzione pertinente può essere eseguita con SECURITY DEFINER ereditare tutti i privilegi del proprietario. Per limitare la possibile escalation dei privilegi al minimo a priori, fai in modo che un ruolo daemon possieda le funzioni rilevanti con solo i privilegi necessari, non un superutente!

Ricetta

Come superutente...

Crea un ruolo non superutente myuser .

CREATE ROLE myuser PASSWORD ...;

Crea un ruolo di gruppo mygroup e crea myuser membro in esso.

CREATE ROLE mygroup;
GRANT mygroup TO myuser;

Potresti voler aggiungere più utenti proprio come myuser dopo.

Non concedere alcun privilegio a myuser .
Concedili solo a mygroup :

  • GRANT CONNECT ON DATABASE mydb TO mygroup;
  • GRANT USAGE ON SCHEMA public TO mygroup;
  • GRANT EXECUTE ON FUNCTION foo() TO mygroup;

Rimuovi tutto privilegi per public quel myuser non avrebbe dovuto.

REVOKE ALL ON ALL TABLES IN SCHEMA myschema FROM public;

Potrebbero essercene di più. Cito il manuale:

Crea un ruolo demone da possedere funzioni pertinenti.

CREATE ROLE mydaemon;

Concedi a mydaemon solo i privilegi necessari per eseguire queste funzioni , (incluso EXECUTE ON FUNCTION per consentire la chiamata di un'altra funzione). Anche in questo caso, puoi utilizzare i ruoli di gruppo per raggruppare i privilegi e concederli a mydaemon

GRANT bundle1 TO mydaemon;

Inoltre puoi utilizzare DEFAULT PRIVILEGES per concedere automaticamente determinati privilegi per oggetti futuri a un bundle o direttamente al demone:

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

Questo vale solo per il ruolo per cui viene eseguito. Per la documentazione:

Per coprire anche gli oggetti preesistenti nello schema (vedi commento di rob ):

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

Crea mydaemon proprie funzioni rilevanti. Potrebbe assomigliare a questo:

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
A causa di questo bug nella versione corrente 1.16.1 di pgAdmin il comando necessario

REVOKE EXECUTE ON FUNCTION foo() FROM public;

manca nello script DDL con reverse engineering. Ricordarsi di aggiungerlo durante la ricreazione.
Questo bug è stato corretto nella versione corrente pgAdmin 1.18.1.