Postgresql: ¿qué hace GRANT ALL PRIVILEGES ON DATABASE?

60

Estoy tratando de otorgar todos los privilegios en todas las tablas de una base de datos dada a un nuevo usuario de postgres (no el propietario). Parece que eso GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;no hace eso. Después de ejecutar dicho comando correctamente (como usuario de postgres), obtengo lo siguiente como new_user:

$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR:  permission denied for relation a_table_in_my_db

Dos preguntas:

1) ¿Qué hace el comando anterior, si no otorga todos los permisos en todas las tablas en my_db?

2) ¿Cuál es la forma correcta de otorgar todos los permisos en todas las tablas a un usuario? (incluso en todas las tablas creadas en el futuro)

rz.
fuente

Respuestas:

80

Las respuestas a sus preguntas provienen de los documentos en línea de PostgreSQL 8.4 .

  1. GRANT ALL PRIVILEGES ON DATABASEotorga al CREATE, CONNECT, y TEMPORARYprivilegios en una base de datos a una función (los usuarios se refiere correctamente como papeles ). Ninguno de esos privilegios realmente permite que un rol lea datos de una tabla; SELECTSe requiere privilegio sobre la mesa para eso.

  2. No estoy seguro de que haya una forma "adecuada" de otorgar todos los privilegios en todas las tablas a un rol. La mejor manera de garantizar que un rol determinado tenga todos los privilegios en una tabla es asegurarse de que el rol sea el propietario de la tabla. De manera predeterminada, cada objeto recién creado es propiedad del rol que lo creó, por lo que si desea que un rol tenga todos los privilegios en una tabla, use ese rol para crearlo.

    PostgreSQL 9.0 presenta la siguiente sintaxis que es casi lo que desea:

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;

    El problema es que si crea tablas en esquemas fuera del esquema "público" predeterminado, esto GRANTno se aplicará a ellos. Si utiliza esquemas no públicos, tendrá GRANTlos privilegios para esos esquemas por separado.

Steven Monday
fuente
1
¿Puede una base de datos tener múltiples propietarios? Si es así, ¿cómo agregar otro propietario?
rz.
no, no creo que una base de datos pueda tener más de un propietario, aunque podría darles todas las escrituras de un propietario
hellomynameisjoel
15
no olvides que tienes que hacer lo mismo en las secuencias: GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user;o no puedes insertar ningún registro.
Incluso si no funciona, intente esto: = OTORGUE TODOS LOS PRIVILEGIOS EN TODAS LAS TABLAS EN SCHEMA public TO your_user;
Kaustubh
10

Es posible configurar múltiples inicios de sesión para actuar como propietario de la base de datos:

  • Cree un rol "nologin" para actuar como propietario: create role dbowner nologin
  • Cambie el propietario de su base de datos a esto: alter database mydb owner dbowner
  • Concede todos tus inicios de sesión a esta nueva función: grant dbowner to user1, user2

Ahora, si el usuario1 o el usuario2 inician sesión, tienen todos los permisos en "mydb" sin necesidad de ninguna otra concesión.

Sin embargo, consideraría esta solución con cuidado. Es tentador que su aplicación web use uno de estos inicios de sesión para evitar la molestia de crear subvenciones adicionales cada vez que se actualiza el esquema, pero está eliminando una forma muy útil de protección de esta manera. Utilice la solución anterior si realmente desea múltiples "administradores", pero siga con el patrón "conceder todos los privilegios en todas las tablas en el esquema ..." anterior para iniciar sesión en su aplicación de "uso normal".

Chris Cogdon
fuente
1
Chris Cogdon, solo una pequeña solución: cambie el propietario de la base de datos mydb a dbowner
user876743