Chiffrer vos données dans PostgreSQL avec pgsodium

Workshop pgsodium

Dalibo & Contributors

PostgreSQL et chiffrement

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

  1. et par erreur pour la 12 aussi au moment où nous rédigeons ce document.↩︎

  2. 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.↩︎

  3. voir à ce propos: https://libsodium.gitbook.io/doc/secret-key_cryptography/aead/aes-256-gcm↩︎