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

Autorizzazioni PostgreSQL limitate per l'app Web

Risponderò prima alla tua domanda "ricerca secondaria":

hai perfettamente ragione con le tue preoccupazioni e preoccupazioni e tutti coloro che progettano un'applicazione dovrebbero pensare alle stesse cose. Tutto il resto è sciatto e negligente.

Per mitigare il danno che può essere causato da un attacco SQL injection riuscito, dovresti assolutamente utilizzare il principio del privilegio minimo.

Dovrebbe essere abbastanza semplice configurare un sistema che soddisfi i tuoi requisiti.

Userò i nomi degli oggetti del tuo esempio, tranne per il fatto che userò i trattini bassi invece dei meno. È buona norma utilizzare solo lettere minuscole, trattini bassi e numeri nei nomi degli oggetti, poiché ti semplificheranno la vita.

/* create the database */
\c postgres postgres
CREATE DATABASE test_database WITH OWNER app_admin;
\c test_database postgres

/* drop public schema; other, less invasive option is to
   REVOKE ALL ON SCHEMA public FROM PUBLIC */
DROP SCHEMA public;
/* create an application schema */
CREATE SCHEMA app AUTHORIZATION app_admin;
/* further operations won't need superuser access */
\c test_database app_admin
/* allow app_user to access, but not create objects in the schema */
GRANT USAGE ON SCHEMA app TO app_user;

/* PUBLIC should not be allowed to execute functions created by app_admin */
ALTER DEFAULT PRIVILEGES FOR ROLE app_admin
   REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;

/* assuming that app_user should be allowed to do anything
   with data in all tables in that schema, allow access for all
   objects that app_admin will create there */
ALTER DEFAULT PRIVILEGES FOR ROLE app_admin IN SCHEMA app
   GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_user;
ALTER DEFAULT PRIVILEGES FOR ROLE app_admin IN SCHEMA app
   GRANT SELECT, USAGE ON SEQUENCES TO app_user;
ALTER DEFAULT PRIVILEGES FOR ROLE app_admin IN SCHEMA app
   GRANT EXECUTE ON FUNCTIONS TO app_user;

Ma se prendi il principio di meno sul serio, dovresti concedere i permessi delle tabelle individualmente e ad es. non consentire app_user a DELETE e UPDATE dati nelle tabelle in cui non è necessario che l'utente lo faccia.