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 :
- 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.
- Accès aux fichiers de configuration PostgreSQL : Vous aurez besoin de privilèges administratifs pour modifier les fichiers
postgresql.confetpg_hba.conf. - 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 :
-
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 -
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. -
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 -
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. -
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
- Créer une clé privée et un certificat CA racine (si vous n'en avez pas) :
-
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ètresslrootcertdoit ê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.
- 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. - 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).
-
Générer la clé privée du client :
bash openssl genrsa -des3 -out client.key 2048 -
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. -
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 -
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
sslmodeverify-full: Visez toujours à utiliserverify-fullcô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.