2011-07-30 20 views
6

Instalé la base de datos de PostgreSQL 9 (migración desde Oracle10g) y estoy realmente confundido por la administración del usuario/rol. Cuando creo un nuevo usuario usando el comando SQL como CREATE USER o CREATE ROLE, o mediante la herramienta Navicat, ¡el usuario creado puede ver todas las bases de datos! Él realmente puede conectarlos! Aunque no puede seleccionar ningún dato de la tabla, puede ver objetos de tabla y secuencias, etc. Estaba intentando revocar privilegios de conexión, pero no tiene efecto. Se esperaba que el nuevo usuario no tenga privilegios y no pueda ver nada. Realmente no sé por qué él puede.¿Por qué el nuevo usuario en PostgreSQL se puede conectar a todas las bases de datos?

+2

¿Cómo intentas revocar los privilegios CONNECT? –

+0

Si está usando pgAdmin, puede consultar la función y los derechos de inicio de sesión del usuario. En su servidor, expanda Funciones de inicio de sesión, haga clic con el botón derecho en la Función de inicio de sesión en cuestión y verifique los privilegios de Roles y Membresías de roles. Luego, combine esos privilegios y membresías con los DB y los objetos DB en cuestión. Si un DB u objeto tiene una función otorgada, y el inicio de sesión de su usuario tiene esa función, eso explica el acceso. Si el usuario tiene casillas de verificación presionadas en la pestaña "Role privileges", eso explica otros derechos. – atrain

+0

Así que inicié pgAdmin y miré en la pestaña de funciones en mis bases de datos (haga clic con el botón secundario en la base de datos, y luego en lo de permisos). Hubo un rol "público" junto con todas mis bases de datos. Entonces elimino eso. ¡Y ahora funciona! Muchas gracias porque estaba un poco asustado :-) – veselej

Respuesta

0

Debe usar GRANT y/o REVOKE para definir los privilegios para el usuario o rol. También puede usar las siguientes funciones link para ver si un usuario tiene un privilegio específico en una tabla, base de datos, etc. ...

+0

Sí, lo hice. U utilizó el comando SQL del manual de PostgreSQL - REVOKE CONNECT ON DATABASE dbname FROM username; y no tiene ningún efecto -> ver el hilo de comentarios de Aaron Sheffey. Pero gracias. – veselej

1

Probablemente también necesite modificar el archivo pg_hba.conf. De manera predeterminada, una instalación local no realiza verificaciones de autorización.

11

De http://www.postgresql.org/docs/9.2/static/sql-grant.html#SQL-GRANT-DESCRIPTION-OBJECTS (el énfasis es mío):

privilegios PostgreSQL subvenciones por defecto en algunos tipos de objetos a PUBLIC. No se otorgan privilegios a PUBLIC de forma predeterminada en tablas, columnas, esquemas o espacios de tabla. Para otros tipos, los privilegios predeterminados otorgados a PUBLIC son los siguientes: CONNECT y CREATE TEMP TABLE para las bases de datos; EXECUTE privilegio para funciones; y privilegio USAGE para idiomas. El propietario del objeto puede, por supuesto, REVOKE privilegios tanto por defecto como otorgados expresamente. (Para mayor seguridad, emita el REVOKE en la misma transacción que crea el objeto, y luego no hay una ventana en la que otro usuario pueda usar el objeto). Además, estas configuraciones iniciales de privilegios predeterminados se pueden cambiar utilizando el comando ALTER DEFAULT PRIVILEGES.

Con el fin de eliminar todos los privilegios (incluyendo CONNECT) para todos los usuarios especificados en una base de datos, utilice:

REVOKE ALL PRIVILEGES ON DATABASE <database> FROM public; 

Ver también:

+0

Gracias, excelente, excepto que, "para la máxima seguridad, emita el REVOKE en la misma transacción que crea el objeto; entonces no hay ventana en la cual otro usuario pueda usar el objeto "- esto sonó como un buen consejo, pero no funciona para las bases de datos porque (indicando el mensaje de error)" CREATE DATABASE no puede ejecutarse dentro de un bloque de transacción ". Entonces, ¿no hay forma de cerrar la ventana para que alguien use una nueva base de datos? – njlarsson

Cuestiones relacionadas