Comment créer un utilisateur en lecture seule pour les sauvegardes dans PostgreSQL?

15

Est-il vrai qu'il est IMPOSSIBLE de créer un utilisateur de sauvegarde en lecture seule dans PostgreSQL?

J'ai été informé sur un canal IRC que vous ne pouvez tout simplement pas avoir un utilisateur de sauvegarde uniquement sans privilèges de propriété. Je trouve cela très étrange, donc je veux m'assurer de ne rien manquer.

Voici ce que j'ai essayé mais cela ne me donne pas les résultats que je recherche. Quand je fais pg_dumpsur une table donnée, je reçois Permission denied for relation...:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO backup; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO backup; 
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO backup;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, USAGE ON SEQUENCES TO backup;

Toute aide serait grandement appréciée!

milosgajdos
la source

Réponses:

9

Non, c'est facile (maintenant de toute façon).

  1. Accorder l'autorisation de connexion sur un nouvel utilisateur

    GRANT CONNECT ON DATABASE mydb TO myReadolyUser;
  2. Accordez les autorisations sur tous les objets de base de données actuels . Ceci est spécifique au schéma et vous devrez exécuter une copie pour chaque schéma que vous souhaitez que votre utilisateur utilise,

    GRANT SELECT ON ALL TABLES IN SCHEMA mySchema TO myReadonlyUser;

    À partir des documents , ALL TABLEScomprend tout ce que vous souhaitez.

    Il existe également une option pour accorder des privilèges sur tous les objets du même type dans un ou plusieurs schémas. Cette fonctionnalité n'est actuellement prise en charge que pour les tables, les séquences et les fonctions (mais notez que TOUS LES TABLEAUX sont considérés comme incluant des vues et des tables étrangères.

  3. Ensuite, ALTER DEFAULT PRIVLEGESpour accorder des SELECT privilèges futurs aux objets non encore créés.

    ALTER DEFAULT PRIVILEGES IN SCHEMA mySchema
    GRANT SELECT ON TABLES TO myReadonlyUser;
Evan Carroll
la source
J'ai remarqué que lors de l' exécution ALTER DEFAULT PRIVILEGES ... myReadonlyUser, 2 lignes supplémentaires sont ajoutées à la décharge: ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM PUBLIC; ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM root;. Des sons comme celui-ci signifieront que root ne pourra rien faire sur les nouvelles tables. Est-ce vrai?
dthor
De plus, si vos tables utilisent bigintvotre utilisateur en lecture seule, il faudra probablement aussiGRANT SELECT ON ALL SEQUENCES
dthor
6

Le moyen simple et agréable est de créer un superutilisateur avec une autorisation en lecture seule.

  • Connectez-vous en psqltant que postgres ou autre superutilisateur.
  • Créez le nouveau rôle de superutilisateur et définissez-le en lecture seule:

    CREATE USER backadm SUPERUSER  password '<PASS>';
    ALTER USER backadm set default_transaction_read_only = on;
    • Remplacez <PASS>par votre mot de passe choisi.
    • Vous pouvez remplacer backadmpar le nom d'utilisateur choisi. (Je mets backadmpour Backup Administrator).
    • N'OUBLIEZ PAS les guillemets simples pour le mot de passe.

Vous pouvez maintenant utiliser ce rôle pour sauvegarder.

Rémi B.
la source
6
Ewww. Un superutilisateur à sauvegarder? Il a spécifiquement demandé la lecture seule. Cet utilisateur est un SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITEou ALTER USER backadm set default_transaction_read_only = off;loin d'avoir un accès illimité à la base de données.
Evan Carroll
Cet utilisateur pourra toujours supprimer des tables / schémas / bases de données, même si les transactions sont en lecture seule.
Igor Mukhin
4

Notez que le blog référencé dans la réponse donnée par @Gyre ne fonctionnera pas pour créer un utilisateur en lecture seule "application" (c'est-à-dire pour créer un rôle en lecture seule pour une application Web pour se connecter à la base de données), et pourrait ouvrir un grave vulnérabilité de sécurité, car elle est facilement évitable, comme expliqué dans cette réponse de liste postgresql . Pour référence, par le client remplaçant les paramètres de session:

SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE

Reportez-vous à la présentation «Gestion des droits dans postgresql» liée dans le wiki postgres pour une méthode plus détaillée, similaire à celle publiée dans la question.

Sundar
la source
Ce n'est pas vraiment une réponse, c'est une critique des autres réponses pour l'insécurité que j'ai copiée en commentaire. J'ai répondu correctement à cette question maintenant.
Evan Carroll du
3

Après avoir testé la solution d'Evan Caroll, j'ai rencontré cette erreur:

ERREUR: autorisation refusée pour la relation 'table'

il manque une autre autorisation:

GRANT SELECT ON ALL SEQUENCES IN SCHEMA mySchema TO myReadonlyUser

L'ajout de cette autorisation m'a permis de sauvegarder avec mon utilisateur en lecture seule.

Jean-François Godbout
la source
2

J'ai fait des recherches appropriées et il semble y avoir une solution à cela. Je suis tombé sur ce blog qui explique parfaitement ce qui doit être fait. J'espère que cela aide les gens qui recherchent la même réponse que moi. Évidemment - la restauration des sauvegardes effectuées de cette façon est une question différente.

milosgajdos
la source
Au lieu de simplement vous lier à l'article de blog, vous devez ajouter quelques détails à votre réponse au cas où l'article de blog souffrirait de pourriture de lien (voir en.wikipedia.org/wiki/Link_rot )
Max Vernon
L'idée de base du blogpost est ALTER USER set default_transaction_read_only = on;, ce qui n'empêche pas l'utilisateur de le changer.
blueyed
Ewww. Un superutilisateur à sauvegarder? Il a spécifiquement demandé la lecture seule. Cet utilisateur est un SET SESSION CARACTERISTICS AS TRANSACTION READ WRITE ou ALTER USER backadm set default_transaction_read_only = off; loin d'avoir un accès illimité à la base de données.
Evan Carroll