Amigos
Podría usar su ayuda para hacer que mi diseño de control de acceso de usuario de Postgres sea mejor y esté más alineado con las mejores prácticas. Estoy ayudando a implementar un pequeño servidor Postgres de producción, pero no soy administrador de DB, así que sé lo suficiente como para ser peligroso.
Hay un servidor con una instalación de Postgres v9.2. Esta instalación aloja múltiples bases de datos, cada una de las cuales sirve completamente a un "cliente" diferente. En otras palabras, el cliente1 no usará la base de datos2, y así sucesivamente. Durante las operaciones normales, se accede a las bases de datos mediante una instancia coincidente de CakePHP, todas ubicadas en el mismo servidor que Postgres. Si bien puede haber posibles optimizaciones en esta implementación, estoy principalmente interesado en los roles Psql.
Según lo que leí, parece que tres tipos de roles tendrían sentido:
- Superusuario postgres con contraseña no predeterminada
- Un rol de administrador que no tiene privilegios de superusuario para mantenimiento de rutina, creación de base de datos, copia de seguridad, restauración. Debería poder hacer cualquier cosa con todas las bases de datos de clientes.
- Roles de usuario con solo la capacidad de CRUDAR en sus respectivas bases de datos. Se podrían tolerar más derechos sobre su propia base de datos si se limpia la implementación.
Implementar ese diseño es donde tengo mucha menos confianza. La propiedad de DB versus la tabla y quién debería heredar de quién está un poco turbio. A continuación se encuentran mis bases de datos y mis usuarios. ¿Es suficiente información para evaluar la implementación?
Role name | Attributes | Member of
-----------+------------------------------------------------+-------------------
admin | Create role, Create DB | {user1, user2}
postgres | Superuser, Create role, Create DB | {}
user1 | | {}
user2 | | {}
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+-------+-----------------------
admin | postgres | UTF8 | en_US | en_US | =Tc/postgres +
| | | | | postgres=CTc/postgres+
| | | | | admin=CTc/postgres
postgres | postgres | UTF8 | en_US | en_US |
template0 | postgres | UTF8 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
user1 | admin | UTF8 | en_US | en_US | =Tc/admin +
| | | | | admin=CTc/admin +
| | | | | user1=CTc/admin
user2 | admin | UTF8 | en_US | en_US | =Tc/admin +
| | | | | admin=CTc/admin +
| | | | | user2=CTc/admin
Para evitar conexiones externas y contraseñas en claro, pg_hba.conf es como tal:
local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
fuente
Respuestas:
Sé que esta es una vieja pregunta, pero intentaré responderla incluso ahora, ya que tengo que hacer una investigación relacionada con esto.
Lo que está intentando hacer se llama multicliente a nivel de base de datos. Esto puede lograrse de dos formas:
Sin embargo, en un solo grupo de bases de datos, de alguna manera como lo describió el OP, mi elección personal sería esta:
Cada cliente obtiene su propio grupo de bases de datos. Esta es mi solución preferida, especialmente porque generalmente trabajo con aplicaciones que tienen grandes bases de datos por cada cliente.
También puede usar una combinación de lo anterior y usar pgBouncer como enrutador.
fuente