web-dev-qa-db-fra.com

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

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 que je ne manque pas quelque chose.

Voici ce que j'ai essayé mais cela ne me donne pas les résultats que je recherche. Quand je fais pg_dump sur 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!

17
milosgajdos

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 en cours. 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;
    

    De les docs , ALL TABLES comprend 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. Alors ALTER DEFAULT PRIVLEGES pour accorder futureSELECT privilèges pour les objets non encore créés.

    ALTER DEFAULT PRIVILEGES IN SCHEMA mySchema
    GRANT SELECT ON TABLES TO myReadonlyUser;
    
13
Evan Carroll

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

  • Connectez-vous psql en tant 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;
    
    • Remplacer <PASS> par le mot de passe choisi.
    • Vous pouvez remplacer backadm par le nom d'utilisateur choisi. (J'ai mis backadm pour Backup Administrator).
    • N'OUBLIEZ PAS les guillemets simples pour le mot de passe.

Vous pouvez maintenant utiliser ce rôle pour sauvegarder.

7
Rémi B.

Notez que le blog référencé dans le 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 une grave vulnérabilité de sécurité, car elle est facilement contournable, 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 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.

4
sundar

Après avoir testé la sauvegarde de la solution d'Evan Caroll, je suis tombé sur 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.

4

J'ai fait des recherches appropriées et il semble y avoir une solution à cela. Je suis tombé sur ce article de 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.

2
milosgajdos