Linux / Commande shred : écraser un fichier et comprendre les limites de l’effacement
shred tente de remplacer les données d’un fichier par des écritures successives, mais ne garantit pas l’effacement de toutes leurs copies. Sur un SSD, un système à copie sur écriture, un snapshot ou une sauvegarde, les anciennes données peuvent rester ailleurs ; une exécution réussie prouve l’achèvement demandé par l’outil, pas une impossibilité universelle de récupération.
Par défaut, GNU shred conserve l’entrée du fichier après l’écrasement. L’option -u ajoute sa suppression. Avant de choisir cet outil pour des données confidentielles, distinguez l’objet visible par le système de fichiers, le stockage physique sous-jacent et les autres emplacements où ces données ont été copiées.
Comprendre les conditions d’un écrasement utile
shred repose sur l’hypothèse que les écritures remplacent les anciennes données au même endroit. Cette hypothèse est plus favorable pour un fichier sur un support magnétique réinscriptible, avec une allocation réellement réutilisée en place et sans autre copie conservée. Elle n’est pas garantie simplement parce que la commande écrit sans erreur.
| Couche ou mécanisme | Pourquoi une ancienne copie peut rester | Conséquence |
|---|---|---|
| SSD et mémoire flash | Répartition de l’usure et cellules de réserve hors de l’adresse logique réécrite | Écraser un fichier ne désigne pas forcément ses anciennes cellules |
| Copie sur écriture et snapshots | Un nouveau bloc peut remplacer une référence sans modifier l’ancien bloc | Une version antérieure peut rester conservée |
| Journal de données et caches intermédiaires | Le contenu peut avoir été écrit dans un autre emplacement | Le fichier courant n’est pas forcément l’unique copie |
| Sauvegardes, réplication et stockage distant | Les copies ont leur propre cycle de conservation | La commande locale ne les efface pas |
| Blocs défectueux remappés par le matériel | L’ancienne zone peut ne plus être accessible à l’application | Une nouvelle écriture logique ne prouve pas sa réécriture physique |
La journalisation n’a pas partout le même effet. Le manuel GNU distingue notamment la journalisation du contenu et celle des seules métadonnées ; pour ext4, il traite différemment data=journal et les modes ordered ou writeback. Cela ne suffit cependant pas à conclure qu’un fichier ext4 sur SSD est effacé : les autres couches restent à examiner.
Si vous ne connaissez pas le fonctionnement du stockage, ne supposez pas que toutes les écritures se font en place. Augmenter le nombre de passes ne supprime ni un snapshot indépendant ni un ancien bloc invisible à travers le contrôleur.
Observer le fonctionnement sur un fichier jetable de seize octets
Cet essai GNU crée un nouvel espace temporaire et un fichier contenant uniquement une chaîne de démonstration. Il n’utilise aucun document personnel ni périphérique :
espace=$(mktemp -d) || exit 1
fichier=$espace/jetable.bin
printf 'ABCDEFGHIJKLMNO\n' > "$fichier"
stat -c '%s' -- "$fichier"
shred -v -n 1 -z -x -- "$fichier" || exit 1
stat -c '%s' -- "$fichier"
od -An -tx1 -v -- "$fichier"
printf 'Espace de travail : %s\n' "$espace"
La taille affichée avant et après est 16. La dernière commande od montre seize octets 00, car -z ajoute une passe finale de zéros. -n 1 demande une passe initiale ; l’ajout -z donne donc deux passes au total dans cet essai. Le fichier est encore présent, car aucune option de suppression n’a été demandée.
Ce contrôle porte sur les octets actuellement lisibles dans le fichier. Il ne mesure pas les données d’un ancien bloc, d’un snapshot ou d’une sauvegarde. Gardez cette distinction lorsque vous interprétez le statut de sortie et le journal -v.
Choisir les passes, la taille traitée et les options
| Option GNU | Effet | Limite |
|---|---|---|
-n N |
Nombre de passes d’écrasement, 3 par défaut | Plus de passes ne traitent pas les copies hors de portée |
-z |
Ajoute une passe finale de zéros | Ne transforme pas l’opération en effacement physique certifié |
-x, --exact |
Évite l’arrondi supplémentaire au bloc pour un fichier ordinaire | Ne signifie pas que toute la chaîne de stockage a été vérifiée |
-s N |
Traite les N premiers octets | Une limite inférieure à la longueur laisse une partie du contenu intacte |
-v |
Affiche les opérations et la progression sur l’erreur standard | Le journal ne détecte pas toutes les couches de stockage |
-f |
Essaie d’adapter les permissions si nécessaire pour écrire | Ne contourne pas toutes les protections et peut modifier les droits |
Sans -x, GNU peut augmenter la taille d’un fichier ordinaire jusqu’au multiple de bloc suivant pour traiter la fin du bloc alloué. Ne supposez donc pas que la taille reste inchangée après un shred sans suppression. -x supprime cet arrondi, mais une taille explicitement demandée avec -s peut encore étendre le fichier.
Pour voir une limite partielle, utilisez un autre fichier dans l’espace de démonstration :
printf 'ABCDEFGHIJ' > "$espace/partiel.bin"
shred -n 1 -z -x -s 4 -- "$espace/partiel.bin" || exit 1
od -An -tx1 -v -- "$espace/partiel.bin"
Les quatre premiers octets se lisent comme 00 ; les six suivants correspondent encore à EFGHIJ. Traiter seulement un préfixe n’efface pas le reste d’un fichier. N’ajoutez pas -u à une opération partielle en pensant avoir couvert toutes ses anciennes données.
--random-source permet de fournir une source de données aléatoires à l’outil. Ce n’est pas une preuve de qualité d’effacement et un fichier arbitraire n’est pas un générateur approprié à tous les usages. Pour l’usage ordinaire, gardez la source prévue par l’implémentation au lieu d’inventer une source de sécurité.
Supprimer ensuite le nom et comprendre les liens durs
Pour essayer la suppression, créez encore un nouveau petit fichier, puis contrôlez séparément le statut de shred et la présence de son nom :
a_retirer=$espace/a-retirer.bin
printf '%s\n' 'exemple jetable' > "$a_retirer"
if shred -n 1 -z -x -u -- "$a_retirer"; then
if [ ! -e "$a_retirer" ] && [ ! -L "$a_retirer" ]; then
printf '%s\n' 'Opération terminée ; ce nom de fichier est absent.'
else
printf '%s\n' 'Le nom est encore présent ; vérifier le résultat.' >&2
exit 1
fi
else
printf '%s\n' 'Échec : examiner le journal et l’état du fichier.' >&2
exit 1
fi
L’absence de ce nom est un résultat visible dans le répertoire, pas une preuve que les anciennes données ont disparu de tous les supports. Le mode de suppression GNU peut être précisé avec la forme longue --remove=unlink, --remove=wipe ou --remove=wipesync : ces choix règlent aussi les opérations sur le nom, pas une purge universelle de ses copies historiques.
Un lien dur est un autre nom du même objet fichier. Écraser cet objet peut donc affecter tous ses noms, alors que la suppression demandée ne retire que les noms indiqués. Examinez le nombre de liens et l’identité de l’objet avec stat et les métadonnées des liens avant de viser des fichiers réels. Une autre entrée conservée peut aussi rendre le résultat de suppression moins intuitif.
Les guillemets et -- protègent les espaces et les noms qui ressemblent à des options. Le nom spécial - a toutefois un sens particulier pour GNU shred : il désigne la sortie standard. Pour viser un fichier ordinaire réellement nommé -, utilisez un chemin comme ./-, après avoir contrôlé l’objet. Ne copiez pas une redirection de sortie comme si elle conservait forcément le contenu à écraser : le shell peut tronquer le fichier avant le démarrage de shred.
Choisir une méthode de retrait adaptée au stockage
Pour une simple suppression sans exigence d’effacement des traces, rm retire un nom. truncate change la longueur logique. shred demande des écritures sur l’objet accessible. Ces opérations répondent à des besoins différents et ne remplacent pas automatiquement une procédure de retrait du support complet.
Pour réutiliser ou céder un SSD ou un autre support, recherchez la procédure de sanitisation prévue pour le modèle, l’interface et le niveau d’assurance requis. Les fonctions dédiées du contrôleur peuvent avoir un périmètre différent d’un simple écrasement de fichier ; leur résultat dépend de l’implémentation et doit être vérifié. Ne transposez pas une commande destructive d’un type de périphérique à un autre.
La publication NIST SP 800-88 révision 2 sur la sanitisation des supports relie le choix d’une méthode au support, à la confidentialité attendue et à la validation du résultat. Ce cadre ne donne pas un nombre magique de passes shred qui garantirait l’effacement sur tous les matériels.
L’effacement cryptographique peut être pertinent si les données ont été protégées par un chiffrement approprié dès leur stockage et si les clés nécessaires sont réellement supprimées selon une procédure validée. Il faut aussi traiter les clés de récupération, copies sauvegardées ou clés conservées à l’extérieur. Une donnée précédemment écrite en clair ne devient pas effacée par la seule suppression d’une clé ajoutée plus tard. Une clé commune à tout un volume ne constitue pas une méthode de retrait sélectif d’un seul fichier.
Selon le risque et l’état du matériel, la destruction physique par une filière adaptée peut être nécessaire. Ne confondez pas le nom du programme shred et une procédure de destruction physique du support : le programme réalise des écritures logicielles.
Préparer et vérifier une opération sur des données réelles
- Définissez le périmètre. Un fichier, une partition, un disque, un volume virtuel et une sauvegarde sont des cibles différentes. Identifiez aussi les versions, réplicas et données dont la conservation reste nécessaire.
- Confirmez le bon objet. Vérifiez le chemin, les liens et les couches de stockage. Pour un support, contrôlez son modèle, son numéro de série, sa capacité, ses montages et ses utilisateurs actifs.
- Choisissez la méthode adaptée. Le comportement réel du système de fichiers, du contrôleur et du stockage distant doit être connu. Si ce n’est pas le cas, n’attribuez pas à shred une garantie qu’il ne peut pas fournir.
- Conservez le résultat de l’opération et validez son périmètre. Un code 0, un nom absent et un fichier rempli de zéros sont des observations différentes. Aucune ne prouve à elle seule l’effacement de toutes les anciennes copies.
shred accepte aussi des périphériques et peut alors détruire les données d’un volume entier. Les exercices de cet article restent volontairement limités à des fichiers neufs de démonstration. Pour une opération sur un support, partez d’une procédure propre au matériel et d’un inventaire vérifié ; les repères sur disques, partitions et montages permettent d’identifier ce que vous êtes en train de viser.
Le manuel GNU de shred détaille ces hypothèses et limites. Si une erreur survient, ne présumez pas que l’ancien contenu est encore intact : une partie peut déjà avoir été réécrite. Pour une donnée qu’il faut pouvoir restaurer, préservez d’abord la copie requise dans un emplacement maîtrisé, puis décidez séparément de son propre cycle de conservation.




