Debo estar perdiendo algo con respecto a la configuración de PostgreSQL. Lo que me gustaría hacer es crear múltiples bases de datos y usuarios que estén aislados unos de otros para que un usuario específico solo tenga acceso a las bases de datos que especifique. Sin embargo, por lo que puedo determinar, cualquier usuario creado tiene acceso a todas las bases de datos sin que se otorguen subvenciones específicas.
Esto es lo que hago en un Ubuntu Server 12.04:
- apt-get install postgresql
- sudo -u postgres createuser -DRSP mike1 (Especificando la contraseña para el nuevo usuario)
- sudo -u postgres createdb data1
- psql -h localhost -U mike1 data1 (Especificando la contraseña para que el usuario mike1 inicie sesión)
Parece que el nuevo usuario "mike1" no tiene problemas para conectarse a la base de datos "data1" y crear tablas, etc. Y esto sin ejecutar ningún comando GRANT (y el propietario de "data1" es "postgres" ya que no especifiqué un propietario en el paso 3). ¿Es así como se supone que funciona?
Lo que me gustaría hacer es otorgar a mike1 acceso completo a los datos1 y luego repetir esto para más usuarios y bases de datos, asegurándome de que los usuarios solo tengan acceso a una (o posiblemente a varias) bases de datos de mi elección.
fuente
Respuestas:
En el nivel SQL, cada usuario puede conectarse a una base de datos recién creada, hasta que se emita el siguiente comando SQL:
Una vez hecho esto, a cada usuario o rol que debería poder conectarse se le debe otorgar explícitamente el privilegio de conexión:
Editar: en un escenario multiinquilino,
connect
se eliminaría más que solo el privilegio. Para obtener sugerencias y prácticas recomendadas para múltiples inquilinos, es posible que desee leer en la wiki pública postgresql: derechos compartidos de alojamiento y administración de bases de datos en PostgreSQL .fuente
postgres
puede acceder a todas las bases de datos.PUBLIC tiene acceso a la base de datos de manera predeterminada, pero no puede acceder a los datos. Puedes revocar al público:
Si desea esta configuración para todas las bases de datos futuras, revoque CONNECT en la base de datos template1 (base de datos de plantilla predeterminada para crear una nueva base de datos):
fuente
Además de revocar los privilegios de conexión de PUBLIC de manera predeterminada, y otorgarlos como se desee específicamente, el otro nivel en el que puede controlar el acceso es a través del archivo pg_hba.conf.
Puede encontrar dónde se almacena el archivo con:
Si elige utilizar este mecanismo, hay comentarios incrustados que pueden ser suficientes para comenzar. Los documentos están aquí:
http://www.postgresql.org/docs/current/interactive/auth-pg-hba-conf.html
fuente
GRANT
/REVOKE
discutida en otras respuestas probablemente sea más fácil. Por un lado, solo necesita una conexión de base de datos de superusuario para eso, en lugar de necesitar un inicio de sesión del sistema operativo que pueda editar el archivo.Encontré este hilo buscando una manera de evitar que los usuarios incluso enumeren los otros nombres de bases de datos. El
REVOKE CONNECT
no evita esto.Según las respuestas a esta pregunta SO, no hay una forma (recomendable) de lograrlo.
fuente