Privilegios para el propietario de la base de datos; usuario de la aplicación


15

Versión rápida:

¿Qué comando debo emitir para permitir que el propietario de una base de datos le permita acceder a las tablas de esta base de datos? ¿Se puede hacer esto desde la cuenta de ese propietario?


Versión más larga:

Estoy creando una base de datos en RDS. Tengo un usuario 'root' que configuré con Amazon.

Amazon crea automáticamente el rol de grupo 'rds_superuser', que es muy privilegiado, pero en realidad no es un superusuario.

Estoy creando una base de datos y un usuario para la aplicación de la siguiente manera:

create database master_integration;
CREATE ROLE master_application LOGIN ENCRYPTED PASSWORD '...' VALID UNTIL 'infinity';
GRANT ALL ON DATABASE master_integration TO GROUP rds_superuser WITH GRANT OPTION;
GRANT ALL ON DATABASE master_integration TO GROUP master_application;

\c master_integration;
ALTER DEFAULT PRIVILEGES GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO rds_superuser;

Actualicé este script para reflejar las sugerencias de Craig Ringer con respecto a cómo debería manejar esto.

Cuando la aplicación se conecta (con las credenciales master_application) crea (y por lo tanto posee) las tablas.

Mi problema es que no puedo usar mi inicio de sesión administrativo (rootish) para ejecutar consultas porque ese usuario no tiene privilegios en la tabla.

He podido resolver esto antes ejecutando lo siguiente desde la cuenta de la aplicación:

GRANT ALL privileges ON ALL TABLES IN SCHEMA public to rds_superuser;

Pero parece extraño que un usuario subordinado otorgue privilegios a un usuario administrativo.

Entonces ... ¿Hay algún comando que pueda ejecutar antes o después de crear las tablas desde la aplicación que garantizará que el propietario de la base de datos pueda acceder a las tablas dentro de la base de datos?


actualizar después de volver a intentar cambiar los privilegios predeterminados ...

Esto todavía no otorga acceso a las tablas; Veo que se sugiere en otra parte y tiene mucho sentido, pero no funciona para mí. Desde un shell psql:

master_integration=> \ddp
                           Default access privileges
      Owner       | Schema | Type  |             Access privileges             
------------------+--------+-------+-------------------------------------------
 integration_root |        | table | integration_root=arwdDxt/integration_root+
                  |        |       | rds_superuser=arwdDxt/integration_root
(1 row)

master_integration=> \dp users
                           Access privileges
 Schema | Name  | Type  | Access privileges | Column access privileges 
--------+-------+-------+-------------------+--------------------------
 public | users | table |                   | 
(1 row)

raíz_integración es mi usuario superusuario y usuarios es una tabla dentro de mi base de datos.


Actualizar

Recibí una respuesta bastante inútil de alguien en Amazon.

Me pidieron que llamara ALTER DEFAULT PRIVILEGES desde el inicio de sesión master_application. Si bien esto probablemente funcionaría, no respondería a mi pregunta (que es cómo hago que esto suceda únicamente desde la cuenta rds_superuser).

Les pedí que aclararan esto y se fueron.

Respuestas:


9

Que desea ALTER DEFAULT PRIVILEGES.

Otorgue los rds_superuserderechos de acceso predeterminados a todas las tablas nuevas.

Esto solo afecta a las tablas creadas después de ALTER. Para las tablas existentes debe GRANTderechos.


Intenté hacer esto. Lo escribí mal en la pregunta original, lo he editado para mostrar exactamente el comando que estaba ejecutando. ¿Me equivoqué?
Andy Davis

Sólo afecta a las tablas creadas después de la ALTER. Cuando lo hiciste? Para las tablas existentes debe GRANTderechos.
Craig Ringer

Modifiqué los privs predeterminados, luego creé las tablas. Voy a intentarlo de nuevo, tal vez cometí un error.
Andy Davis

Todavía no tuve suerte con esto, aunque parece absolutamente el comando que debería resolver el problema. Actualicé el comando para incluir el resultado de \ ddp y \ dp de una de las tablas.
Andy Davis

Terriblemente extraño. ¿Puede reproducir el problema en un PostgreSQL normal (no RDS)?
Craig Ringer

0

Se supone que el esquema público sea visible para todos los usuarios. No debe restringir los derechos del esquema público a un solo grupo.

Entonces, si no usa:

GRANT ALL ON SCHEMA public TO GROUP rds_superuser WITH GRANT OPTION;

Puede trabajar con seguridad con el esquema público con todas las cuentas.

Si no desea que cuentas específicas estropeen sus tablas de esquema público, cree una nueva función (para los usuarios de su aplicación) y revoque los derechos de esta función en particular dentro del esquema público. Algo como:

CREATE USER mywebuser WITH PASSWORD '*****';
REVOKE ALL PRIVILEGES ON SCHEMA public FROM mywebuser;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mywebuser; (or whatever rights you need to provide)

No al revés cuando intentas hacerlo.


¿Eh? A GRANTnunca debería poder reducir los derechos de acceso. No estoy convencido. Tenga en cuenta que los derechos sobre un esquema tampoco se heredan de las nuevas tablas en ese esquema, por lo que tener acceso al publicesquema no significa que pueda usar tablas dentro de él.
Craig Ringer el

Finalmente pude probar esto y no ayuda a la situación.
Andy Davis

He editado la pregunta para eliminar la beca a la que @Aleandros se refería. No parecía ser el problema, pero creo que fue una distracción.
Andy Davis
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.