Je souhaite migrer une application assez simple, interne, pilotée par une base de données, de SQLite3 vers PostgreSQL 9.3 et renforcer les autorisations dans la base de données au fur et à mesure.
L'application consiste actuellement en une commande permettant de mettre à jour les données; et un pour l'interroger. Naturellement, je devrai également gérer la base de données de différentes manières (créer de nouvelles tables, vues, déclencheurs, etc.).
Bien que cette application soit la seule hébergée sur le serveur au début, je préférerais partir du principe qu’elle pourrait être hébergée sur un serveur avec d’autres bases de données, plutôt que de devoir se débrouiller plus tard si cela devenait nécessaire. l'avenir.
Je pense que cela correspond à un ensemble d’exigences assez commun, mais j’ai du mal à trouver un tutoriel simple expliquant comment configurer une nouvelle base de données dans PostgreSQL, avec ce type de séparation utilisateur / privilège. Les références sont détaillées sur les groupes, les utilisateurs, les rôles, les bases de données, les schémas et le domaine; mais je les trouve déroutant.
Voici ce que j'ai essayé jusqu'à présent (de l'intérieur en psql
tant que "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;
Mais je ne reçois pas la sémantique voulue. Je veux que ce soit configuré de sorte que seul le hostdb_admin
peut créer (et supprimer et modifier) des tables; le hostdb_mgr
peut lire, insérer, mettre à jour et supprimer sur toutes les tables par défaut; et le hostdb_usr
ne peut lire que toutes les tables (et les vues).
Lorsque j'ai essayé cela, j'ai découvert que j'étais capable de créer des tables dans hostdb
n'importe lequel de ces utilisateurs; mais, pour chaque utilisateur, je ne pouvais que lire ou modifier les tables créées par cet utilisateur - à moins d'utiliser un fichier explicite GRANT
.
Je suppose qu'il manque quelque chose entre CREATE DATABASE
et CREATE SCHEMA
, quelque chose à appliquer SCHEMA
à la DATABASE
?
(Au fur et à mesure que les choses avancent, j'ai aussi des questions pour appliquer des restrictions similaires sur TRIGGERS
les procédures stockées VIEWS
et peut-être d'autres objets)
Où puis-je trouver un guide, une série de tutoriels ou de vidéos sur ce sujet?
la source
public
pseudorole. On peut penser à un rôle dont tous les autres rôles (utilisateur, groupe - ils sont tous identiques) sont membres de. Essayez de supprimer les privilèges de celui-ci, par exempleREVOKE CREATE ON SCHEMA hostdb FROM public
. La révocation des droits au niveau de la base de données, comme vous l'avez fait, ne désactive que certaines autorisations au niveau de la base de données, aucun effet sur les schémas ou les tables.public
arrive avec des privilèges pourPUBLIC
. En dehors de cela, il n'y a pas de privilèges par défaut pour les nouveaux schémas. Donc, cela n’affecte pas le cas d’utilisation démontré. Voir le chapitre dans ma réponse.Réponses:
Vous trouverez tout dans le manuel. Liens ci-dessous.
Certes, l’affaire n’est pas anodine et parfois source de confusion. Voici une recette pour le cas d'utilisation:
Recette
En tant que superutilisateur
postgres
:Si vous souhaitez un administrateur plus puissant pouvant également gérer des bases de données et des rôles, ajoutez les attributs de rôle
CREATEDB
et les optionsCREATEROLE
ci - dessus.Attribuez chaque rôle au niveau immédiatement supérieur, afin que tous les niveaux "héritent" au moins de l'ensemble des privilèges du niveau inférieur suivant (en cascade):
Je nomme le schéma
schma
(hostdb
ce qui ne serait pas déroutant). Choisissez n'importe quel nom. En option rendreschma_admin
le propriétaire du schéma:Pour
and drop and alter
voir les notes ci-dessous.Les vues sont spéciales. Pour un:
Et pour les vues pouvant être mises à jour :
Les déclencheurs sont aussi spéciaux. Vous avez besoin du
TRIGGER
privilège sur la table et:Mais nous élargissons déjà trop le champ de cette question ...
Notes IMPORTANTES
La possession
Si vous voulez autoriser
schma_admin
(seul) de laisser tomber et tables alter, faire le rôle posséder tous les objets. La documentation:Ou créez tous les objets avec le rôle
schma_admin
pour commencer, vous n'avez pas besoin de définir explicitement le propriétaire. Cela simplifie également les privilèges par défaut, que vous ne devez ensuite définir que pour un seul rôle:Objets préexistants
Les privilèges par défaut ne s'appliquent qu'aux objets nouvellement créés et uniquement au rôle particulier avec lequel ils ont été créés. Vous voudrez également adapter les autorisations pour les objets existants :
Il en va de même si vous créez des objets avec un rôle non
DEFAULT PRIVILEGES
défini, comme le superutilisateurpostgres
. Réaffectez la propriétéschma_admin
et définissez les privilèges manuellement - ou définissezDEFAULT PRIVILEGES
-postgres
les également (tout en étant connecté au bon DB!):Privilèges par défaut
Il vous manquait un aspect important de la
ALTER DEFAULT PRIVILEGES
commande. Il s'applique au rôle actuel, sauf indication contraire:Les privilèges par défaut s'appliquent uniquement à la base de données actuelle. Donc, vous ne plaisantez pas avec les autres bases de données du cluster de base de données. La documentation:
Vous pouvez également définir des privilèges par défaut pour
FUNCTIONS
etTYPES
(pas seulementTABLES
etSEQUENCES
), mais ils ne sont peut-être pas nécessaires.Privilèges par défaut pour
PUBLIC
Les privilèges par défaut accordés à
PUBLIC
sont rudimentaires et surestimés par certains. La documentation:Gras accent mien. typiquement la commande ci-dessus est suffisante pour tout couvrir:
En particulier, aucun privilège par défaut n'est accordé aux
PUBLIC
nouveaux schémas. Il peut être déroutant que le schéma par défaut nommé "public" commence par desALL
privilèges pourPUBLIC
. Ceci est juste une fonctionnalité pratique pour faciliter le démarrage avec les bases de données nouvellement créées. Cela n'affecte en aucun cas les autres schémas. Vous pouvez révoquer ces privilèges dans la base de données de modèlestemplate1
, puis toutes les bases de données nouvellement créées dans ce cluster démarrent sans elles:Le privilège
TEMP
Étant donné que nous avons révoqué tous les privilèges
hostdb
dePUBLIC
, les utilisateurs normaux ne peuvent pas créer de tables temporaires à moins que nous ne le permettions explicitement. Vous pouvez ou non vouloir ajouter ceci:search_path
N'oubliez pas de définir le
search_path
. Si vous ne possédez que la base de données du cluster, vous pouvez simplement définir la valeur par défaut globale danspostgresql.conf
. Sinon (plus probablement), définissez-le comme propriété de la base de données, ou simplement pour les rôles impliqués ou même la combinaison des deux. Détails:Vous voudrez peut-être le définir sur
schma, public
si vous utilisez également le schéma public, ou même (moins probable)$user, schma, public
...Une alternative serait d'utiliser le schéma par défaut "public" qui devrait fonctionner avec les paramètres par défaut
search_path
sauf si vous le modifiez. N'oubliez pas de révoquer les privilègesPUBLIC
dans ce cas.Apparenté, relié, connexe
la source
this
ça ressemble à des instructions pour le vaisseau spatial ...