Lyon, le 28 mai 2026

CloudNativePG ou comment embarquer un éléphant sur un porte-conteneurs !

La configuration d’une instance PostgreSQL, où qu’elle soit déployée, nécessite d’être faite. La configuration des règles d’accès dans pg_hba.conf est essentielle. Regardons une nouveauté de la version 1.29 de l’opérateur qui permet de reconfigurer dynamiquement ce fichier.

moteur

Rappel sur pg_hba.conf

L’authentification à une instance est paramétrée au moyen de ce fichier. Lorsque le serveur PostgreSQL reçoit une demande de connexion, il connaît le type de connexion utilisé par le client (socket Unix, connexion TCP SSL, connexion TCP simple, etc.). Il connaît aussi l’adresse IP du client (dans le cas d’une connexion via une socket TCP), le nom de la base et celui de l’utilisateur. En fonction des règles présentes et de la méthode d’authentification indiquée, le client est autorisé, ou non, à se connecter.

Une instance déployée avec CloudNativePG voit son fichier pg_hba.conf être pré-configuré. Il est possible de trouver les règles actuellement définies avec la requête SQL suivante :

select type, database, user_name, address, netmask, auth_method from pg_hba_file_rules ;
  type   |   database    |        user_name        | address | netmask |  auth_method  
---------+---------------+-------------------------+---------+---------+---------------
 local   | {all}         | {cnpg_metrics_exporter} |         |         | peer
 local   | {all}         | {all}                   |         |         | peer
 hostssl | {postgres}    | {streaming_replica}     | all     |         | cert
 hostssl | {replication} | {streaming_replica}     | all     |         | cert
 hostssl | {all}         | {cnpg_pooler_pgbouncer} | all     |         | cert
 host    | {all}         | {all}                   | all     |         | scram-sha-256

La dernière ligne indique que toutes les demandes de connexion à l’instance faites par n’importe quel utilisateur, sur n’importe quelle base et venant de n’importe quelle source, doit utiliser le mécanisme d’authentification scram-sha-256.

Restriction forte des accès

L’ajout de règles se fait via l’opérateur et doit être écrite dans la définition YAML du Cluster. Prenons le cas de figure où l’on souhaite autoriser uniquement un rôle d’administration (admin) à se connecter à la base postgres à distance. Toutes les autres connexions doivent être rejetées (reject). Cela donnerait quelque chose comme :

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: postgresql-prod
spec:
  instances: 1
  storage:
    size: 1Gi
  postgresql:
    pg_hba:
      - host postgres admin all scram-sha-256
      - host all all all reject

Pour des raisons de sécurité, il est préférable de restreindre les connexions provenant de sources bien identifiées. Ainsi le mot clé all dans cette ligne

      - host postgres admin all scram-sha-256

devrait être changé par 10.244.0.10/32, la seule adresse IP source autorisée. Une restriction forte est donc appliquée… mais qu’en est-il si l’adresse IP autorisée venait à changer une fois ? la modification ne serait pas trop lourde à effectuer. Deux fois ? On prendra notre mal en patience et on le ferait. Mais 100 fois ? 1000 fois ? Cela deviendrait intenable. Ceci est d’autant plus vrai que, dans un contexte Kubernetes, la volatilité des Pods, et donc de leur adresse IP, est grande et même inhérente à sa conception. Il faut donc avoir un outil qui permettrait de tenir à jour le fichier pg_hba.conf de notre Cluster.

Résolution dynamique d’adresse

La version 1.29 de l’opérateur apporte cette solution en se reposant sur le mécanisme de labels de Kubernetes. L’opérateur est capable de reconfigurer le pg_hba.conf dynamiquement avec l’adresse IP des Pods qui ont un label spécifique. Prenons l’exemple d’un Pod pgAdmin déployé avec une ressource Deployment pour laquelle le label app=pgadmin est renseigné.

Dans la partie spec du Cluster, il est désormais possible de renseigner la section podSelectorRefs qui permet d’indiquer une référence aux Pods (podSelectorRefs) ayant un label spécifique (selector.matchLabels).

  podSelectorRefs:
  - name: app-pgadmin
    selector:
      matchLabels:
        app: pgadmin

Aussi, dans la partie pg_hba, le champ correspondant aux adresses IP peut être remplacé par la syntaxe suivante ${podselector:app-pgadmin}.

  postgresql:
    pg_hba:
      - host postgres admin ${podselector:app-pgadmin} scram-sha-256
      - host all all all reject

Désormais, dès lors qu’un Pod avec le label app=pgadmin est créé, CloudNativePG ajustera le fichier pg_hba.conf et rechargera l’instance PostgreSQL pour que la nouvelle adresse IP soit autorisée à se connecter.

Le passage du paramètre spec.replicas à 2 du Deployment pgAdmin est bien “reporté” dans le fichier pg_hba.conf : deux lignes sont présentes avec les adresses IP des Pods pgAdmin.

psql (18.3 (Debian 18.3-1.pgdg13+1))
Type "help" for help.

postgres=# select type, database, user_name, address, netmask, auth_method from pg_hba_file_rules ;
  type   |   database    |        user_name        |   address   |     netmask     |  auth_method  
---------+---------------+-------------------------+-------------+-----------------+---------------
 local   | {all}         | {cnpg_metrics_exporter} |             |                 | peer
 local   | {all}         | {all}                   |             |                 | peer
 hostssl | {postgres}    | {streaming_replica}     | all         |                 | cert
 hostssl | {replication} | {streaming_replica}     | all         |                 | cert
 hostssl | {all}         | {cnpg_pooler_pgbouncer} | all         |                 | cert
 host    | {postgres}    | {admin}                 | 10.244.0.11 | 255.255.255.255 | scram-sha-256
 host    | {postgres}    | {admin}                 | 10.244.0.12 | 255.255.255.255 | scram-sha-256
 host    | {all}         | {all}                   | all         |                 | reject
 host    | {all}         | {all}                   | all         |                 | scram-sha-256
(9 rows)

Conclusion

Maintenir un fichier pg_hba.conf pour autoriser ou interdire les accès est important. Dans un environnement virtualisé ou baremetal, ce fichier n’est généralement mis à jour que très ponctuellement. Dans des environnements Kubernetes où la durée de vie des applications peut être très court, des mécanismes d’automatisation sont nécessaires. C’est le cas de cette nouveauté de la version 1.29 de l’opérateur.

Des questions, des commentaires ? Écrivez-nous !


DALIBO

DALIBO est le spécialiste français de PostgreSQL®. Nous proposons du support, de la formation et du conseil depuis 2005.