PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Permissões restritas do PostgreSQL para aplicativo da web


Vou responder sua pergunta de “quest paralela” primeiro:

você está completamente certo com suas preocupações e preocupações, e todos que projetam um aplicativo devem pensar nas mesmas coisas. Todo o resto é descuidado e descuidado.

Para mitigar os danos que podem ser causados ​​por um ataque de injeção de SQL bem-sucedido, você deve definitivamente empregar o princípio do privilégio mínimo.

Deve ser bastante simples configurar um sistema que atenda às suas necessidades.

Usarei os nomes dos objetos do seu exemplo, exceto que usarei sublinhados em vez de sinais de menos. É uma boa prática usar apenas letras minúsculas, sublinhados e números em nomes de objetos, pois isso facilitará sua vida.
/* 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;

Mas se você levar o princípio do menos a sério, você deve conceder permissões de tabela individualmente e, por exemplo, não permitir app_user para DELETE e UPDATE dados em tabelas onde não há necessidade de o usuário fazê-lo.