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.