sql >> Base de Datos >  >> RDS >> PostgreSQL

Otorgar privilegios para una base de datos en particular en PostgreSQL

Concepto básico en Postgres

Los roles son objetos globales que pueden acceder a todas las bases de datos en un clúster de base de datos, dados los privilegios requeridos.

Un clúster contiene muchas bases de datos , que contienen muchos esquemas . Los esquemas (incluso con el mismo nombre) en diferentes bases de datos no están relacionados. La concesión de privilegios para un esquema solo se aplica a este esquema en particular en la base de datos actual (la base de datos actual en el momento de la concesión).

Cada base de datos comienza con un esquema public por defecto. Esa es una convención, y muchas configuraciones comienzan con ella. Aparte de eso, el esquema public es solo un esquema como cualquier otro.

Viniendo de MySQL, es posible que desee comenzar con un esquema único public , ignorando efectivamente la capa de esquema por completo. Estoy usando docenas de esquemas por base de datos regularmente.
Los esquemas son un poco (pero no completamente) como directorios en el sistema de archivos.

Una vez que haga uso de varios esquemas, asegúrese de comprender search_path ajuste:

  • ¿Cómo influye search_path en la resolución del identificador y el "esquema actual"?

Privilegios predeterminados

Por documentación en GRANT :

PostgreSQL otorga privilegios predeterminados en algunos tipos de objetos a PUBLIC . No se otorgan privilegios a PUBLIC por defecto en tablas, columnas, esquemas o tablespaces. Para otros tipos, los privilegios predeterminados otorgados a PUBLIC son los siguientes:CONNECT y CREATE TEMP TABLE para bases de datos; EXECUTE privilegio para funciones; y USAGE privilegio para idiomas.

Todos estos valores predeterminados se pueden cambiar con ALTER DEFAULT PRIVILEGES :

  • Otorgar todo en un esquema específico en la base de datos a un rol de grupo en PostgreSQL

Rol del grupo

Como comentó @Craig, es mejor GRANT privilegios a un rol de grupo y luego haga que un usuario específico sea miembro de ese rol (GRANT el rol de grupo al rol de usuario). De esta manera, es más sencillo distribuir y revocar paquetes de privilegios necesarios para ciertas tareas.

Un rol de grupo es solo otro rol sin inicio de sesión. Agregue un inicio de sesión para transformarlo en un rol de usuario. Más:

  • ¿Por qué PostgreSQL fusionó usuarios y grupos en roles?

Roles predefinidos

Actualización: Postgres 14 o posterior agrega los nuevos roles predefinidos (formalmente "roles predeterminados") pg_read_all_data y pg_write_all_data para simplificar algunos de los siguientes. Ver:

  • Otorgar acceso a todas las tablas de una base de datos

Receta

Digamos, tenemos una nueva base de datos mydb , un grupo mygrp y un usuario myusr ...

Mientras está conectado a la base de datos en cuestión como superusuario (postgres por ejemplo):

REVOKE ALL ON DATABASE mydb FROM public;  -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp;  -- since we revoked from public

GRANT USAGE ON SCHEMA public TO mygrp;

Para asignar "a un usuario todos los privilegios para todas las tablas" como escribiste (podría ser más restrictivo):

GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those

Para establecer privilegios predeterminados para objetos futuros, ejecute para cada rol que crea objetos en este esquema:

ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;

ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;

-- more roles?

Ahora, otorga el grupo al usuario:

GRANT mygrp TO myusr;

Respuesta relacionada:

  • PostgreSQL:al usuario de base de datos solo se le debe permitir llamar a funciones

Configuración alternativa (no estándar)

Viniendo de MySQL, y dado que desea mantener los privilegios en las bases de datos separadas, es posible que le guste esta configuración no estándar db_user_namespace . Por documentación:

Este parámetro habilita los nombres de usuario por base de datos. Está desactivado de forma predeterminada.

Lea el manual cuidadosamente. No uso esta configuración. No anula lo anterior.