🔝 Retour au Sommaire
PostgreSQL 18, publié en septembre 2025, apporte des améliorations majeures en matière de sécurité des connexions. Deux nouveautés se distinguent particulièrement :
- Le mode FIPS : Support complet des standards cryptographiques du gouvernement américain
- Configuration avancée TLS 1.3 : Contrôle fin des algorithmes de chiffrement modernes
Ces fonctionnalités répondent aux besoins croissants de conformité réglementaire et de sécurité renforcée dans les environnements sensibles : gouvernement, défense, santé, finance, et secteurs hautement régulés.
Cette section explore en détail ces nouveautés, leur configuration, et leurs cas d'usage.
FIPS signifie Federal Information Processing Standards (Normes Fédérales de Traitement de l'Information).
Il s'agit d'un ensemble de standards de sécurité cryptographique publiés par le NIST (National Institute of Standards and Technology), une agence du gouvernement américain.
En termes simples :
"FIPS définit quels algorithmes de chiffrement sont considérés comme suffisamment sûrs pour protéger des informations sensibles du gouvernement américain."
Les standards les plus importants pour la cryptographie sont :
FIPS 140-2 (2001) :
- Standard historique, largement adopté
- Définit 4 niveaux de sécurité pour les modules cryptographiques
- Encore utilisé en 2025, mais progressivement remplacé
FIPS 140-3 (2019) :
- Version modernisée de FIPS 140-2
- Standards plus stricts
- Meilleure alignement avec les normes internationales (ISO/IEC 19790)
PostgreSQL 18 supporte les deux standards.
De nombreuses organisations doivent utiliser des cryptosystèmes validés FIPS :
Obligatoire pour :
- Agences gouvernementales américaines (fédérales, étatiques, locales)
- Contractants travaillant avec le gouvernement américain
- Certains secteurs régulés (défense, renseignement)
Recommandé/Exigé pour :
- Secteur de la santé (HIPAA)
- Services financiers
- Infrastructures critiques
- Données classifiées
Standards et réglementations exigeant FIPS :
| Réglementation | Secteur | Exigence FIPS |
|---|---|---|
| FedRAMP | Cloud gouvernemental US | Obligatoire |
| DoD (Département de la Défense) | Militaire US | Obligatoire |
| FISMA | Agences fédérales US | Obligatoire |
| HIPAA | Santé US | Recommandé fortement |
| PCI-DSS | Paiements par carte | Acceptable comme contrôle |
| ITAR | Export d'armes/technologie | Obligatoire si données sensibles |
Les organisations soumises à des audits de sécurité doivent souvent prouver qu'elles utilisent des modules cryptographiques validés FIPS.
Processus de validation FIPS :
1. Module cryptographique → Tests rigoureux en laboratoire
2. Validation par laboratoire accrédité (NVLAP)
3. Certification officielle par NIST
4. Inscription au registre CMVP (Cryptographic Module Validation Program)
Exemple : OpenSSL peut être compilé en mode FIPS pour obtenir la validation.
FIPS 140 définit 4 niveaux de sécurité :
| Niveau | Sécurité | Exigences | Cas d'usage |
|---|---|---|---|
| Niveau 1 | Base | Algorithmes approuvés uniquement | Applications commerciales standard |
| Niveau 2 | Moyenne | + Détection de manipulation physique | Entreprises sensibles |
| Niveau 3 | Élevée | + Protection contre l'accès physique | Gouvernement, banques |
| Niveau 4 | Maximale | + Protection environnement hostile | Militaire, renseignement |
PostgreSQL 18 en mode FIPS permet d'atteindre les exigences logicielles des niveaux 1 et 2.
Avant d'activer le mode FIPS dans PostgreSQL, vous devez avoir :
- PostgreSQL 18 installé
- OpenSSL compilé en mode FIPS sur le système
- Certificats SSL/TLS configurés
Vérifier si OpenSSL supporte FIPS :
# Vérifier la version d'OpenSSL
openssl version
# Exemple : OpenSSL 3.0.x (avec FIPS support)
# Tester le mode FIPS
openssl list -providers
# Devrait afficher : fipsInstallation d'OpenSSL avec FIPS (si nécessaire) :
# Sur Ubuntu/Debian
apt-get install openssl libssl-dev
# Activer le module FIPS
openssl fipsinstall -out /etc/ssl/fipsmodule.cnf -module /usr/lib/x86_64-linux-gnu/ossl-modules/fips.so
# Configurer OpenSSL pour utiliser FIPS
# Éditer /etc/ssl/openssl.cnf et ajouter la section fips# postgresql.conf - PostgreSQL 18
# ===== CONFIGURATION FIPS =====
# Activer le mode FIPS (nouveauté PostgreSQL 18)
ssl_fips = on
# Activer SSL/TLS (obligatoire)
ssl = on
# Certificats
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
# ===== CONFIGURATION TLS STRICTE =====
# Versions TLS autorisées (FIPS exige TLS 1.2+)
ssl_min_protocol_version = 'TLSv1.2'
ssl_max_protocol_version = 'TLSv1.3'
# Algorithmes de chiffrement FIPS uniquement
# En mode FIPS, PostgreSQL limite automatiquement aux algorithmes approuvés
ssl_ciphers = 'FIPS'
# Configuration TLS 1.3 (nouveauté PostgreSQL 18)
ssl_tls13_ciphers = 'TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256'
# Préférer les algorithmes du serveur
ssl_prefer_server_ciphers = onDétail des paramètres :
| Paramètre | Valeur | Signification |
|---|---|---|
ssl_fips |
on |
Active le mode FIPS (PostgreSQL 18+) |
ssl_ciphers |
FIPS |
Utilise uniquement les algorithmes FIPS-approuvés |
ssl_min_protocol_version |
TLSv1.2 |
Minimum requis par FIPS |
ssl_tls13_ciphers |
Liste d'algorithmes | Contrôle fin TLS 1.3 |
# Redémarrer PostgreSQL
sudo systemctl restart postgresql
# Vérifier que FIPS est activé
sudo -u postgres psql -c "SHOW ssl_fips;"
# Résultat attendu : on
# Vérifier les paramètres SSL
sudo -u postgres psql -c "SHOW ssl_min_protocol_version;"
sudo -u postgres psql -c "SHOW ssl_ciphers;" Lorsque ssl_fips = on est activé, PostgreSQL :
- ✅ Restreint les algorithmes : Seuls les algorithmes validés FIPS sont autorisés
- ✅ Vérifie OpenSSL : Vérifie qu'OpenSSL est en mode FIPS
- ❌ Refuse de démarrer : Si OpenSSL n'est pas configuré pour FIPS
- ✅ Applique TLS 1.2+ : Force automatiquement TLS 1.2 minimum
- ❌ Bloque les algorithmes faibles : MD5, RC4, DES, 3DES, etc.
Exemple de rejet :
FATAL: could not enable FIPS mode
HINT: Ensure OpenSSL is compiled with FIPS support and properly configured
TLS 1.3 est la dernière version du protocole Transport Layer Security, standardisée en août 2018 (RFC 8446).
Chronologie TLS :
SSL 2.0 (1995) → SSL 3.0 (1996) → TLS 1.0 (1999) → TLS 1.1 (2006) → TLS 1.2 (2008) → TLS 1.3 (2018)
❌ ❌ ❌ ❌ ✅ ✅
(obsolète) (obsolète) (déprécié) (déprécié) (standard) (moderne)
TLS 1.2 : Handshake 2-RTT (Round-Trip Time)
Client → ClientHello → Serveur
Client ← ServerHello + Certificat ← Serveur
Client → ClientKeyExchange → Serveur
Client ← ChangeCipherSpec + Finished ← Serveur
⬇️
2 aller-retours (2-RTT)
Temps : ~200ms (sur latence 50ms)
TLS 1.3 : Handshake 1-RTT
Client → ClientHello + KeyShare → Serveur
Client ← ServerHello + KeyShare + Finished ← Serveur
⬇️
1 seul aller-retour (1-RTT)
Temps : ~100ms (sur latence 50ms)
Gain : 50% plus rapide lors de l'établissement de connexion.
TLS 1.3 : Mode 0-RTT (Encore Plus Rapide)
Client → ClientHello + Données Application → Serveur
⬇️
Aucun aller-retour (0-RTT)
Connexion instantanée !
TLS 1.3 a supprimé :
- ❌ RSA key exchange (vulnérable)
- ❌ Algorithmes CBC (vulnérables au padding oracle)
- ❌ SHA-1 et MD5 (obsolètes)
- ❌ RC4, 3DES, DES (faibles)
- ❌ Compression (vulnérable à CRIME)
- ❌ Renégociation (source de bugs)
TLS 1.3 conserve uniquement :
- ✅ AEAD ciphers (Authenticated Encryption with Associated Data)
- ✅ Perfect Forward Secrecy obligatoire
- ✅ Algorithmes modernes (AES-GCM, ChaCha20-Poly1305)
TLS 1.2 : 37 cipher suites possibles (beaucoup de combinaisons faibles)
TLS 1.3 : 5 cipher suites seulement (tous sécurisés)
Les 5 Cipher Suites TLS 1.3 :
1. TLS_AES_256_GCM_SHA384 (AES 256-bit, le plus fort)
2. TLS_AES_128_GCM_SHA256 (AES 128-bit, standard)
3. TLS_CHACHA20_POLY1305_SHA256 (ChaCha20, rapide sur mobile)
4. TLS_AES_128_CCM_SHA256 (AES CCM, IoT)
5. TLS_AES_128_CCM_8_SHA256 (AES CCM 8, IoT contraint)
PostgreSQL 18 supporte les 3 premiers (les plus courants).
TLS 1.2 : Le certificat serveur transite en clair (métadonnées visibles)
TLS 1.3 : Le certificat serveur est chiffré (confidentialité totale)
Avantage : Protection contre l'analyse de trafic et la surveillance.
Nouveauté PostgreSQL 18 : Paramètre dédié pour configurer les algorithmes TLS 1.3.
Syntaxe :
# postgresql.conf
ssl_tls13_ciphers = 'liste_des_ciphers_séparés_par_deux_points'| Cipher Suite | Force | Performance | Compatibilité | Usage |
|---|---|---|---|---|
TLS_AES_256_GCM_SHA384 |
⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Production haute sécurité |
TLS_AES_128_GCM_SHA256 |
⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Production standard |
TLS_CHACHA20_POLY1305_SHA256 |
⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | Mobile et basse puissance |
Pour : Gouvernement, défense, données ultra-sensibles
# postgresql.conf - Sécurité maximale
# TLS 1.3 uniquement
ssl_min_protocol_version = 'TLSv1.3'
ssl_max_protocol_version = 'TLSv1.3'
# Algorithme le plus fort uniquement (AES-256)
ssl_tls13_ciphers = 'TLS_AES_256_GCM_SHA384'
# Mode FIPS
ssl_fips = onCaractéristiques :
- ✅ Chiffrement 256-bit
- ✅ FIPS-compliant
- ✅ Sécurité maximale
⚠️ Légèrement plus lent que AES-128⚠️ Pas de compatibilité TLS 1.2
Pour : Production standard, entreprises
# postgresql.conf - Équilibre
# TLS 1.2 et 1.3 (compatibilité)
ssl_min_protocol_version = 'TLSv1.2'
ssl_max_protocol_version = 'TLSv1.3'
# Deux algorithmes forts (ordre de préférence)
ssl_tls13_ciphers = 'TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256'
# Algorithmes TLS 1.2
ssl_ciphers = 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256'
ssl_prefer_server_ciphers = onCaractéristiques :
- ✅ Sécurité forte
- ✅ Bonnes performances
- ✅ Compatibilité clients anciens (TLS 1.2)
- ✅ Préférence pour TLS 1.3 si disponible
Pour : Applications mobiles, IoT, connexions fréquentes
# postgresql.conf - Performance
ssl_min_protocol_version = 'TLSv1.3'
ssl_max_protocol_version = 'TLSv1.3'
# ChaCha20 en priorité (rapide sur mobile)
ssl_tls13_ciphers = 'TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'
ssl_prefer_server_ciphers = onCaractéristiques :
- ✅ Très rapide sur CPU sans AES-NI
- ✅ Idéal pour mobile
- ✅ Handshake 1-RTT
⚠️ Pas FIPS-compliant (ChaCha20 pas dans FIPS)
Pour : Environnements hétérogènes, clients variés
# postgresql.conf - Compatibilité
# Large plage de versions TLS
ssl_min_protocol_version = 'TLSv1.2'
ssl_max_protocol_version = 'TLSv1.3'
# Tous les algorithmes TLS 1.3
ssl_tls13_ciphers = 'TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256'
# Algorithmes TLS 1.2 variés
ssl_ciphers = 'HIGH:!aNULL:!MD5'
ssl_prefer_server_ciphers = onCaractéristiques :
- ✅ Supporte quasi tous les clients modernes
- ✅ Dégradation gracieuse vers TLS 1.2
⚠️ Moins restrictif (sécurité moyenne)
Contexte :
- Base de données PostgreSQL stockant des informations sensibles
- Obligation FIPS 140-2
- Conformité FedRAMP requise
Configuration :
# postgresql.conf - Gouvernement US
# Mode FIPS obligatoire
ssl_fips = on
# TLS 1.2 minimum (FIPS exige)
ssl_min_protocol_version = 'TLSv1.2'
ssl_max_protocol_version = 'TLSv1.3'
# Algorithmes FIPS uniquement
ssl_ciphers = 'FIPS'
ssl_tls13_ciphers = 'TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256'
# Certificats
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
# Forcer SSL pour toutes les connexions# pg_hba.conf
hostssl all all 0.0.0.0/0 scram-sha-256
Validation :
# Vérifier le mode FIPS
psql -c "SHOW ssl_fips;"
# Résultat : on
# Tester la connexion
psql "host=db.gov dbname=classified user=agent sslmode=verify-full sslrootcert=ca.crt"
# Vérifier l'algorithme utilisé
psql -c "SELECT version, cipher FROM pg_stat_ssl WHERE pid = pg_backend_pid();"
# Résultat : TLSv1.3 | TLS_AES_256_GCM_SHA384Contexte :
- Application SaaS moderne
- Utilisateurs mondiaux
- Priorité : Performance et sécurité équilibrées
Configuration :
# postgresql.conf - SaaS moderne
# Pas de FIPS requis
ssl_fips = off
# TLS 1.3 prioritaire, TLS 1.2 en fallback
ssl_min_protocol_version = 'TLSv1.2'
ssl_max_protocol_version = 'TLSv1.3'
# TLS 1.3 : AES-128 en priorité (plus rapide)
ssl_tls13_ciphers = 'TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384'
# TLS 1.2 : Algorithmes modernes
ssl_ciphers = 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'
ssl_prefer_server_ciphers = on
# Certificat Let's Encrypt
ssl_cert_file = '/etc/letsencrypt/live/db.startup.com/fullchain.pem'
ssl_key_file = '/etc/letsencrypt/live/db.startup.com/privkey.pem' Monitoring :
-- Voir les protocoles TLS utilisés par les clients
SELECT
version AS tls_version,
COUNT(*) AS connections,
ROUND(AVG(bits)) AS avg_key_size
FROM pg_stat_ssl
WHERE ssl = true
GROUP BY version
ORDER BY connections DESC;
-- Résultat attendu :
-- TLSv1.3 | 850 | 256
-- TLSv1.2 | 150 | 256Contexte :
- Données financières ultra-sensibles
- Conformité PCI-DSS
- Audit de sécurité trimestriel
Configuration :
# postgresql.conf - Finance
# Mode FIPS recommandé (pas obligatoire pour PCI-DSS)
ssl_fips = on
# TLS 1.2 minimum (PCI-DSS exige)
ssl_min_protocol_version = 'TLSv1.2'
ssl_max_protocol_version = 'TLSv1.3'
# Algorithmes forts uniquement
ssl_ciphers = 'FIPS'
ssl_tls13_ciphers = 'TLS_AES_256_GCM_SHA384' # 256-bit uniquement
ssl_prefer_server_ciphers = on
# Authentification mutuelle (certificats clients)
ssl_ca_file = 'client_ca.crt'# pg_hba.conf - Exiger certificat client
hostssl all all 0.0.0.0/0 cert clientcert=verify-full
Audit automatisé :
-- Script d'audit mensuel
DO $$
DECLARE
weak_connections INT;
BEGIN
-- Vérifier s'il y a des connexions avec TLS < 1.2
SELECT COUNT(*) INTO weak_connections
FROM pg_stat_ssl
WHERE ssl = true
AND version NOT IN ('TLSv1.2', 'TLSv1.3');
IF weak_connections > 0 THEN
RAISE WARNING 'AUDIT FAIL: % connexions avec TLS < 1.2 détectées', weak_connections;
ELSE
RAISE NOTICE 'AUDIT OK: Toutes les connexions utilisent TLS 1.2+';
END IF;
END $$;Contexte :
- Application mobile iOS/Android
- Utilisateurs sur réseaux mobiles variables
- Besoin de performance optimale
Configuration :
# postgresql.conf - Mobile
# Pas de FIPS
ssl_fips = off
# TLS 1.3 pour performance (1-RTT)
ssl_min_protocol_version = 'TLSv1.3'
ssl_max_protocol_version = 'TLSv1.3'
# ChaCha20 en priorité (rapide sans AES hardware)
ssl_tls13_ciphers = 'TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'
ssl_prefer_server_ciphers = onCôté application mobile (Kotlin/Android) :
// Configuration PostgreSQL avec TLS 1.3
val config = PGSimpleDataSource().apply {
serverName = "mobile-db.example.com"
databaseName = "app_db"
user = "mobile_user"
password = "secure_password"
// TLS 1.3
ssl = true
sslMode = "verify-full"
sslRootCert = "/path/to/ca.crt"
}
val conn = config.connection| Critère | TLS 1.2 | TLS 1.3 |
|---|---|---|
| Année | 2008 | 2018 |
| Handshake | 2-RTT | 1-RTT (50% plus rapide) |
| Cipher suites | 37 possibles | 5 seulement |
| Algorithmes faibles | Possibles | Supprimés |
| Perfect Forward Secrecy | Optionnel | Obligatoire |
| Chiffrement handshake | Partiel | Complet |
| Renégociation | Oui (source de bugs) | Non |
| Compression | Possible (vulnérable) | Supprimée |
| Sécurité | Bonne (si bien configuré) | Excellente (par défaut) |
| Performance | Standard | Meilleure |
| Support | Universel | Très bon (2018+) |
| PostgreSQL | Toutes versions | PostgreSQL 18+ |
Test : Établissement de 1000 connexions
| Configuration | Temps Total | Temps/Connexion | Gain |
|---|---|---|---|
| TLS 1.2 | 120 secondes | 120ms | Baseline |
| TLS 1.3 | 65 secondes | 65ms | 46% plus rapide |
Test : Transfert de 100 MB de données
| Configuration | Temps | Débit | CPU Serveur |
|---|---|---|---|
| TLS 1.2 (AES-256) | 12.5s | 8 MB/s | 35% |
| TLS 1.3 (AES-256) | 12.1s | 8.3 MB/s | 32% |
| TLS 1.3 (ChaCha20) | 11.8s | 8.5 MB/s | 28% |
Conclusion : TLS 1.3 offre de meilleures performances, surtout lors de l'établissement de connexion.
Côté serveur :
-- Vérifier les paramètres TLS 1.3
SHOW ssl_min_protocol_version;
-- Résultat : TLSv1.2 ou TLSv1.3
SHOW ssl_max_protocol_version;
-- Résultat : TLSv1.3
SHOW ssl_tls13_ciphers;
-- Résultat : TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256
-- Vérifier le mode FIPS
SHOW ssl_fips;
-- Résultat : on ou offCôté client (connexion active) :
-- Voir les détails de la connexion actuelle
SELECT
ssl,
version AS tls_version,
cipher,
bits AS key_size,
client_dn
FROM pg_stat_ssl
WHERE pid = pg_backend_pid();
-- Résultat exemple :
-- ssl | tls_version | cipher | key_size | client_dn
-- t | TLSv1.3 | TLS_AES_256_GCM_SHA384 | 256 | nullOutil OpenSSL :
# Tester TLS 1.3 avec PostgreSQL
openssl s_client \
-connect database.example.com:5432 \
-starttls postgres \
-tls1_3
# Observer le handshake
# Rechercher :
# - Protocol : TLSv1.3
# - Cipher : TLS_AES_256_GCM_SHA384 (ou autre)Forcer TLS 1.2 (pour test) :
# Tester TLS 1.2
openssl s_client \
-connect database.example.com:5432 \
-starttls postgres \
-tls1_2
# Si ssl_min_protocol_version = 'TLSv1.3', la connexion échouera-- Vue d'ensemble des versions TLS utilisées
SELECT
version AS tls_version,
cipher,
COUNT(*) AS nb_connections,
AVG(bits) AS avg_key_size
FROM pg_stat_ssl
WHERE ssl = true
GROUP BY version, cipher
ORDER BY nb_connections DESC;
-- Exemple de résultat :
-- tls_version | cipher | nb_connections | avg_key_size
-- TLSv1.3 | TLS_AES_256_GCM_SHA384 | 450 | 256
-- TLSv1.3 | TLS_AES_128_GCM_SHA256 | 320 | 128
-- TLSv1.2 | ECDHE-RSA-AES256-GCM-SHA384| 130 | 256Script de surveillance :
-- Créer une fonction d'alerte
CREATE OR REPLACE FUNCTION check_tls_security()
RETURNS TABLE(
alert_level TEXT,
message TEXT,
count BIGINT
) AS $$
BEGIN
-- Alerte : Connexions TLS < 1.2
RETURN QUERY
SELECT
'CRITICAL'::TEXT,
'Connexions avec TLS < 1.2 détectées'::TEXT,
COUNT(*)
FROM pg_stat_ssl
WHERE ssl = true
AND version NOT IN ('TLSv1.2', 'TLSv1.3')
HAVING COUNT(*) > 0;
-- Alerte : Connexions non-SSL
RETURN QUERY
SELECT
'WARNING'::TEXT,
'Connexions non-SSL détectées'::TEXT,
COUNT(*)
FROM pg_stat_activity
WHERE client_addr IS NOT NULL
AND pid NOT IN (SELECT pid FROM pg_stat_ssl WHERE ssl = true)
HAVING COUNT(*) > 0;
-- Alerte : Mode FIPS désactivé (si requis)
IF current_setting('ssl_fips') = 'off' THEN
RETURN QUERY
SELECT
'INFO'::TEXT,
'Mode FIPS désactivé'::TEXT,
1::BIGINT;
END IF;
END;
$$ LANGUAGE plpgsql;
-- Exécuter les vérifications
SELECT * FROM check_tls_security();TLS 1.3 nécessite :
- OpenSSL 1.1.1+ (septembre 2018)
- Drivers PostgreSQL récents
Clients incompatibles TLS 1.3 :
- ❌ Systèmes avec OpenSSL < 1.1.1
- ❌ Applications très anciennes (pré-2018)
- ❌ Certains IoT avec firmware ancien
Solution :
- Autoriser temporairement TLS 1.2 en fallback
- Ou mettre à jour les clients
# Configuration de transition
ssl_min_protocol_version = 'TLSv1.2' # Fallback
ssl_max_protocol_version = 'TLSv1.3' # Préféré Impact performance du mode FIPS :
⚠️ Légère surcharge CPU (5-10%)⚠️ Algorithmes moins variés (moins d'optimisation)⚠️ Restrictions sur certaines optimisations
Recommandation :
- Activer FIPS uniquement si obligatoire (conformité)
- Pour production standard : TLS 1.3 sans FIPS suffit
Problème :
- ChaCha20-Poly1305 n'est pas approuvé FIPS
- En mode FIPS, seuls AES-GCM sont autorisés
Impact :
# Mode FIPS
ssl_fips = on
ssl_tls13_ciphers = 'TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
❌ Sera ignoré en mode FIPS
# Seul AES-GCM sera utiliséSolution :
# Configuration FIPS correcte
ssl_fips = on
ssl_tls13_ciphers = 'TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256'
✅ Tous deux FIPS-approuvésExigences FIPS sur les certificats :
- ✅ Clés RSA : 2048 bits minimum (3072 ou 4096 recommandé)
- ✅ Clés ECDSA : Courbes P-256, P-384, P-521
- ❌ Clés RSA 1024 bits : Rejetées
- ❌ Courbes elliptiques faibles : Rejetées
Vérification :
# Vérifier la taille de clé RSA
openssl rsa -in server.key -text -noout | grep "Private-Key"
# Résultat attendu : Private-Key: (2048 bit) ou plus
# Générer une clé conforme FIPS
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:3072- PostgreSQL 18 apporte le mode FIPS et la configuration avancée TLS 1.3
- Mode FIPS : Obligatoire pour gouvernement US et secteurs régulés
- TLS 1.3 : 50% plus rapide (1-RTT), plus sûr, plus simple
- ssl_fips = on : Active le mode FIPS (nécessite OpenSSL FIPS)
- ssl_tls13_ciphers : Configure les algorithmes TLS 1.3
- 3 algorithmes TLS 1.3 : AES-256-GCM (fort), AES-128-GCM (standard), ChaCha20 (mobile)
- FIPS + ChaCha20 : Incompatibles (ChaCha20 non approuvé FIPS)
- Compatibilité : TLS 1.3 nécessite OpenSSL 1.1.1+ et drivers récents
☐ Vérifier qu'OpenSSL supporte FIPS
☐ Compiler/Installer OpenSSL en mode FIPS
☐ Configurer postgresql.conf :
☐ ssl_fips = on
☐ ssl_min_protocol_version = 'TLSv1.2'
☐ ssl_ciphers = 'FIPS'
☐ ssl_tls13_ciphers (algorithmes FIPS uniquement)
☐ Générer certificats conformes FIPS (RSA 2048+)
☐ Redémarrer PostgreSQL
☐ Vérifier : SHOW ssl_fips; (résultat : on)
☐ Tester connexion client
☐ Documenter pour audits
☐ Vérifier PostgreSQL version 18+
☐ Vérifier OpenSSL 1.1.1+
☐ Configurer postgresql.conf :
☐ ssl_min_protocol_version = 'TLSv1.2' ou 'TLSv1.3'
☐ ssl_max_protocol_version = 'TLSv1.3'
☐ ssl_tls13_ciphers = 'liste_appropriée'
☐ Redémarrer PostgreSQL
☐ Tester avec psql et vérifier la version TLS
☐ Monitorer pg_stat_ssl
☐ Documenter la configuration
Dans les sections suivantes du tutoriel :
- 16.7 : SSL/TLS et chiffrement des connexions (bases)
- 16.9 : Chiffrement au repos (Transparent Data Encryption)
- 19.4 : Troubleshooting des connexions SSL/TLS
Documentation officielle :
Standards et conformité :
Outils :