it-swarm-eu.dev

Vieni ad annullare lo spazio libero su disco in Linux?

Quando un file viene cancellato, il suo contenuto può ancora essere lasciato nel filesystem, a meno che non venga sovrascritto esplicitamente con qualcos'altro. Il comando wipe può cancellare in modo sicuro i file, ma non sembra consentire di cancellare lo spazio libero su disco non utilizzato da alcun file.

Cosa dovrei usare per ottenere questo?

141
Alex B

Attenzione:L'hardware moderno del disco/SSD e i moderni filesystem possono estirpare i dati in punti in cui non è possibile cancellarli, quindi questo processo potrebbe lasciare i dati sul disco. metodi di cancellazione dei dati sicuri sono il comando ATA Secure Erase (se implementato correttamente) o la distruzione fisica. Vedere anche Come posso cancellare in modo affidabile tutte le informazioni su un disco rigido?

È possibile utilizzare una suite di strumenti denominata secure-delete.

Sudo apt-get install secure-delete

Questo ha quattro strumenti:

srm - elimina in modo sicuro un file esistente
smem: cancella in modo sicuro le tracce di un file dalla ram
sfill: cancella tutto lo spazio contrassegnato come vuoto sul disco rigido
sswap: cancella tutti i dati dallo spazio di scambio.

Dalla pagina man di srm

srm è progettato per eliminare i dati sui supporti in modo sicuro che non possono essere recuperati da ladri, forze dell'ordine o altre minacce. L'algoritmo di cancellazione è basato sul documento "Cancellazione sicura di dati dalla memoria magnetica e allo stato solido" presentata al 6 ° Simposio sulla sicurezza di Usenix da Peter Gutmann, uno dei principali crittografi civili.

Il processo di cancellazione sicura dei dati di srm è così:

  • 1 passaggio con 0xff
  • 5 passaggi casuali. /dev/urandom è utilizzato per un RNG sicuro, se disponibile.
  • 27 passaggi con valori speciali definiti da Peter Gutmann.
  • 5 passaggi casuali. /dev/urandom è utilizzato per un RNG sicuro, se disponibile.
  • Rinominare il file su un valore casuale
  • Tronca il file

Come misura aggiuntiva di sicurezza, il file viene aperto in modalità O_SYNC e dopo ogni passaggio viene eseguita una chiamata fsync(). srm scrive blocchi 32k a scopo di velocità, riempiendo i buffer delle cache del disco per costringerli a svuotare e sovrascrivere i vecchi dati che appartenevano al file.

105
fnord_ix

Il modo più veloce, se hai bisogno di un solo passaggio e vuoi solo sostituire tutto con zeri, è:

cat /dev/zero > zero.file
sync
rm zero.file

(esegui da una directory sul filesystem che vuoi cancellare)
(il comando sync è una misura paranoia che garantisce che tutti i dati vengano scritti su disco - un gestore intelligente della cache potrebbe capire che può cancellare le scritture per qualsiasi blocco in sospeso quando il file è scollegato)

Ci sarà un tempo durante questa operazione quando non ci sarà spazio libero sul filesystem, che può essere di decine di secondi se il file risultante è grande e frammentato, quindi ci vuole un po 'per eliminarlo. Ridurre il tempo in cui lo spazio libero è completamente zero:

dd if=/dev/zero of=zero.small.file bs=1024 count=102400
cat /dev/zero > zero.file
sync
rm zero.small.file
rm zero.file

Questo dovrebbe essere sufficiente per impedire a qualcuno di leggere il vecchio contenuto del file senza una costosa operazione legale. Per una variante leggermente più sicura, ma più lenta, sostituire /dev/zero con /dev/urandom. Per ulteriori paranoie esegui più passaggi con /dev/urandom, anche se hai bisogno di tanto sforzo l'utility shred dal pacchetto coreutils è la strada da percorrere:

dd if=/dev/zero of=zero.small.file bs=1024 count=102400
shred -z zero.small.file
cat /dev/zero > zero.file
sync
rm zero.small.file
shred -z zero.file
sync
rm zero.file

Si noti che in quanto sopra il file piccolo viene sminuzzato prima di crearne uno più grande, quindi può essere rimosso non appena il più grande è completo invece di dover attendere che venga triturato lasciando il filesystem con zero spazio libero per il tempo che impiega. Il processo shred con tempo long su un file di grandi dimensioni e, a meno che non si stia tentando di nascondere qualcosa dal NSA non è realmente necessario IMO.

Tutto quanto sopra dovrebbe funzionare su qualsiasi filesystem.

Limiti dimensioni file:

Come indicato da DanMoulding in un commento qui sotto, questo potrebbe avere problemi con il limis della dimensione del file su alcuni filesystem.

Per FAT32 sarebbe sicuramente un problema dovuto al limite del file 2GiB: la maggior parte dei volumi è più grande di questo in questi giorni (8TiB è il limite della dimensione del volume IIRC). È possibile aggirare questo problema convogliando il grande output di output cat /dev/zero attraverso split per generare più file più piccoli e regolare di conseguenza i livelli di shred e delete.

Con ext2/3/4 è meno preoccupante: con il blocco predefinito/comune di 4K il limite della dimensione del file è 2TiB quindi dovresti avere un volume enorme perché questo sia un problema (il volume massimo la dimensione in queste condizioni è 16TiB).

Con il btrfs (ancora sperimentale) sia il volume massimo che il volume sono di 16EiB.

Sotto NTFS la lunghezza massima del file è maggiore della lunghezza massima del volume, in alcuni casi anche.

Punti di partenza per maggiori informazioni:
http://en.wikipedia.org/wiki/Ext3#Size_limits
http://en.wikipedia.org/wiki/Btrfs
http://en.wikipedia.org/wiki/Ntfs#Scalability

Dispositivi virtuali

Come accennato nei commenti di recente, ci sono considerazioni aggiuntive per i dispositivi virtuali:

  • Per i dischi virtuali scarsamente allocati altri metodi come quelli usati da zerofree saranno più veloci (anche se diversamente da cat e dd questo non è uno strumento standard su cui puoi fare affidamento per essere disponibile in quasi tutti i sistemi operativi unix-a-like).

  • Sappi che azzerare un blocco su un dispositivo virtuale sparso non può cancellare il blocco sul dispositivo physical sottostante, anzi, direi che è improbabile che - il gestore del disco virtuale creerà solo il blocco come non più utilizzato in modo che possa essere assegnato a qualcos'altro in seguito.

  • Anche per i dispositivi virtuali di dimensioni fisse, potresti non avere alcun controllo su dove il dispositivo vive fisicamente in modo che possa essere spostato nella posizione corrente o su un nuovo set di dischi fisici in qualsiasi momento e il massimo che puoi cancellare è la posizione corrente, non eventuali posizioni precedenti il ​​blocco potrebbe aver risieduto nel passato.

  • Per i problemi di cui sopra sui dispositivi virtuali: a meno che non controlli l'host (o gli host) e possa eseguire una cancellazione sicura dello spazio non allocato dopo aver cancellato i dischi nel VM o spostato il dispositivo virtuale in giro, non c'è niente può fare su questo dopo il fatto. L'unica risorsa è usare la cifratura completa del disco dall'inizio, quindi niente di non criptato viene scritto sul supporto fisico in primo luogo. Potrebbero comunque esserci richieste di cancellazione di spazi liberi all'interno di VM naturalmente. Si noti inoltre che FDE può rendere molto meno utili i dispositivi virtuali sparsi in quanto il livello di virtualizzazione non può realmente vedere quali blocchi non sono utilizzati. Se il livello del filesystem del sistema operativo invia comandi di trim al dispositivo virtuale (come se fosse un SSD) e il controller virtuale li interpreti, allora questo potrebbe risolverlo, ma non conosco alcuna circostanza in cui ciò avvenga effettivamente e una più ampia la discussione di questo è una questione da affrontare altrove (ci stiamo già avvicinando all'argomento per la domanda originale, quindi se questo ha suscitato il tuo interesse alcune domande di sperimentazione e/o di follow-up potrebbero essere in ordine).

69
David Spillett

AVVERTIMENTO

Sono rimasto scioccato da quanti file photorec potrebbero recuperare dal mio disco, anche dopo aver cancellato.

Se c'è più sicurezza nel riempire lo "spazio libero" solo 1 volta con 0x00 o 38 volte con diversi standard cabalistici è più di una discussione accademica. L'autore del seminale del 1996 sulla triturazione si è scritto un epilogo dicendo che questo è obsoleto e non necessario per l'hardware moderno. Non vi è alcun caso documentato di dati fisicamente sostituiti a zero e recuperati in seguito.

Il vero fragile link in questa procedura è il filesystem . Alcuni filesystem riservano spazio per usi speciali e non sono resi disponibili come "spazio libero". Ma i tuoi dati potrebbero essere lì . Ciò include foto, e-mail personali in chiaro, qualunque cosa. Ho appena cercato su Google + space + ext4 e ho appreso che il 5% della mia partizione home era riservata. Immagino che sia qui che photorec abbia trovato tanta parte della mia roba. Conclusione: il metodo di triturazione non è il più importante, anche il metodo multi-pass lascia ancora i dati in posizione .

Puoi provare # tune2fs -m 0 /dev/sdn0 prima di montarlo. (Se questa sarà la partizione di root dopo il riavvio, assicurati di eseguire -m 5 o -m 1 dopo averlo smontato).

Ma ancora, in un modo o nell'altro, potrebbe esserci ancora spazio.

L'unico modo veramente sicuro è quello di cancellare l'intera partizione, creare nuovamente un filesystem e quindi ripristinare i file da un backup.


Modo veloce (consigliato)

Esegui da una directory sul filesystem che vuoi cancellare:

dd if=/dev/zero of=zero.small.file bs=1024 count=102400
dd if=/dev/zero of=zero.file bs=1024
sync ; sleep 60 ; sync
rm zero.small.file
rm zero.file

Note: lo scopo del file piccolo è ridurre il tempo in cui lo spazio libero è completamente zero, lo scopo della sincronizzazione è assicurarsi che i dati siano effettivamente scritti.

Questo dovrebbe essere abbastanza buono per la maggior parte delle persone.

Modo lento (paranoico)

Non vi è alcun caso documentato di dati da recuperare dopo la pulizia di cui sopra. Sarebbe costoso e richiedeva risorse, se possibile.

Tuttavia, se hai una ragione per pensare che le agenzie segrete spenderebbero molte risorse per recuperare i tuoi file, questo dovrebbe essere sufficiente:

dd if=/dev/urandom of=random.small.file bs=1024 count=102400
dd if=/dev/urandom of=random.file bs=1024
sync ; sleep 60 ; sync
rm random.small.file
rm random.file

Ci vuole molto più tempo.

Avvertimento. Se hai scelto il modo paranoico, dopo questo vorrai ancora fare la pulizia rapida, e questa non è paranoia. La presenza di dati puramente casuali è facile ed economica da rilevare e solleva il sospetto che siano effettivamente dati crittografati. Potresti morire sotto tortura per non rivelare la chiave di decrittazione.

Modo molto lento (pazzo paranoico)

Persino l'autore del seminale del 1996 sulla frantumazione ha scritto un epilogo dicendo che questo è obsoleto e non necessario per l'hardware moderno.

Ma se hai ancora molto tempo libero e non ti dispiace sprecare il tuo disco con un sacco di sovrascritture, eccola:

dd if=/dev/zero of=zero.small.file bs=1024 count=102400
sync ; sleep 60 ; sync
shred -z zero.small.file
dd if=/dev/zero of=zero.file bs=1024
sync ; sleep 60 ; sync
rm zero.small.file
shred -z zero.file
sync ; sleep 60 ; sync
rm zero.file

Nota: questo è essenzialmente equivalente all'utilizzo dello strumento di cancellazione sicura.


Prima della modifica, questo post era una riscrittura di David Spillett. Il comando "cat" genera un messaggio di errore, ma non posso scrivere commenti sui post di altre persone.

44
user39559

C'è un'utilità zerofree almeno in Ubuntu:

http://manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html

   zerofree — zero free blocks from ext2/3 file-systems

   zerofree  finds  the  unallocated, non-zeroed blocks in an ext2 or ext3
   filesystem (e.g. /dev/hda1) and fills them with zeroes. This is  useful
   if  the  device  on  which this file-system resides is a disk image. In
   this case, depending on the type of disk image, a secondary utility may
   be  able  to  reduce the size of the disk image after zerofree has been
   run.

   The usual way to achieve  the  same  result  (zeroing  the  unallocated
   blocks)  is to run dd (1) to create a file full of zeroes that takes up
   the entire free space on the drive, and then delete this file. This has
   many disadvantages, which zerofree alleviates:

      ·  it is slow;

      ·  it makes the disk image (temporarily) grow to its maximal extent;

      ·  it  (temporarily)  uses  all  free  space  on  the disk, so other
         concurrent write actions may fail.

   filesystem has to be unmounted or mounted  read-only  for  zerofree  to
   work.  It  will exit with an error message if the filesystem is mounted
   writable. To remount the  root  file-system  readonly,  you  can  first
   switch to single user runlevel (telinit 1) then use mount -o remount,ro
   filesystem.

Controlla anche questo link su zerofree: Mantenendo sparse le immagini del filesystem - è del suo autore - Ron Yorston (9 agosto 2012)

27
osgx

Ecco come farlo con una GUI.

  1. Installa BleachBit
  2. Esegui come root facendo clic su Applicazioni - Utilità di sistema - BleachBit come amministratore.
  3. Nelle preferenze, digli quali percorsi vuoi. Generalmente li indovina bene. Si desidera includere un percorso scrivibile per ogni partizione. Generalmente questo è/home/username e/tmp, a meno che non siano la stessa partizione, nel qual caso basta sceglierne una.
  4. Seleziona la casella Sistema - Pulisci spazio libero su disco.
  5. Fai clic su Elimina.

L'avanzamento di BleachBit su dd (che altrimenti è molto bello) è quando il disco è finalmente pieno, BleachBit crea piccoli file per cancellare gli inode (che contiene metadati come nomi di file, ecc.).

3
Andrew Z

È possibile cancellare lo spazio libero utilizzando il pacchetto di cancellazione sicura.

In quel pacchetto puoi trovare lo strumento sfill, che è stato progettato per cancellare i dati che si trovano sullo spazio disponibile su supporti in modo sicuro che non può essere recuperato da ladri, forze dell'ordine o altre minacce.

Per installare un pacchetto di cancellazione sicura in Linux (Ubuntu), installalo con il seguente comando:

$ Sudo apt-get install secure-delete

Quindi per cancellare i tuoi dati non hanno spazio libero, prova il seguente comando:

sfill -f -v -ll /YOUR_MOUNTPOINT/OR_DIRECTORY

Dove/YOUR_MOUNTPOINT/OR_DIRECTORY è il punto di montaggio (df -h, mount) o directory per cancellare lo spazio disponibile.

Leggi il manuale su http://manpages.ubuntu.com/manpages/hardy/man1/sfill.1.html

2
kenorb

Pulire un disco alla massima velocità.

Le istruzioni tipiche per la crittografia di un'unità al giorno d'oggi ti diranno di prima eliminare l'unità.

Il comando seguente riempirà il tuo disco con testo cifrato AES.

Utilizzare un CD live se è necessario pulire l'unità di avvio principale.

Apri un terminale e aumenta i tuoi privilegi:

Sudo bash

Cerchiamo di elencare tutte le unità del sistema per essere sicuri:

cat /proc/partitions

NOTA: Sostituisci /dev/sd{x} con il dispositivo che desideri cancellare.

ATTENZIONE: questo non è per i dilettanti! Potresti rendere il tuo sistema non avviabile !!!

Sudo openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero > /dev/sd{x}

Sono sbalordito da quanto velocemente sia.

2
Roger Lawhorn

Uso dd per allocare uno o più file di grandi dimensioni per riempire lo spazio libero, quindi utilizzare un'utilità di cancellazione sicura.

Per assegnare i file con dd prova:

dd if=/dev/zero of=delete_me bs=1024 count=102400

Questo genererà un file chiamato delete_me che ha una dimensione di 100 MB. (Qui bs è la "dimensione del blocco" impostata su 1k e count è il numero di blocchi da allocare).

Quindi usa la tua utility di cancellazione sicura preferita (sto usando shred ) sui file così creati.

Ma NOTA QUI: buffering significa che anche se si fa il disco whole, non si può ottenere assolutamente tutto!


Questo link raccomanda scrub per lo spazio libero che cancella. Non l'ho provato.

2
dmckee

Probabilmente hai già il GNU pacchetto coreutils installato sul tuo sistema. Fornisce il comando shred .

2
dkaylor

È più facile usare scrub :

scrub -X dump

Ciò creerà una cartella dump nella posizione corrente e creerà il file finché il disco non sarà pieno. Puoi scegliere uno schema con l'opzione -p (nnsa|dod|bsi|old|fastold|gutmann).

Non è facile installare lo scrub ( vedere i forum di Ubuntu su questo ), ma una volta terminata l'installazione, hai in mano uno strumento davvero SEMPLICE ed efficiente.

1
FMaz008

Ho trovato una soluzione semplice che funziona su Linux e su MacOS. Spostati nella cartella principale del tuo disco e avvia questo comando:

for i in $(seq 1 //DISKSPACE//); do dd if=/dev/zero of=emptyfile${i} bs=1024 count=1048576; done; rm emptyfile*;

dove // ​​DISKSPACE // è la dimensione in GB del tuo disco rigido.

1
Enrico

usa dd e basta azzerare lo spazio libero. è un mito che i dati devono essere sovrascritti più volte (basta chiedere a peter guntmann) e dati casuali, in contrapposizione a 1 e poi a 0 implica attività innaturale. quindi il risultato finale è un disco pulito con meno tempo dedicato alla scrittura. inoltre, i programmi di cancellazione sicura non sono in grado di sovrascrivere il file reale sui file system moderni (con journaling). Fatti un favore e ottieni fotorec, scansiona il tuo disco per vedere il casino, puliscilo con 1 e opzionalmente con zeri per farlo sembrare intatto. se photorec trova ancora delle cose, ricorda che sta eseguendo la scansione di tutto disponibile, quindi fallo di nuovo con cura con l'utente root.

ricorda che cia/fbi/nsa non ha una macchina di fantasia in grado di leggere lo stato reale dei tuoi frammenti magnetici. era tutto solo un documento scritto molto tempo fa. un "what-if". devi solo cancellare 1 volta.

1
fred

Ecco lo script "sdelete.sh" che uso. Vedi i commenti per i dettagli.

# Install the secure-delete package (sfill command).

# To see progress type in new terminal:
# watch -n 1 df -hm

# Assuming that there is one partition (/dev/sda1). sfill writes to /.
# The second pass writes in current directory and synchronizes data.
# If you have a swap partition then disable it by editing /etc/fstab
# and use "sswap" or similar to wipe it out.

# Some filesystems such as ext4 reserve 5% of disk space
# for special use, for example for the /home directory.
# In such case sfill won't wipe out that free space. You
# can remove that reserved space with the tune2fs command.
# See http://superuser.com/a/150757
# and https://www.google.com/search?q=reserved+space+ext4+sfill

Sudo tune2fs -m 0 /dev/sda1
Sudo tune2fs -l /dev/sda1 | grep 'Reserved block count'

Sudo sfill -vfllz /

# sfill with the -f (fast) option won't synchronize the data to
# make sure that all was actually written. Without the fast option
# it is way too slow, so doing another pass in some other way with
# synchronization. Unfortunately this does not seem to be perfect,
# as I've watched free space by running the "watch -n 1 df -hm"
# command and I could see that there was still some available space
# left (tested on a SSD drive).

dd if=/dev/zero of=zero.small.file bs=1024 count=102400
dd if=/dev/zero of=zero.file bs=1024
sync ; sleep 60 ; sync
rm zero.small.file
rm zero.file

Sudo tune2fs -m 5 /dev/sda1
Sudo tune2fs -l /dev/sda1 | grep 'Reserved block count'
1
Czarek Tomczak

Questa non è una risposta! Solo un commento per coloro che desiderano utilizzare pvname __... quindi non preoccuparsi di votare.

Su Linux Mint 17.3 puoi usare pv( pipe view ) per ottenere progressi nella scrittura. Per esempio:

# Install pv (pipe view)
Sudo apt-get install pv

# Write huge file of approximate size of /dev/sdb, using urandom data:
pv --timer --average-rate --progress --numeric --eta --interval 5 --size "$(blockdev --getsize64 /dev/sda )" /dev/urandom >Rand.file

Il vantaggio qui è che ottieni una barra di avanzamento, ETA e una velocità di trasmissione dati continuamente aggiornata. Lo svantaggio è che questo è scritto su una riga e quando il disco è pieno (restituendo un errore) scompare. Ciò accade perché le dimensioni complete sono approssimative poiché il SO probabilmente utilizzerà il disco mentre questa operazione molto lunga si sta verificando, specialmente sul volume del SO.

Su un HD molto vecchio, ottengo una velocità dati di 13 MB/s usando /dev/urandom, e circa 70 MB/s , quando si utilizza /dev/zero. Questo probabilmente migliorerebbe ulteriormente quando si usasse un ddo catname__, e non pvname__.

0
not2qubit

A volte uso questo one-liner bash:

while :; do cat /dev/zero > zero.$RANDOM; done

Quando inizia a dire che il disco è pieno, basta premere Ctrl+C e rimuovere i file zero.* creati.

Funziona su qualsiasi sistema, indipendentemente dalle dimensioni del file.
Ignora eventuali errori cat: write error: File too large.

0
Nicolas Raoul