Sécuriser les connexions à vos instances PostgreSQL

Préambule

La sécurité est l’affaire de tous, même des DBA !
Afin de sécuriser les connexions entre un client et une base de données PostgreSQL, il est possible de mettre en place une configuration basés sur des certificats SSL. C’est ce que nous allons détailler dans cet article.

Pré-requis

Afin de mettre en place une connexion SSL, vous devez valider les éléments suivants :

  • Vous devez commander ou générer un certificat pour le serveur hébergeant votre base PostgreSQL
  • Vous devez commander ou générer un certificat pour le ou les serveurs clients qui vont se connecter à votre base
  • Récupérer au format « .crt » le certificat racine de l’autorité qui a délivré vos certificats (si vous n’avez pas l’information, il suffit d’ouvrir le certificat sous Windows).

Une fois vos certificats aux format « .p12 » récupérés, transférez les sur les serveurs auxquels ils sont associés, ainsi que le certificat racine sur tous les serveurs.

Configuration côté serveur PostgreSQL

Sur le serveur PostgreSQL, la première étape va consister à extraire la clé et le certificat au format « .crt » depuis votre fichier « .p12 ».

openssl pkcs12 -in monserveurpostgresql.p12 -nocerts -out server.key
openssl pkcs12 -in monserveurpostgresql.p12 -clcerts -out server.crt

Une fois cette étape réalisée, recopiez ces deux fichiers ainsi que votre certificat racine dans le répertoire base de PostgreSQL (exemple : /u01/postgresql-9.6/)

mv server.key server.crt root.crt /u01/postgresql-9.6/

Dernière étape, il faut modifier la configuration du cluster PostgreSQL en positionnant les paramètres suivants dans le fichier postgresql.conf, puis en redémarrant les services :

ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = 'root.crt'
service postgresql-9.6 stop
service postgresql-9.6 start

Pour tester que tout est bien en place, vous pouvez effectuer une connexion locale et vous devriez obtenir :

[postgres@monserveurpostgresql~21:33:27 ~]$ psql -h localhost
psql (9.6.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=#

Configuration côté client

Ici, tout va dépendre de la façon dont vous vous connectez à votre base : JDBC, client lourd, applicatif spécifique, …
Rien de bien sorcier dans tous les cas, il vous suffira d’activer la connexion sécurisée, et de fournir le certificat de votre serveur client.