Permisos restringidos de PostgreSQL para aplicaciones web

Gol

Cree una base de datos con tres usuarios y restrinja sus privilegios (solo pienso en voz alta, por lo que mi separación de usuarios también está abierta a corrección):

Superusuario: este usuario permite el aprovisionamiento inicial de la base de datos. Cree la base de datos de la aplicación, cree los otros usuarios, establezca sus privilegios. Defectopostgres El superusuario funciona para mí, así que este está hecho.Administrador: este usuario solo tiene acceso a la base de datos que se creó durante el aprovisionamiento. Administrador puedeCRUDO todos los datos en todas las tablas, y también pueden tablas CRUD, etc. Tipo de situación "Superusuario solo para esta base de datos". Cuando se actualiza la aplicación, el administrador es el usuario utilizado por las herramientas automatizadas para manejar las migraciones de la base de datos.Usuario de la aplicación: este usuario es en última instancia el que admite la funcionalidad de la aplicación web. Tenga en cuenta que esto no tiene nada que ver con los usuarios en las páginas web, etc. Este es el usuario que el servidor aprovecha para ejecutar consultas, insertar y eliminar datos. Explícitamenteno haga desea que este usuario pueda modificar los permisos de cualquier cosa, ni crear / destruir tablas o índices ni nada estructural.Lo que he intentado

En primer lugar, mirando la (generalmente excelente) documentación de PostgreSQL, lapágina en Grant más o menos me deja con los ojos cruzados. Después de pasar unas horas leyendo sobre los roles y privilegios de PostgreSQL, generalmente estoy confundido. Creo que con un poco más de trabajo podré determinar lo que quiero para el usuario administrador, pero estoy bastante atrapado en el "usuario de la aplicación". He llegado hasta aquí (los nombres y las contraseñas son solo marcadores de posición):

$ psql -U postgres
postgres=# CREATE USER "app-admin" WITH PASSWORD 'password';
CREATE ROLE
postgres=# CREATE USER "app-user" WITH PASSWORD 'password';
CREATE ROLE
postgres=# CREATE DATABASE "test-database" WITH OWNER "app-admin";
CREATE DATABASE
postgres=# \c "test-database"
You are now connected to database "test-database" as user "postgres".
test-database=# DROP SCHEMA "public";
DROP SCHEMA
test-database=# CREATE SCHEMA "app" AUTHORIZATION "app-admin";
CREATE SCHEMA

Y aquí es donde me pongo inseguro. Siento que la respuesta que estoy tratando de evitar es "revocar todo por defecto y luego enumerar todos los privilegios que necesitará en todos los niveles diferentes en todos los objetos diferentes". Estoy tratando de evitar eso porque directamente no sé lo que necesito allí. Si esa es la respuesta, tendré que agacharme y leer un montón más, pero en general cuando empiezo a recorrer caminos como ese, me he perdido algo.

Cuestiones

¿Cómo restrinjo los privilegios paraapp-user por lo que no pueden modificar ningún dato estructural (por ejemplo, no pueden agregar ni destruir tablas) pero pueden conectarse y hacer cualquier cosa con filas (la seguridad a nivel de fila ni siquiera está en mi radar). ¿Este modelo general de privilegios no está realmente sincronizado con lo que PostgreSQL espera? Siento que me falta algo si tengo que analizar todas las opciones en esa página de "concesión" para lograr algo como esto, ya sea mi motivación para hacerlo en primer lugar o los medios por los cuales estoy trabajando. eso.

Contexto

Estoy tratando de construir mi primera aplicación web de extremo a extremo. He realizado suficiente desarrollo de software general y desarrollo de aplicaciones web, ahora estoy tratando de entender las piezas que generalmente doy por sentado día a día. Estoy tratando de configurar un servidor PostgreSQL mientras mantengo elprincipio del menor privilegio en mente.

Mision secundaria

No he visto esto en aplicaciones web donde simplemente me uní al equipo de desarrollo, aunque en general son pequeñas y no se usan mucho. ¿Hacer esto realmente logra algo? ¿Alguien tiene razones convincentes de por qué hacer algo como esto, o por qué es una idea mala o ineficaz? Mi suposición era que si finalmente terminaba con una vulnerabilidad de inyección SQL, esto mitigaría el daño porque el usuario de la base de datos tendría acceso limitado. ¿Eso está equivocado?

Artículos geniales que he encontrado sobre el tema:http://www.ibm.com/developerworks/opensource/library/os-postgresecurity/index.htmlADVERTENCIA PDF: https://wiki.postgresql.org/images/d/d1/Managing_rights_in_postgresql.pdfhttps://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2http://blog.2ndquadrant.com/auditing-users-and-roles-in-postgresql/

Respuestas a la pregunta(2)

Su respuesta a la pregunta