Chiffrer vos données dans PostgreSQL avec
pgsodium
Workshop pgsodium
Dalibo & Contributors
Introduction
Présentation
Principes
Installation et configuration
Mise en œuvre
Sécurité
Pré-requis de cet atelier
instance PostgreSQL 13 ou supérieure
Redhat (ou dérivé) + dépôts PGDG
ou Redhat + outils classiques de compilation
ou Debian + outils classiques de compilation
Présentation libsodium
« pgsodium » car basé sur « libsodium »
lib de plus haut niveau par rapport à openssl
force à utiliser les bonnes pratiques cryptographiques
simplicité d’utilisation
performances
quelques références d’utilisateurs
Présentation pgsodium
créé en 2017 par Michel Pelletier
actuellement maintenu et développé au sein de Supabase
expose au niveau SQL de nombreuses fonctions de la libsodium
apporte la possibilité de gérer les clés coté serveur
propose une implémentation de TCE
Installation et configuration
installation par paquet
installation par les sources
utilisation dans une base
configuration du module
Installation par paquets
Debian : seule la libsodium est empaquetée, compilation
nécessaire
EL : paquets pgsodium_XX dans les dépôts PGDG seulement
compilation nécessaire sans les dépôts PGDG
Installation par les sources
nécessite libsodium ainsi que ses fichiers d’entête
sources de pgsodium disponibles sur github
make install
variable d’environnement PG_CONFIG
Vérifications
post-installation
Vérifier la bonne installation des éléments de pgsodium :
un module
une extension
Installation dans une base
de donnée
création de la base nacl
installation de l’extension dans la base
rapide découverte des fonctions de pgsodium
Configuration du module
le module pgsodium est optionnel
à positionner dans le paramètre
shared_preload_libraries
permet de créer des SECURITY LABEL utiles à TCE
permet de récupérer et conserver en mémoire la primary server
secret key
la mère de toutes les clés
un paramètre de configuration:
pgsodium.getkey_script
TCE
Présentation et utilisation de la fonctionnalité TCE de
pgsodium.
Présentation de la maquette
Une table utilisateur avec comme colonnes:
un identifiant
le nom
le téléphone
le numéro de carte de paiement chiffré
le cryptogramme visuel à 3 chiffres chiffré
la date d’expiration de la carte de paiement
Création des clés
la fonction pgsodium.create_key() crée une nouvelle
clé
appelée sans arguments, la clé est dérivée de la primary server
secret key
possibilité de préciser le type, des propriétés et/ou d’importer une
clé existante
pour notre atelier, on crée trois clés avec une date
d’expiration
Chiffrer le numéro de
carte de paiement
utilisation de SECURITY LABEL pour déclarer une colonne
chiffrée
SECURITY LABEL FOR pgsodium ON COLUMN ... IS ENCRYPT WITH ...
une seule clé pour toute la table…
… ou une clé par ligne
création automatique d’un trigger pour le
chiffrement à l’écriture
création automatique d’une vue pour le
déchiffrement à la lecture
Chiffrer le Cryptogramme
visuel
le cryptogramme visuel est composé de trois chiffres
peu de combinaisons possibles !
nécessite un nonce pour que deux mêmes cryptogrammes
soient chiffrés différemment
le nonce doit être lui-même de qualité
cryptographique
Gestion de la vue déchiffrée
l’event trigger sur les SECURITY LABEL crée aussi une
vue
permet de lire la donnée déchiffrée en conservant des requêtes
simples
le nom de la vue est configurable
Écriture et lecture des
données
chiffrement transparent à l’insertion des données
données chiffrées lisibles en table
données déchiffrées lisibles depuis la vue
vue peu performante pour les traitements en masse
Maintenances
gestion des droits
rotation des clés
Gestion des droits sur les
données
seul le propriétaire ou un super-utilisateur accèdent à une table ou
un vue
rôles spécifiques à pgsodium
SECURITY LABEL sur un rôle
Rotation des clés ?
peut être nécessaire dans le cadre de certains standards (p. ex. PCI
DSS?)
le besoin réel dépend de l’algorithme de chiffrement et de
l’utilisation
procédure d’exemple très exagérée:
création et utilisation d’une nouvelle clé tous les mois
chaque clé est considérée valide pendant 3 mois
re-chiffrement des données pour toute clé invalide
Rappels de sécurité
répond au besoin d’« encryption at rest »
ne protège pas d’un super-utilisateur malveillant
appliquer une gestion de rôle et de droit aussi fine que
possible
n’épargne pas le besoin de :
forcer le chiffrement des connexions
utiliser l’authentification SCRAM
mettre en œuvre une politique de sécurité robuste coté système
attention aux fichiers temporaires sur disque
Futur
projet encore jeune, un seul mainteneur
nécessite plus de tests automatisés
manque de relecture et de documentation
Dalibo débute sa participation au projet
accueil positif du PO
quelques correctifs et améliorations en cours
quelques nouvelles fonctionnalités ?
Conclusion
extension recommandée en remplacement de pgcrypto !
fonctionnalité TCE naissante, à découvrir
quelques aspérités à corriger
peut-être une source d’inspiration pour une implémentation
simplifiée
et par erreur pour la 12 aussi au moment où nous
rédigeons ce document.↩︎
A priori, l’utilisation de la fonction
sodium_malloc() empêche la clé de se retrouver en
swap, mais cela reste une bonne pratique de chiffrer
celui-ci.↩︎