TP – Purger des données, pseudonymiser et notifier une violation
BTS SIO SISR 1re année – Bloc 3 – S08
Note
But. Situation : Combien de temps garder les données, comment les protéger, à qui les confier, et que faire quand elles fuient ?
Comment ce TP fonctionne. Avant de manipuler, tu écris ce que tu anticipes (« J'anticipe »). Puis tu testes et tu notes ce que tu constates. Tu comprends ce que fait chaque commande (« Je comprends »). Un bilan de compétences clôt la séance. Les manipulations se font sur des machines virtuelles de laboratoire, isolées du réseau de l'établissement. Les identifiants communs d'un TP sont des identifiants de laboratoire : ils ne se réutilisent jamais ailleurs.
Objectif
Mettre en œuvre une purge automatique sur une base de données et sur des journaux, constater qu'un hachage simple ne rend pas une donnée anonyme, puis qualifier une violation de données et préparer sa notification à la CNIL.
Contraintes
- Binôme, durée : 3 h 20.
- Travaille dans la VM Debian de laboratoire. Toutes les données sont inventées.
- Ne lance jamais une purge sans avoir d'abord compté ce qu'elle va supprimer.
Partie A. Purger une base et des journaux (60 min)
A1. Purge d'une table de prospects
Règle de conservation retenue par l'entreprise (fictive) CycloShop : un prospect sans interaction depuis plus de 3 ans est supprimé.
sudo apt install -y sqlite3
mkdir -p ~/purge && cd ~/purge
sqlite3 prospects.db <<'SQL'
CREATE TABLE prospects(id INTEGER PRIMARY KEY, nom TEXT, email TEXT, derniere_interaction TEXT);
INSERT INTO prospects(nom,email,derniere_interaction) VALUES
('Aubert','aubert@example.com',date('now','-5 years')),
('Blanc','blanc@example.org',date('now','-4 years')),
('Carré','carre@example.net',date('now','-3 years','-1 day')),
('Daret','daret@example.com',date('now','-2 years')),
('Éon','eon@example.org',date('now','-1 year')),
('Faure','faure@example.net',date('now','-10 days'));
SQL
J'anticipe. Combien de prospects la règle va-t-elle supprimer ? ______________________
Éléments de réponse
Trois : Aubert (5 ans), Blanc (4 ans) et Carré (3 ans et un jour). Daret (2 ans), Éon (1 an) et Faure (10 jours) sont conservés.
Compte d'abord, puis supprime et trace :
sqlite3 prospects.db "SELECT COUNT(*) FROM prospects WHERE derniere_interaction < date('now','-3 years');"
sqlite3 prospects.db "SELECT nom, derniere_interaction FROM prospects WHERE derniere_interaction < date('now','-3 years');"
Enregistre ensuite le script purge-prospects.sh :
#!/bin/bash
BASE=~/purge/prospects.db
LOG=~/purge/purge.log
N=$(sqlite3 "$BASE" "SELECT COUNT(*) FROM prospects WHERE derniere_interaction < date('now','-3 years');")
sqlite3 "$BASE" "DELETE FROM prospects WHERE derniere_interaction < date('now','-3 years');"
echo "$(date '+%F %T') purge prospects : $N ligne(s) supprimée(s)" >> "$LOG"
chmod 750 ~/purge/purge-prospects.sh
~/purge/purge-prospects.sh
cat ~/purge/purge.log
sqlite3 -header -column ~/purge/prospects.db "SELECT * FROM prospects;"
Je comprends.
| Élément | Rôle |
|---|---|
date('now','-3 years') |
Date d'il y a trois ans, calculée par SQLite |
WHERE derniere_interaction < … |
Sélectionne les lignes plus anciennes que le seuil |
N=$(…) |
Range le nombre de lignes dans une variable avant la suppression |
>> "$LOG" |
Ajoute une ligne à la trace (date, nombre) : jamais le contenu supprimé |
chmod 750 |
Propriétaire : tout ; groupe : lecture et exécution ; autres : rien |
Planifie l'exécution chaque nuit à 2 h avec cron :
crontab -e
# ajoute la ligne suivante, enregistre, puis vérifie :
0 2 * * * /home/etudiant/purge/purge-prospects.sh
crontab -l
Note
Remplace /home/etudiant par ton dossier personnel (echo $HOME). Les cinq champs de cron sont : minute, heure, jour du mois, mois, jour de la semaine. 0 2 * * * signifie « à 2 h 00, tous les jours ».
Questions.
- Pourquoi compte-t-on avant de supprimer ? ______________________
- Pourquoi la trace ne contient-elle pas les noms des prospects supprimés ? ______________________
- Cette purge supprime les données de la base. Où peuvent-elles encore se trouver ? ______________________
- Quel paramètre faudrait-il changer si la règle passait à 2 ans ? ______________________
A2. Purge de journaux
Crée des journaux d'âges différents (la commande touch -d fixe la date de modification) :
mkdir -p ~/purge/logs && cd ~/purge/logs
for i in 1 2 3 4; do echo "10.0.0.$i GET /index.html" > acces-$i.log; done
touch -d '400 days ago' acces-1.log acces-2.log
touch -d '200 days ago' acces-3.log
ls -l --time-style=long-iso
Cherche les fichiers de plus d'un an, sans les supprimer, puis supprime :
find ~/purge/logs -name '*.log' -mtime +365 -print
find ~/purge/logs -name '*.log' -mtime +365 -delete
ls ~/purge/logs
Je comprends.
| Élément | Rôle |
|---|---|
-name '*.log' |
Ne considère que les fichiers .log |
-mtime +365 |
Modifiés il y a plus de 365 jours |
-print |
Affiche la liste (essai à blanc) |
-delete |
Supprime les fichiers trouvés |
Questions.
- Quels fichiers ont été supprimés ? Lesquels restent ? ______________________
- Pourquoi faut-il toujours lancer
-printavant-delete? ______________________ - Les journaux contiennent des adresses IP : sont-ils des données personnelles ? Quelle durée cherche-t-on à respecter ? ______________________
Sur une machine réelle, la rotation est confiée à logrotate. Voici un exemple de configuration (à lire, puis tester sans effet avec -d) :
- Que signifie
rotate 12avecmonthly? Combien de temps les journaux sont-ils conservés ? ______________________
Partie B. Pseudonymiser n'est pas anonymiser (30 min)
Une analyste veut transmettre à un prestataire des statistiques sur les prospects, en remplaçant les courriels par leur empreinte SHA-256.
J'anticipe. Le prestataire reçoit uniquement les empreintes. Peut-il retrouver les adresses courriel ? ______________________
Éléments de réponse
Il ne peut pas « inverser » le hachage, mais il peut calculer les empreintes d'adresses plausibles (prénom.nom@domaine) et comparer. Pour un espace de valeurs restreint, c'est rapide.
Simule cette attaque. Enregistre attaque.sh :
#!/bin/bash
for e in blanc@example.org faure@example.net; do printf '%s' "$e" | sha256sum | cut -d' ' -f1; done > empreintes.txt
for nom in aubert blanc carre daret eon faure; do
for dom in com org net; do
h=$(printf '%s@example.%s' "$nom" "$dom" | sha256sum | cut -d' ' -f1)
if grep -q "$h" empreintes.txt; then echo "Retrouvé : $nom@example.$dom"; fi
done
done
Puis refais l'opération avec un sel secret conservé par l'entreprise (jamais transmis) :
SEL=$(openssl rand -hex 16)
printf '%s' 'blanc@example.org' | openssl dgst -sha256 -hmac "$SEL" | cut -d' ' -f2
Questions.
- Quelles adresses l'attaque retrouve-t-elle ? Pourquoi cela fonctionne-t-il ? ______________________
- Pourquoi l'attaque échoue-t-elle si le prestataire ne connaît pas le sel ? ______________________
- La donnée salée est-elle anonyme ? Qui peut encore ré-identifier ? ______________________
- Pour transmettre des statistiques au prestataire, quelle solution vaut mieux que le hachage ? ______________________
Partie C. Qualifier une violation et notifier la CNIL (80 min)
Lis le cas MédiaGroup (fictif).
- Qualifie l'incident : quel principe est atteint (confidentialité, intégrité, disponibilité) ? Quelle nature de violation ? ______________________
- À quelle heure démarre le délai de 72 heures ? Quelle est l'échéance ? ______________________
- Évalue la gravité avec les trois critères du cours. ______________________
- La CNIL doit-elle être notifiée ? Les personnes doivent-elles être informées ? Justifie. ______________________
- Rédige le projet de notification : nature de la violation, catégories et nombre de personnes, contact, conséquences probables, mesures prises ou envisagées. ______________________
- Que doit-on inscrire dans le registre des violations ? ______________________
- Quelles mesures techniques auraient limité l'impact (au moins trois) ? ______________________
- Que ferais-tu en tant que technicien dans les deux premières heures ? ______________________
Warning
En situation réelle, c'est le responsable de traitement (avec son DPO) qui décide et signe la notification. Le technicien fournit les faits et les preuves, sans les altérer : copie des journaux, horodatages, liste des systèmes touchés.
Retour en entreprise
Si ta situation le permet : observe comment ton entreprise traite ce sujet, note en quelques lignes l'écart avec le TP, et, avec l'accord de ton tuteur, réalise une partie sur une situation réelle. Anonymise tes captures. Voir Transfert en entreprise.
Bilan de la séance
Remplis ce bilan seul, honnêtement : il sert à décider ce qu'il faut reprendre. Niveau : Non maîtrisé, Maîtrise partielle, Bonne maîtrise ou Excellente maîtrise (le vocabulaire des grilles nationales d'évaluation) ; Non évalué si tu n'as pas travaillé la compétence aujourd'hui.
| Compétence du référentiel | Ce que j'ai fait dans cette séance | Niveau |
|---|---|---|
| B3.1 – Protéger les données à caractère personnel | ||
| B3.4 – Garantir la disponibilité, l'intégrité et la confidentialité des services informatiques et des données de l'organisation face à des cyberattaques |
Note
Les codes sont ceux du référentiel (l'arrêté numérote des activités : les codes « B… » sont un usage courant).
Je sais faire, sans aide :
- Écrire une purge planifiée d'une table et d'un dossier de journaux ;
- Distinguer pseudonymisation et anonymisation ;
- Reconnaître une violation de données et en évaluer la gravité ;
- Rédiger les éléments d'une notification à la CNIL ;
- Citer les mentions obligatoires d'un contrat de sous-traitance.
Ce que je dois reprendre : ______________________
Ma question à poser à l'enseignant : ______________________