Heap dump et RGPD : un fichier .hprof contient des données personnelles, traitez-le comme tel
Quand une application Java manque de mémoire, le premier réflexe est de demander un heap dump. C'est le bon réflexe technique. Mais ce fichier est une photographie de la mémoire de l'application à un instant donné : si elle traite des usagers, des clients ou des patients, leurs données sont dedans, en clair. En France, cela fait du heap dump un objet soumis au RGPD, avec des conséquences très pratiques sur la façon de le produire, de le transmettre et de l'effacer.
Ce que contient réellement un fichier .hprof
Le format HPROF enregistre chaque objet vivant du tas : sa classe, ses champs et leurs valeurs. Les chaînes de caractères y figurent en entier, les tableaux d'octets aussi. Dans une application de gestion ordinaire, on y retrouve typiquement :
- les entités chargées depuis la base : noms, adresses, numéros de téléphone, numéros de dossier, parfois le NIR ;
- le contenu des sessions HTTP et des caches applicatifs ;
- les corps de requêtes et de réponses en cours de traitement, y compris des pièces jointes ;
- des secrets techniques : jetons d'accès, clés d'API, mots de passe de connexion à la base lus dans la configuration.
Un outil comme Eclipse MAT permet d'interroger tout cela en quelques clics, et une simple commande strings sur le fichier suffit souvent à faire apparaître des adresses électroniques. Notre guide en anglais sur l'analyse d'un heap dump détaille la partie technique ; cet article traite de ce que la loi en fait.
Ce que dit le RGPD
Le règlement définit les données à caractère personnel comme « toute information se rapportant à une personne physique identifiée ou identifiable » (article 4). Un heap dump qui contient ne serait-ce qu'un identifiant client entre dans cette définition. Trois conséquences en découlent.
- Limitation de la conservation (article 5, 1, e) : les données ne doivent pas être conservées sous une forme identifiante plus longtemps que nécessaire au regard de la finalité. Un dump produit pour diagnostiquer une fuite de mémoire n'a plus de raison d'exister une fois la fuite comprise.
- Sécurité du traitement (article 32) : le responsable de traitement doit mettre en œuvre des mesures techniques et organisationnelles adaptées au risque. Un fichier de plusieurs gigaoctets contenant des milliers de fiches, laissé dans
/tmpsur un serveur partagé, ne répond pas à cette exigence. - Violation de données (article 33) : si un dump fuit (envoyé au mauvais destinataire, déposé sur un partage public, joint à un ticket chez un éditeur sans contrat), il s'agit d'une violation de données. Elle doit être notifiée à la CNIL « dans les meilleurs délais et, si possible, 72 heures au plus tard après en avoir pris connaissance », sauf si elle n'est pas susceptible d'engendrer un risque pour les personnes.
Le texte consolidé est disponible sur le site de la CNIL.
Journaux GC et thread dumps : moins sensibles, pas neutres
Les journaux du ramasse-miettes (-Xlog:gc*) ne contiennent que des tailles, des durées et des noms de régions : ils ne posent en général aucun problème. Les thread dumps contiennent des noms de threads et des piles d'appels, parfois des noms de méthodes métier ; ils peuvent révéler un identifiant si l'application nomme ses threads d'après la requête traitée. Les enregistrements JDK Flight Recorder se situent entre les deux : selon la configuration, ils peuvent capturer des valeurs de propriétés système, des arguments de ligne de commande ou des chemins de fichiers. Relisez ce qu'ils contiennent avant de les envoyer hors de l'équipe.
La CNIL a précisé, dans sa recommandation sur la journalisation (délibération n° 2021-122 du 14 octobre 2021), qu'elle recommande de manière générale de conserver les traces d'accès des utilisateurs habilités pendant une durée comprise entre six mois et un an. Ce texte vise les journaux d'accès aux systèmes, pas les dumps mémoire ; il donne toutefois un ordre de grandeur utile : un fichier de diagnostic, lui, se compte en jours ou en semaines.
Une procédure en six points
1. Décider avant l'incident
L'option -XX:+HeapDumpOnOutOfMemoryError est désactivée par défaut. Si vous l'activez, et c'est souvent utile, fixez aussi -XX:HeapDumpPath vers un répertoire dédié, sur un volume chiffré, accessible aux seuls administrateurs de l'application. Inscrivez ce choix au registre des traitements ou dans la documentation de sécurité du service : c'est un traitement de données qui découle du traitement principal.
java -XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/diag/monappli/ \
-XX:HeapDumpGzipLevel=1 \
-jar monappli.jar
HeapDumpGzipLevel (0 par défaut, donc sans compression) réduit la taille du fichier, mais pas sa sensibilité : un fichier compressé n'est pas chiffré.
2. Produire à la demande, avec une trace
Pour un dump manuel, jcmd <pid> GC.heap_dump -gz=1 /var/diag/monappli/dump.hprof.gz écrit un fichier compressé. Notez dans le ticket d'incident qui l'a demandé, pourquoi, et où il se trouve. Un dump sans propriétaire est un dump que personne ne supprimera.
3. Analyser sur place si possible
L'analyse peut souvent se faire sur une machine de l'équipe d'exploitation, dans le même périmètre de sécurité que la production. Eclipse MAT peut produire des rapports (« leak suspects », histogramme des classes) qui ne contiennent que des noms de classes et des tailles : ce sont ces rapports qu'il faut partager, pas le fichier brut.
4. Transmettre le moins possible
Si un éditeur ou un prestataire demande le dump, vérifiez d'abord que le contrat prévoit ce cas : le prestataire agit alors comme sous-traitant au sens du RGPD. Transmettez par un canal chiffré, jamais en pièce jointe d'un ticket public ni sur un service de partage de fichiers grand public. Si un histogramme (jcmd <pid> GC.class_histogram) suffit au diagnostic, il ne contient aucune donnée métier.
5. Reproduire avec des données fictives
Une fuite de mémoire se reproduit généralement en recette, avec un jeu de données anonymisé ou synthétique. Un dump produit dans ces conditions peut circuler librement. C'est la meilleure option dès que le problème est reproductible.
6. Supprimer et le noter
Fixez une durée de vie : par exemple, suppression à la clôture de l'incident, et purge automatique du répertoire de diagnostic au-delà de quelques jours. Supprimez aussi les copies sur les postes des analystes. Une tâche planifiée qui efface les fichiers *.hprof* anciens évite qu'un dump oublié devienne, deux ans plus tard, une violation de données.
Conteneurs et Kubernetes
Dans un conteneur, HeapDumpPath pointe souvent vers un volume persistant pour que le fichier survive au redémarrage provoqué par l'erreur. Ce volume devient alors un stockage de données personnelles : chiffrement, droits d'accès restreints et purge s'appliquent. À l'inverse, un dump écrit dans le système de fichiers éphémère du conteneur disparaît au redémarrage, ce qui protège les données mais prive aussi du diagnostic. Le compromis le plus courant est un volume dédié, monté uniquement sur les pods concernés, avec une politique de rétention courte. Le dimensionnement mémoire lui-même est traité dans notre guide JVM in containers.
À retenir. Un heap dump est une copie des données que l'application traite. Produisez-le dans un lieu protégé, partagez des rapports plutôt que le fichier, reproduisez avec des données fictives quand c'est possible, et supprimez-le dès que le diagnostic est posé. Pour d'autres réglages propres à la production en France, voir aussi notre article sur les fuseaux horaires et le changement d'heure dans la JVM.
Sources
- Règlement (UE) 2016/679 (RGPD), articles 4, 5, 32 et 33, texte publié par la CNIL
- CNIL, délibération n° 2021-122 du 14 octobre 2021 portant adoption d'une recommandation relative à la journalisation
- Documentation des commandes
javaetjcmd(JDK 21) pourHeapDumpOnOutOfMemoryError,HeapDumpPath,HeapDumpGzipLeveletGC.heap_dump