Data remanence con dd e shred, un modo economico e sicuro per cancellare i dati su disco.

Qualche giorno fa un amico mi chiese un parere su alcuni programmi per la cancellazione sicura dei dati perchè aveva un portatile che avrebbe dovuto restituire da li a breve.  Mi chiese anche se la formattazione a basso livello era una opzione oppure no.

Intanto c’è da rilevare che la richiesta è del tutto legittima dal momento che la semplice cancellazione del dato all’interno del sistema operativo è il più delle volte insufficiente. In effetti esiste un problema legato alla persistenza dei dati dopo la cancellazione (Data Remanence). Per maggiori informazioni visitare la wikipedia:

http://en.wikipedia.org/wiki/Data_remanence

Esistono tanti programmi, alcuni anche molto costosi, in grado di riscrivere diverse volte dati arbritari sul disco al fine di eliminare la persistenza dei dati (Overwriting) ma io ho pensato che ancora una volta il comando dd poteva essere utile, veloce e sopratutto gratuito.

Per maggiori informazioni sull’uso di dd potete visitare l’articolo:

http://www.morzello.com/?p=28

L’idea di base è quella di utilizzare dd per sovrascrivere il contenuto dell’intero disco eseguendo il comando diverse volte utilizzando /dev/urandom come input.

/dev/urandom sui sistemi unix-like è un file particolare in grado di generare un flusso binario pseudo casuale che viene utilizzato a vari scopi come ad esempio la crittografia.

A questo punto, per cancellare completamente il contenuto di un disco, potremmo impartire il comando:

dd if=/dev/urandom of=/dev/sdX

dove sdX è il disco in questione.
Ovviamente la soluzione proposta presuppone la cancellazione dei dati sull’intero disco e non consente la sovrascittura in caso di singoli file come ad esempio è possibile fare tramite il comando shred ma è comunque un’idea come un’altra di portare a termine il lavoro a basso costo.

Usare shred
shred invece nasce proprio per sovrascrivere e nascondere o cancellare il contenuto di file. Ovviamente, dato che /dev/sdX è anche esso un file, è possibile ottenere un ottimo risultato impartendo il comando:

shred -n N -zv /dev/sdX

dove N è il numero di scritture da fare mentre -z provvede a fare l’ultima scritura con una serie di zeri al fine di nascondere l’esecuzione del programma (come se fosse stato impartito un semplice dd if=/dev/zero of=/dev/sdX).

Alla prossima.

dd, gzip, netcat. Backup e Cloning di un hard disk

Spesso mi capita di dover mettere le mani su sistemi che necessitano di pesanti modifiche.
Quando capita mi piace stare con le spalle coperte, per questo motivo, onde evitare di rovinare qualche dato sensibile, la prima cosa che faccio è clonare il disco fisso.
Ci sono in circolazione una miriade di applicativi in grado di svolgere la mansione ma nessuno mi soddisfa in pieno, vuoi per via delle licenze, vuoi perchè alcuni necessitano di installazione oppure sono dipendenti dal sistema operativo.
Poichè il tempo a mia disposizione è sempre risicato, bisogna trovare una soluzione semplice ma efficace.
Chi lavora su sistemi Unix like sa bene che esistono strumenti validi disponibili direttamente dalla console.

Usare dd
dd è un comodo comando che prende un file in input (parametro if) e lo copia, in un file di output (parametro of).
Questa copia avviene bit per bit senza alcuna modifica, di conseguenza utilizzabile per diversi scopi. Poichè nei sistemi *nix, l’hard disk come tutto del resto, viene visto come un file, dd può essere utilizzato per fare una clonazione.
Abbiamo detto che dd fa una copia bit per bit, di conseguenza è facile intuire che non si tratta di una soluzione salvaspazio.
Possiamo fare molto per ridurre lo spazio necessario all’operazione ma di questo ne parleremo più avanti in questo articolo.
Per copiare il contenuto di un disco (ad esempio hda) su un’altro disco (ad esempio hdb), basta eseguire il seguente comando:

dd if=/dev/hda of=/dev/hdb

Non c’è bisogno di ricordare che hdb deve essere di dimensioni uguali o maggiori di hda.

Per ripristinare la copia del disco basta sostituire il parametro if con il parametro of:

dd if=/dev/hdb of=/dev/hda

Se volessimo copiare il contenuto del disco in un file, il comando sarebbe:

dd if=/dev/hda of=/home/user/myfile.bin

Ovviamente il file di destinazione deve essere creato su un disco diverso da quello che intendiamo clonare.
Tornando al discorso dello spazio, è possibile dirigere l'output verso gzip prima di salvare l'immagine su file ma bisogna tenere in considerazione che sul disco sono presenti sia i files validi che quelli eliminati. Per questo motivo, se il disco è stato utilizzato per diverso tempo, gzip potrebbe essere poco efficiente anche in caso di dischi con tanto spazio a disposizione.
A dare una mano in questo senso arriva ancora una volta dd.
Quello che dobbiamo fare è creare un file dummy in ogni partizione del disco in modo da ripulire tutto lo spazio disponibile:

dd if=/dev/zero of=/mnt/part1/dummyfile; rm -f /mnt/part1/dummyfile
dd if=/dev/zero of=/mnt/part2/dummyfile; rm -f /mnt/part2/dummyfile
...
dd if=/dev/zero of=/mnt/partN/dummyfile; rm -f /mnt/partN/dummyfile

E' assolutamente corretto che ogni comando si concluda con un errore per spazio su disco insufficiente ma ricordate sempre di eliminare i dummyfile altrimenti non ci sarà più spazio sulla partizione.

A questo punto possiamo utilizzare gzip per comprimere il file immagine:

dd if=/dev/hda | gzip -9 > /home/user/myfile.bin.gz

Il comando per ripristinare l'immagine sul disco è il seguente:

gzcat -dc /home/user/myfile.bin.gz | dd of=/dev/hda

Usare netcat
Chi non possiede un disco esterno per compiere le operazioni di clonazione si può affidare a netcat un comando del tutto simile a cat ma destinato alla rete.
Chi vuole adoperare questo metodo deve necessariamente avere la possibilità di comunicare con un altro computer.

Per prima cosa predisponiamo il computer ricevente alla ricezione dell'immagine:

nc -l 4000 | dd of=/home/user/myfile.bin.gz

Il parametro -l mette netcat in ascolto sulla porta indicata dal parametro -p. Tutto ciò che netcat riceve sarà diretto al file /home/user/myfile.bin.gz grazie a dd.

Dall'altro lato invece non dobbiamo far altro che inviare tutti bit verso netcat:

dd if=/dev/hda | gzip -9 | nc 192.168.0.1 4000

Nel nostro esempio l'indirizzo ip del ricevente era 192.168.0.1.

Infine per ripristinare il tutto basta invertire i comandi sui due computer ed utilizzando l'hard disk come destinatario del comando dd:

dd if=/home/user/myfile.bin.gz | nc 192.168.0.1 4000

per inviare il file e

nc -l -p 4000 | gzcat -dc | dd of=/dev/hda

per clonare il disco.

Gli utenti di Windows che desiderano fare il cloning del disco seguendo questa guida possono utilizzare una qualsiasi distribuzione live di Linux come ad esempio Knoppix o Slax.

Uso avanzato di dd
Spesso capita di voler spezzare l'immagine creata con dd in file più piccoli, magari perchè si desidera utilizzare un masterizzatore oppure per ovviare al limite dei 2 giga imposto dalle partizioni FAT di windows.
Comunque sia è possibile spezzare l'immagine creata con dd specificando alcuni parametri aggiuntivi.

dd if=/dev/hda of=/home/user/myfile_01.bin bs=1024 count=1000000

Con il comando precendente si chiede a dd di creare un file da 1GB scrivendo un'immagine contenente 1000000 blocchi da 1024 byte.

dd if=/dev/hda of=/home/user/myfile_02.bin bs=1024 count=1000000 skip=1000000

Tramite il parametro skip chiederemo a dd di saltare i primi 1000000 blocchi prima di iniziare a copiare i dati sul secondo file.
Continueremo in questo modo fino a quando l'intero disco verrà copiato.
Questi parametri sono utili anche con netcat ad esempio quando la connessione tra client e server viene interrota per qualche motivo.
Qual'ora ci fossero problemi di questo tipo, non è necessario riprendere la copia dall'inizio ma e sufficiente controllare quanto dd ha già copiato e riprendere la copia dall'ultimo blocco copiato.
La prima cosa da fare è calcolare quanti blocchi sono già stati copiati nell'immagine. Mediante il comando ls -l è possibile vedere la lunghezza del file immagine; sarà sufficiente dividere questo valore per il parametro bs impartito a dd. Nel caso in cui il parametro bs non sia stato specificato, bisognerà divirere il valore per 512 (valore di default).
Per riprendere la copia sarà sufficiente specificare il parametro skip impostando il risultato ottenuto dalla divisione.

Questo è tutto, spero come al solito di non avervi annoiato troppo.

Alla prossima.