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.
fuente
ALTER
. Cuando lo hiciste? Para las tablas existentes debeGRANT
derechos.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:
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:
No al revés cuando intentas hacerlo.
fuente
GRANT
nunca 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 alpublic
esquema no significa que pueda usar tablas dentro de él.