Quiero migrar una aplicación bastante simple, interna, impulsada por bases de datos de SQLite3 a PostgreSQL 9.3 y ajustar los permisos en la base de datos a medida que avanzo.
La aplicación actualmente consiste en un comando para actualizar los datos; y uno para consultarlo. Naturalmente, también necesitaré mantener la base de datos de otras maneras (crear nuevas tablas, vistas, disparadores, etc.).
Si bien esta aplicación será la única alojada en el servidor al principio, preferiría hornear asumiendo que podría estar alojada en un servidor con otras bases de datos en el futuro, en lugar de tener que codificar más tarde si es necesario. el futuro.
Creo que estos serían un conjunto de requisitos bastante común, pero tengo problemas para encontrar un tutorial simple que explique cómo configurar una nueva base de datos en PostgreSQL, con este tipo de separación de usuario / privilegio. Las referencias continúan extensamente sobre grupos, usuarios, roles, bases de datos, esquemas y dominio; pero los encuentro confusos.
Esto es lo que he intentado hasta ahora (desde adentro psql
como 'postgres'):
CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public;
\connect hostdb
CREATE SCHEMA hostdb;
CREATE USER hostdb_admin WITH PASSWORD 'youwish';
CREATE USER hostdb_mgr WITH PASSWORD 'youwish2';
CREATE USER hostdb_usr WITH PASSWORD 'youwish3';
GRANT ALL PRIVILEGES ON DATABASE hostdb TO hostdb_admin;
GRANT CONNECT ON DATABASE hostdb TO hostdb_mgr, hostdb_usr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO hostdb_mgr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT ON TABLES TO hostdb_usr;
Pero no entiendo la semántica prevista. Quiero tenerlo configurado para que solo el hostdb_admin
pueda crear (y soltar y alterar) tablas; la hostdb_mgr
puede leer, insertar, actualizar y borrar en todas las tablas por defecto; y hostdb_usr
solo puede leer todas las tablas (y vistas).
Cuando probé esto, descubrí que podía crear tablas hostdb
como cualquiera de estos usuarios; pero, para cada usuario, solo podía leer o modificar tablas creadas por ese usuario, a menos que use un explícito GRANT
.
Supongo que falta algo entre CREATE DATABASE
y CREATE SCHEMA
, algo para aplicar SCHEMA
el DATABASE
?
(A medida que las cosas avanzan, también tendré preguntas para aplicar restricciones similares TRIGGERS
, procedimientos almacenados VIEWS
y quizás otros objetos).
¿Dónde puedo encontrar una guía decente, un tutorial o una serie de videos sobre esto?
fuente
public
pseudorole. Se puede considerar como un rol del que es miembro cualquier otro rol (usuario, grupo, todos iguales). Intente quitarle los privilegios, por ejemploREVOKE CREATE ON SCHEMA hostdb FROM public
,. Revocar los derechos en el nivel de la base de datos, como lo hizo, solo deshabilita algunos permisos de nivel de base de datos, sin efecto en los esquemas o tablas.public
ocurre con privilegios paraPUBLIC
. Aparte de eso, hay no hay privilegios por defecto para los nuevos esquemas. Por lo tanto, esto no afecta el caso de uso demostrado. Vea el capítulo en mi respuesta.Respuestas:
Encontrarás todo en el manual. Enlaces a continuación.
Por supuesto, el asunto no es trivial y, a veces, confuso. Aquí hay una receta para el caso de uso:
Receta
Como superusuario
postgres
:Si desea un administrador más poderoso que también pueda administrar bases de datos y roles, agregue los atributos
CREATEDB
CREATEROLE
del rol y más arriba.Otorgue cada rol al siguiente nivel superior, de modo que todos los niveles "hereden" al menos el conjunto de privilegios del siguiente nivel inferior (en cascada):
Estoy nombrando el esquema
schma
(hostdb
que no sería confuso). Elige cualquier nombre. Opcionalmente, haga queschma_admin
el propietario del esquema:Para
and drop and alter
ver las notas a continuación.Las vistas son especiales. Para uno:
Y para vistas actualizables :
Los disparadores también son especiales. Necesita el
TRIGGER
privilegio sobre la mesa y:Pero ya estamos ampliando demasiado el alcance de esta pregunta ...
Notas importantes
Propiedad
Si desea permitir
schma_admin
(solo) soltar y modificar tablas, haga que el rol sea el propietario de todos los objetos. La documentación:O cree todos los objetos con el rol
schma_admin
para comenzar, entonces no necesita establecer el propietario explícitamente. También simplifica los privilegios predeterminados, que luego solo debe establecer para el rol:Objetos preexistentes
Los privilegios predeterminados solo se aplican a los objetos recién creados y solo a la función particular con la que se crean. También querrá adaptar los permisos para los objetos existentes :
Lo mismo se aplica si crea objetos con un rol que no tiene
DEFAULT PRIVILEGES
establecido, como el superusuariopostgres
. Reasignar la propiedad deschma_admin
y privilegios establecer manualmente - o conjuntoDEFAULT PRIVILEGES
parapostgres
así (mientras está conectado a la base de datos correcto!):Privilegios predeterminados
Te estabas perdiendo un aspecto importante del
ALTER DEFAULT PRIVILEGES
comando. Se aplica al rol actual a menos que se especifique lo contrario:Los privilegios predeterminados solo se aplican a la base de datos actual. Por lo tanto, no te metas con otras bases de datos en el clúster de base de datos. La documentación:
También es posible que desee establecer privilegios predeterminados para
FUNCTIONS
yTYPES
(no soloTABLES
ySEQUENCES
), pero es posible que no sean necesarios.Privilegios predeterminados para
PUBLIC
Los privilegios predeterminados otorgados
PUBLIC
son rudimentarios y sobreestimados por algunos. La documentación:El énfasis en negrita es mío. Por lo general, el comando anterior es suficiente para cubrir todo:
En particular, no se otorgan privilegios predeterminados
PUBLIC
para nuevos esquemas. Puede ser confuso que el esquema predeterminado llamado "público" comience conALL
privilegios paraPUBLIC
. Esa es solo una característica conveniente para facilitar el inicio con bases de datos recién creadas. No afecta a otros esquemas de ninguna manera. Usted puede revocar estos privilegios en la base de datos de plantillatemplate1
, a continuación, bases de datos de todos los recién creados en este grupo comienzan sin ellos:El privilegio
TEMP
Como hemos revocado todos los privilegios
hostdb
desdePUBLIC
, los usuarios normales no pueden crear tablas temporales a menos que lo permitamos explícitamente. Es posible que desee o no agregar esto:search_path
No olvides configurar el
search_path
. Si solo obtuvo una base de datos en el clúster, puede establecer el valor predeterminado global enpostgresql.conf
. De lo contrario (más probable), configúrelo como propiedad de la base de datos, o solo para los roles involucrados o incluso la combinación de ambos. Detalles:Es posible que desee configurarlo
schma, public
si también usa el esquema público, o incluso (menos probable)$user, schma, public
...Una alternativa sería utilizar el esquema predeterminado "público" que debería funcionar con la configuración predeterminada para, a
search_path
menos que lo haya cambiado. Recuerde revocar los privilegiosPUBLIC
en este caso.Relacionado
fuente
this
parece una instrucción para la nave espacial ...