web-dev-qa-db-fra.com

Comment interroger la configuration pg_hba en cours d'exécution?

Je veux tester si une connexion de réplication est autorisée par pg_hba.conf sur le fournisseur avant d'émettre la commande de démarrage de la réplication, et je ne sais pas comment. (J'ai accès aux shells unix et postgresql sur les deux nœuds)

Pour la connexion sans réplication, je connecterais psql en utilisant une connstring comme 'Host=$MASTER_IP port=5432 dbname=$DATABASE user=$DBUSER password=$DBPASSWORD'

Context: J'écris un script pour automatiser la configuration de la réplication entre les serveurs, et la configuration des serveurs est gérée via différents systèmes/référentiels (raisons héritées). Par conséquent, je veux tester si les paramètres sont corrects à chaque étape.

8
victorjtfranco

Version 10 et supérieure

Il existe une vue très pratique pour cela appelée pg_hba_file_rules .

table pg_hba_file_rules ;

 line_number │   type    │   database    │  user_name  │  address  │                 netmask                 │ auth_method │ options │ error 
─────────────┼───────────┼───────────────┼─────────────┼───────────┼─────────────────────────────────────────┼─────────────┼─────────┼───────
           3 │ local     │ {all}         │ {all}       │           │                                         │ trust       │         │ 
           4 │ hostssl   │ {all}         │ {+users}    │ 127.0.0.1 │ 255.255.255.255                         │ pam         │         │ 
           5 │ Host      │ {all}         │ {all}       │ 127.0.0.1 │ 255.255.255.255                         │ md5         │         │ 
           6 │ hostssl   │ {all}         │ {+users}    │ ::1       │ ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff │ pam         │         │ 
           7 │ Host      │ {all}         │ {all}       │ ::1       │ ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff │ md5         │         │ 
           8 │ hostssl   │ {replication} │ {standby}   │ all       │                                         │ md5         │         │ 
           9 │ hostnossl │ {all}         │ {all}       │ all       │                                         │ reject      │         │ 

Jusqu'à la version 9.6

Pour les versions antérieures, il est un peu lourd et sujet aux erreurs (et ne fonctionne que pour les superutilisateurs, voir les notes).

La seule façon intégrée de lire pg_hba.conf Que j'imagine actuellement est d'utiliser pg_read_file().

SELECT pg_read_file('pg_hba.conf');

vous renverra le fichier entier, sur une seule ligne, qui contient ensuite les caractères de nouvelle ligne (que ce soit la saveur que votre système d'exploitation aime:

[...]
 # TYPE  DATABASE        USER            ADDRESS                 METHOD↵
                                                                       ↵
 # "local" is for Unix domain socket connections only                  ↵
 local   all             all                                     md5   ↵
 # IPv4 local connections:                                             ↵
 Host    all             all             127.0.0.1/32            md5   ↵
[...]

Vous pouvez ensuite traiter cela à votre guise.

Remarques:

  • Le documentation nous dit ce qui suit:

    Les fonctions présentées dans le tableau 9-86 [ pg_read_file () inclus - moi] fournissent un accès natif aux fichiers sur la machine hébergeant le serveur. Seuls les fichiers du répertoire du cluster de bases de données et du répertoire log_ sont accessibles. Utilisez un chemin relatif pour les fichiers du répertoire de cluster et un chemin correspondant au paramètre de configuration log_directory pour les fichiers journaux. L'utilisation de ces fonctions est réservée aux superutilisateurs.

    Le peu de superutilisateurs ne devrait pas vous poser de problème, car vous configurez la réplication. Si pg_hba.conf Ne se trouve pas dans les répertoires mentionnés, vous pouvez y ajouter un lien symbolique pour tromper le système:

postgres@Z22309: cd /var/lib/postgresql/9.5/main
postgres@Z22309:~/9.5/main$ ln -s /etc/postgresql/9.5/main/pg_hba.conf pg_hba.conf
  • Tout cela ne vous dira pas si le fichier a été modifié mais la configuration n'est pas rechargée. Pour cela, vous devez comparer les résultats de pg_conf_load_time() et pg_stat_file(), comme indiqué ci-dessous. Dans le même temps, vous ne saurez toujours pas exactement quelles modifications ont été apportées depuis le dernier rechargement. De plus, comme mentionné dans un commentaire, pg_conf_load_time() avancera même lorsque le chargement du fichier n'a pas réussi, ce qui crée de la confusion - du moins, je ne sais pas comment on pourrait dire que le rechargement a réussi ou non.
SELECT pg_conf_load_time() > modification FROM pg_stat_file('pg_hba.conf');
  • Dans ne autre réponse , je montre un moyen de diviser les lignes retournées ci-dessus.
13
dezso