Sécuriser les Connexions PostgreSQL avec la Configuration SSL/TLS : Guide Complet

Apprenez à sécuriser les connexions PostgreSQL grâce au chiffrement SSL/TLS. Ce guide complet couvre la configuration côté serveur et côté client, y compris la génération de certificats, la modification de `postgresql.conf` et de `pg_hba.conf`, et la configuration des clients pour une communication sécurisée et chiffrée. Protégez vos données sensibles en transit et assurez la conformité aux normes de sécurité modernes.

94 vues

Sécurisation des connexions PostgreSQL avec la configuration SSL/TLS : Un guide complet

Dans le paysage numérique interconnecté d'aujourd'hui, la sécurisation des données en transit est primordiale. PostgreSQL, une base de données relationnelle open-source puissante, offre des mécanismes robustes pour chiffrer les connexions à l'aide de SSL/TLS. Ce guide fournit une présentation complète de la configuration des serveurs et des clients PostgreSQL pour appliquer le chiffrement SSL/TLS, protégeant ainsi les informations sensibles contre l'écoute clandestine et les attaques de l'homme du milieu sur les réseaux non fiables. La mise en œuvre de ces mesures de sécurité est cruciale pour maintenir l'intégrité des données, assurer la conformité avec des normes de sécurité strictes et renforcer la confiance de vos utilisateurs.

Cet article couvrira les étapes essentielles, de la génération ou de l'obtention des certificats SSL à la configuration de PostgreSQL pour les utiliser, et enfin, la configuration des clients pour des connexions sécurisées. Nous examinerons les paramètres de configuration nécessaires et fournirons des exemples pratiques pour vous aider à mettre en œuvre efficacement ces améliorations de sécurité.

Comprendre SSL/TLS dans PostgreSQL

SSL/TLS (Secure Sockets Layer/Transport Layer Security) est un protocole cryptographique conçu pour assurer la sécurité des communications sur un réseau informatique. Lorsqu'il est appliqué à PostgreSQL, il chiffre les données échangées entre le serveur de base de données et ses clients. Cela empêche les parties non autorisées d'intercepter et de lire des informations sensibles comme les identifiants, les données financières ou les informations personnelles.

PostgreSQL prend en charge deux modes principaux pour SSL/TLS :

  • ssl=on : Autorise les connexions SSL mais ne les exige pas. Les clients peuvent se connecter en utilisant des connexions SSL ou non-SSL.
  • ssl=prefer : Tente d'établir une connexion SSL mais revient à une connexion non-SSL si elle échoue.
  • ssl=require : Exige des connexions SSL. Si une connexion SSL ne peut pas être établie, la connexion client sera rejetée.

L'application de ssl=require est l'option la plus sécurisée pour protéger les données en transit.

Prérequis pour la configuration SSL/TLS

Avant de commencer à configurer PostgreSQL pour SSL/TLS, assurez-vous d'avoir ce qui suit :

  1. OpenSSL installé : La boîte à outils OpenSSL est essentielle pour générer et gérer les certificats SSL. Elle est généralement préinstallée sur les systèmes Linux et macOS. Pour Windows, vous devrez peut-être la télécharger et l'installer séparément.
  2. Accès aux fichiers de configuration PostgreSQL : Vous aurez besoin de privilèges administratifs pour modifier les fichiers postgresql.conf et pg_hba.conf.
  3. Compréhension des autorités de certification (CA) : Bien que vous puissiez créer des certificats auto-signés pour les tests, les environnements de production devraient idéalement utiliser des certificats signés par une autorité de certification (CA) de confiance ou une CA d'entreprise interne.

Configuration SSL/TLS côté serveur

La configuration côté serveur implique l'activation de SSL, la spécification de l'emplacement des certificats et clés SSL, et la configuration de l'authentification client.

1. Génération ou obtention des certificats et clés SSL

Il existe deux façons principales d'obtenir des certificats SSL pour votre serveur PostgreSQL :

  • Certificats auto-signés (pour les tests/développement) : Ceux-ci sont créés à l'aide d'OpenSSL et ne sont pas fiables par défaut pour les clients externes. Ils sont utiles pour la configuration initiale et les tests internes.
  • Certificats d'une autorité de certification (CA) (pour la production) : Obtenez des certificats auprès d'une CA publique de confiance (par exemple, Let's Encrypt, DigiCert) ou d'une CA d'entreprise interne. Cela garantit que les clients peuvent vérifier l'identité du serveur.

Création de certificats auto-signés à l'aide d'OpenSSL :

C'est une approche courante pour les environnements de développement et internes. Exécutez les commandes suivantes sur votre serveur PostgreSQL ou une machine avec OpenSSL :

  1. Créer un répertoire pour les certificats : Il est bon de garder les certificats organisés.
    bash sudo mkdir -p /etc/postgresql/ssl sudo chown postgres:postgres /etc/postgresql/ssl cd /etc/postgresql/ssl

  2. Générer la clé privée du serveur : Cette clé doit rester secrète.
    bash sudo openssl genrsa -des3 -out server.key 2048
    Il vous sera demandé d'entrer une phrase secrète. Mémorisez cette phrase secrète, car vous en aurez besoin au démarrage de PostgreSQL.

  3. Supprimer la phrase secrète (facultatif mais recommandé pour les redémarrages automatisés) : Pour un démarrage automatisé sans saisie manuelle de la phrase secrète, supprimez la phrase secrète. Soyez extrêmement prudent, car toute personne ayant accès à ce fichier peut usurper l'identité de votre serveur.
    bash sudo openssl rsa -in server.key -out server.key

  4. Créer une demande de signature de certificat (CSR) de serveur : Cela contient des informations sur votre serveur.
    bash sudo openssl req -new -key server.key -out server.csr
    Il vous sera demandé des informations comme le nom du pays, l'état, le nom de la localité, le nom de l'organisation, le nom commun (qui devrait être le nom d'hôte ou l'adresse IP de votre serveur) et une adresse e-mail.

  5. Signer le certificat avec votre propre CA (pour un usage interne) :

    • Créer une clé privée et un certificat CA racine (si vous n'en avez pas) :
      bash # Générer la clé privée de la CA sudo openssl genrsa -des3 -out root.key 2048 # Créer le certificat de la CA (valide pour 3650 jours) sudo openssl req -new -x509 -days 3650 -key root.key -out root.crt
    • Signer le CSR du serveur avec la CA : Cela crée le certificat de serveur de confiance.
      bash sudo openssl x509 -req -days 365 -in server.csr -CA root.crt -CAkey root.key -set_serial 01 -out server.crt
  6. Définir les permissions : Assurez-vous que l'utilisateur PostgreSQL peut lire ces fichiers.
    bash sudo chown postgres:postgres server.key server.crt root.crt sudo chmod 600 server.key sudo chmod 644 server.crt root.crt

Utilisation de certificats d'une CA publique/entreprise :

Si vous obtenez des certificats d'une CA, vous recevrez généralement :

  • server.crt : Le certificat public de votre serveur.
  • server.key : La clé privée de votre serveur.
  • root.crt (ou similaire) : Le certificat racine de la CA (et potentiellement des certificats intermédiaires).

Placez ces fichiers dans un répertoire sécurisé (par exemple, /etc/postgresql/ssl/) et assurez-vous que l'utilisateur PostgreSQL dispose des permissions de lecture.

2. Configuration de postgresql.conf

Modifiez votre fichier postgresql.conf (généralement situé dans le répertoire de données de votre PostgreSQL) pour activer SSL et spécifier les fichiers de certificat.

#------------------------------------------------------------------------------
# SSL
#------------------------------------------------------------------------------

ssl = on

# Ceux-ci sont tous au format PEM et sont ignorés si la clé/le certificat du serveur ne sont
# pas configurés. Par défaut, les fichiers sont censés se trouver dans le répertoire
# de données du serveur. Alternativement, ils peuvent être spécifiés comme des chemins complets.
ssl_cert_file = '/etc/postgresql/ssl/server.crt'     # (changer le nom du fichier si nécessaire)
ssl_key_file = '/etc/postgresql/ssl/server.key'      # (changer le nom du fichier si nécessaire)
ssl_ca_file = '/etc/postgresql/ssl/root.crt'         # (facultatif, pour la vérification du certificat client)

# Facultatif : spécifier la liste des chiffrements si nécessaire
#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL'

# Facultatif : activer la vérification du certificat client
#ssl_ca_file doit être défini sur un fichier contenant les certificats CA à faire confiance
#ssl_crl_file = ''
#ssl_crl_dir = ''
  • ssl = on : Active la prise en charge de SSL sur le serveur.
  • ssl_cert_file : Chemin vers le certificat public du serveur.
  • ssl_key_file : Chemin vers la clé privée du serveur.
  • ssl_ca_file : Chemin vers le certificat de la CA (si vous souhaitez vérifier les certificats clients ou si votre certificat de serveur est signé par une CA personnalisée).

3. Configuration de pg_hba.conf pour l'application SSL

Le fichier pg_hba.conf contrôle l'authentification des clients. Vous devez modifier les entrées pour appliquer les connexions SSL.

Par défaut, les entrées dans pg_hba.conf ressemblent à ceci :

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     peer
# Connexions locales IPv4 :
host    all             all             127.0.0.1/32            scram-sha-256
# Connexions locales IPv6 :
host    all             all             ::1/128                 scram-sha-256

Pour appliquer SSL, changez les entrées host en hostssl :

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     peer
# Connexions locales IPv4 :
hostssl all             all             127.0.0.1/32            scram-sha-256
# Connexions locales IPv6 :
hostssl all             all             ::1/128                 scram-sha-256

# Exemple pour l'accès réseau externe - nécessite SSL
hostssl all             all             0.0.0.0/0               scram-sha-256
hostssl all             all             ::/0                    scram-sha-256
  • hostssl : Ce type d'enregistrement exige des connexions SSL. Toute tentative de connexion sans SSL sera rejetée.
  • hostnossl : Ce type d'enregistrement interdit explicitement les connexions SSL.
  • host : Autorise les connexions SSL et non-SSL (c'est la valeur par défaut et moins sécurisée).

4. Redémarrage du serveur PostgreSQL

Après avoir modifié postgresql.conf et pg_hba.conf, vous devez redémarrer le service PostgreSQL pour que les modifications prennent effet.

# Pour les systèmes utilisant systemd (la plupart des distributions Linux modernes)
sudo systemctl restart postgresql

# Pour les systèmes utilisant init.d
sudo service postgresql restart

Configuration SSL/TLS côté client

Les clients doivent également être configurés pour se connecter en toute sécurité. Cela implique la spécification des paramètres de connexion, la fourniture potentielle de certificats clients et la vérification du certificat du serveur.

1. Paramètres de la chaîne de connexion

Lors de la connexion via psql ou toute bibliothèque cliente PostgreSQL, vous pouvez spécifier les paramètres SSL dans la chaîne de connexion ou comme options individuelles.

Connexion SSL de base (authentification du serveur uniquement) :

psql "sslmode=require host=your_server_hostname dbname=your_db user=your_user"
  • sslmode : Contrôle le comportement SSL du client.
    • disable : Autoriser uniquement les connexions non-SSL.
    • allow : Autoriser les non-SSL, mais préférer SSL si le serveur le prend en charge.
    • prefer (par défaut) : Préférer SSL, mais autoriser les non-SSL si SSL échoue.
    • require : Autoriser uniquement les connexions SSL. Si le serveur ne prend pas en charge SSL, la connexion échoue.
    • verify-ca : Autoriser uniquement les connexions SSL et vérifier que le certificat du serveur est signé par une CA de confiance. Le paramètre sslrootcert doit être défini.
    • verify-full : Autoriser uniquement les connexions SSL, vérifier le certificat du serveur par rapport à une CA de confiance, et vérifier que le nom d'hôte du serveur correspond au nom commun (CN) ou au nom alternatif du sujet (SAN) du certificat.

Vérification du certificat du serveur (verify-ca ou verify-full) :

Pour une sécurité renforcée, les clients doivent vérifier l'identité du serveur. Cela nécessite que le client fasse confiance à la CA qui a signé le certificat du serveur.

  1. Obtenir le certificat de la CA : Procurez-vous le fichier root.crt (ou le certificat CA approprié) qui a été utilisé pour signer le certificat du serveur.
  2. Spécifier sslrootcert : Indiquez au client où trouver ce certificat de la CA.
psql "sslmode=verify-full host=your_server_hostname dbname=your_db user=your_user sslrootcert=/path/to/your/root.crt"

2. Certificats clients (authentification mutuelle)

Pour un niveau de sécurité encore plus élevé, vous pouvez implémenter l'authentification mutuelle, où le serveur vérifie également l'identité du client à l'aide de certificats clients.

Génération des certificats clients :

Similaire aux certificats de serveur, vous aurez besoin d'une clé privée client et d'un certificat client signé par une CA approuvée par le serveur (souvent la même CA que le certificat du serveur).

  1. Générer la clé privée du client :
    bash openssl genrsa -des3 -out client.key 2048

  2. Créer le CSR du client :
    bash openssl req -new -key client.key -out client.csr
    Fournissez les détails, en vous assurant que le nom commun est unique pour le client.

  3. Signer le CSR du client avec la CA :
    bash sudo openssl x509 -req -days 365 -in client.csr -CA root.crt -CAkey root.key -set_serial <unique_serial> -out client.crt

  4. Définir les permissions :
    bash chmod 600 client.key chmod 644 client.crt

Configuration de pg_hba.conf pour l'authentification par certificat client :

Sur le serveur, vous devez configurer pg_hba.conf pour accepter l'authentification par certificat client. Cela utilise souvent la méthode d'authentification cert.

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# Exiger SSL et l'authentification par certificat client pour un utilisateur/db spécifique
hostssl all             your_user       your_client_ip/32       cert map=your_cert_map

Vous pourriez également avoir besoin de définir un fichier de mappage de certificats (option cert_map) si vous souhaitez mapper des détails spécifiques du certificat client (comme Subject ou SubjectAltName) aux utilisateurs PostgreSQL. Consultez la documentation PostgreSQL pour la configuration détaillée de l'authentification cert et du mappage des certificats.

Configuration du client pour utiliser les certificats :

Mettez à jour la chaîne de connexion du client pour inclure les chemins vers son certificat et sa clé :

psql "sslmode=verify-full host=your_server_hostname dbname=your_db user=your_user \nsslrootcert=/path/to/your/root.crt sslcert=/path/to/your/client.crt sslkey=/path/to/your/client.key"

Bonnes pratiques et conseils

  • Utilisez sslmode verify-full : Visez toujours à utiliser verify-full côté client pour prévenir les attaques de l'homme du milieu.
  • Protégez les clés privées : Assurez-vous que les clés privées (fichiers .key) ont des permissions de fichier strictes (par exemple, chmod 600) et ne sont lisibles que par l'utilisateur PostgreSQL sur le serveur et l'utilisateur connecté sur le client.
  • Renouvelez régulièrement les certificats : Les certificats ont des dates d'expiration. Implémentez un processus pour les renouveler avant leur expiration afin d'éviter les interruptions de connexion.
  • Gestion centralisée des certificats : Pour les déploiements plus importants, envisagez d'utiliser un système de gestion de certificats ou d'automatiser l'émission et le renouvellement des certificats.
  • Surveillez les journaux : Vérifiez les journaux PostgreSQL pour toute erreur liée à SSL lors du démarrage ou des tentatives de connexion.
  • Documentation : Référez-vous à la documentation officielle de PostgreSQL pour les paramètres les plus récents et les options de configuration avancées spécifiques à votre version de PostgreSQL.

Conclusion

La configuration de SSL/TLS pour les connexions PostgreSQL est une étape critique pour sécuriser votre infrastructure de base de données. En activant SSL sur le serveur, en appliquant ssl=require ou hostssl dans pg_hba.conf, et en configurant les clients avec les paramètres sslmode appropriés (idéalement verify-full), vous améliorez considérablement la sécurité des données transmises sur votre réseau. L'implémentation de l'authentification mutuelle avec des certificats clients ajoute une autre couche de sécurité robuste. Bien que la configuration initiale puisse sembler complexe, les avantages à long terme en matière de protection des données et de conformité en font une pratique indispensable pour tout déploiement PostgreSQL.