Cancellare un file su Linux con rm non significa distruggere i dati. Il comando rm si limita a rimuovere il riferimento al file nel filesystem — come strappare l’etichetta da un cassetto senza svuotarlo. I dati restano fisicamente sul disco fino a quando non vengono sovrascritti da altri dati, e nel frattempo possono essere recuperati con strumenti di analisi forense. In questa guida vedremo come eliminare dati in modo realmente sicuro, i limiti degli strumenti disponibili e perché la cifratura dell’intero disco è la soluzione più affidabile.

Perché rm Non Basta

Per capire perché rm non cancella realmente i dati, dobbiamo capire come funziona un filesystem. Quando salviamo un file, il sistema operativo fa due cose: scrive i dati effettivi sui blocchi del disco e registra in una tabella (l’inode table) dove si trovano quei blocchi. Quando usiamo rm, il sistema operativo cancella solo il riferimento nella tabella e segna quei blocchi come “disponibili”, ma i dati rimangono intatti fino a quando il sistema operativo non deciderà di scrivere nuovi dati su quegli stessi blocchi.

Questo comportamento è sufficiente nell’uso quotidiano, ma diventa un problema quando abbiamo a che fare con dati sensibili: credenziali, backup in chiaro, chiavi di cifratura, dati personali. In questi casi abbiamo bisogno di strumenti che sovrascrivano fisicamente i dati prima di rilasciare lo spazio.

Cancellazione Sicura con shred

shred è lo strumento incluso nelle GNU Coreutils (quindi disponibile su praticamente tutte le distribuzioni Linux) progettato specificamente per sovrascrivere i file con dati casuali prima di cancellarli.

Utilizzo Base

Il comando più comune per cancellare un file in modo sicuro è il seguente.

bash
shred -vzu file_sensibile.txt

I flag utilizzati hanno il seguente significato:

  • -v (verbose): mostra il progresso dell’operazione, utile per file di grandi dimensioni
  • -z (zero): dopo le sovrascritture con dati casuali, esegue un’ultima sovrascrittura con zeri. Questo nasconde il fatto che è stato usato shred sul file, perché un file pieno di dati casuali è un indizio che è stata eseguita una cancellazione sicura
  • -u (unlink): rimuove il file dopo la sovrascrittura. Senza questo flag, shred sovrascrive il contenuto ma lascia il file sul disco

Numero di Sovrascritture

Per impostazione predefinita, shred esegue 3 passaggi di sovrascrittura con dati casuali. Possiamo modificare questo numero con il flag -n.

bash
# Una sola sovrascrittura (più veloce, sufficiente per hardware moderno)
shred -vzun 1 file_sensibile.txt

# 7 sovrascritture (più lento, paranoia extra)
shred -vzun 7 file_sensibile.txt

Quante sovrascritture servono?

Su hardware moderno, una singola sovrascrittura è considerata sufficiente per rendere i dati irrecuperabili con qualsiasi strumento disponibile commercialmente. Lo standard americano DoD 5220.22-M ne raccomanda 3, che è il default di shred. Sovrascritture superiori a 3 sono considerate eccessive dalla comunità crittografica moderna, ma non causano danni se non un tempo di esecuzione maggiore.

Cancellare Più File e Directory

shred lavora su singoli file. Per cancellare più file possiamo usare un glob pattern o combinarlo con find.

bash
# Cancellare tutti i file .txt nella directory corrente
shred -vzu *.txt

# Cancellare ricorsivamente tutti i file in una directory
find cartella/ -type f -exec shred -vzu {} \;

Attenzione

shred non cancella le directory stesse né i nomi dei file dalla struttura del filesystem. Dopo aver usato shred sui file, i contenuti saranno distrutti ma i nomi dei file potrebbero rimanere visibili nella struttura delle directory. Per rimuovere anche le directory vuote, aggiungere un rm -rf cartella/ dopo lo shred.

Limiti della Cancellazione Sicura

Questo è l’aspetto più importante e spesso sottovalutato della cancellazione sicura: shred non è affidabile su tutti i tipi di storage. È fondamentale capire questi limiti per non avere un falso senso di sicurezza.

Filesystem con Journaling

La maggior parte dei filesystem moderni su Linux (ext4, XFS, Btrfs) utilizza il journaling: un meccanismo che registra le modifiche al filesystem in un log (il journal) prima di applicarle effettivamente. Questo protegge l’integrità dei dati in caso di crash o interruzione di corrente.

Il problema è che il journal potrebbe contenere copie dei dati del file. Quando shred sovrascrive il file, sovrascrive i blocchi attuali, ma le copie nel journal potrebbero rimanere intatte. Questo significa che in alcuni scenari i dati potrebbero essere parzialmente recuperabili nonostante l’uso di shred.

SSD e Storage Flash

Su SSD, chiavette USB e schede SD la situazione è ancora più problematica. Questi dispositivi utilizzano un controller interno che gestisce la scrittura dei dati in modo trasparente tramite un meccanismo chiamato wear leveling. Lo scopo del wear leveling è distribuire le scritture uniformemente su tutti i chip di memoria per prolungare la vita del dispositivo.

Il risultato è che quando shred chiede di sovrascrivere un blocco specifico, il controller dell’SSD potrebbe scrivere i nuovi dati su un blocco fisico completamente diverso, lasciando i dati originali intatti in un blocco che non è più direttamente accessibile dal sistema operativo ma che potrebbe essere letto con strumenti di analisi a basso livello.

Tabella Riassuntiva

Tipo di storage Affidabilità di shred Note
HDD tradizionale ✅ Alta Il caso ideale — shred sovrascrive effettivamente i blocchi fisici
HDD con journaling (ext4, XFS) ⚠️ Media I blocchi principali vengono sovrascritti, ma il journal potrebbe contenere copie
SSD ❌ Bassa Il wear leveling rende la sovrascrittura mirata inaffidabile
Chiavette USB / SD ❌ Bassa Stesso problema degli SSD (storage flash)

Cancellazione di Interi Dischi

Quando dobbiamo cancellare un intero disco o partizione (ad esempio prima di vendere o smaltire un dispositivo), possiamo utilizzare dd per sovrascrivere l’intero spazio di storage.

bash
# Sovrascrivere con zeri
sudo dd if=/dev/zero of=/dev/sdX bs=4M status=progress

# Sovrascrivere con dati casuali (più sicuro, più lento)
sudo dd if=/dev/urandom of=/dev/sdX bs=4M status=progress

Operazione distruttiva

Questo comando distrugge TUTTI i dati sul disco specificato, incluso il sistema operativo se eseguito sul disco di avvio. Verificare tre volte il dispositivo di destinazione (/dev/sdX) prima di eseguire il comando. Usare lsblk per identificare correttamente il disco.

Per gli SSD, il metodo più affidabile è il Secure Erase nativo del firmware, che comunica direttamente al controller di cancellare tutti i blocchi, inclusi quelli non raggiungibili dal sistema operativo.

La Soluzione Definitiva: Cifratura del Disco

Tutti i limiti descritti sopra hanno una soluzione radicale: se il disco è cifrato dall’inizio, il problema della cancellazione sicura dei singoli file di fatto non esiste. I dati sul disco sono già illeggibili senza la chiave di cifratura, indipendentemente da come vengono “cancellati”.

LUKS (Linux Unified Key Setup) è lo standard su Linux per la cifratura completa del disco (full-disk encryption). Con LUKS, l’intero contenuto del disco è cifrato con AES-256 e protetto da una passphrase che viene richiesta all’avvio del sistema.

Il consiglio migliore

Se stai configurando un nuovo server o una nuova installazione Linux, attivare la cifratura LUKS durante l’installazione è la singola azione più efficace per proteggere i dati a riposo. Questo rende irrilevante la maggior parte delle preoccupazioni sulla cancellazione sicura dei singoli file.
Scenario Strumento consigliato
Cancellare file su HDD shred -vzu file
Cancellare file su SSD Cifratura preventiva (LUKS)
Cancellare intero HDD dd if=/dev/zero of=/dev/sdX
Cancellare intero SSD Secure Erase nativo (hdparm/nvme-cli)
Protezione completa Cifratura full-disk con LUKS