Come posso distruggere ricorsivamente un intero albero di directory?


48

Ho un albero di directory che vorrei distruggere con l'utilità 'shred' di Linux. Sfortunatamente, shred non ha -Rpossibilità di triturazione ricorsiva.

Come posso distruggere un intero albero di directory in modo ricorsivo?

Risposte:


46

Utilizzare il findcomando per eseguire in shredmodo ricorsivo:

find <dir> -type f -exec shred {} \;

Funziona senza l'opzione -depth? Funziona su moderni file system journaling?
utente sconosciuto

@userunknown No, shred non funziona sui moderni file system di journaling. Per informazioni più precise, consultare man shred.
FanaticD,

Si noti inoltre che questo metodo non tenterà nemmeno di cancellare i nomi dei file , quindi tutti i dati memorizzati in questo modo verranno sicuramente lasciati indietro ( srmdalla risposta di @ Cookie tenterà almeno di risolvere questo problema).
ntninja

Utilizzare -exec shred {} +per renderlo più veloce poiché shred accetta più argomenti.
Sumit

28

Attenzione ai brandelli!

Dalla manpage shred:

ATTENZIONE: Notare che shred si basa su un presupposto molto importante: che il file system sovrascrive i dati in atto. Questo è il modo tradizionale di fare le cose, ma molti progetti di file system moderni non soddisfano questo presupposto. I seguenti sono esempi di file system su cui shred non è efficace o non è garantito che sia efficace in tutte le modalità del file system:

  • file system strutturati in log o journalizzati, come quelli forniti con AIX e Solaris (e JFS, ReiserFS, XFS, Ext3, ecc.)

  • file system che scrivono dati ridondanti e continuano anche se alcune scritture falliscono, come i file system basati su RAID

  • file system che creano snapshot, come il server NFS di Network Appliance

  • file system che memorizzano nella cache in posizioni temporanee, come client NFS versione 3

  • file system compressi

Nel caso dei file system ext3, la suddetta dichiarazione di non responsabilità si applica (e quindi la distruzione è di efficacia limitata) solo in modalità data = journal, che registra i dati dei file oltre ai soli metadati. In entrambe le modalità data = ordinato (impostazione predefinita) e data = writeback, lo shred funziona come al solito. Le modalità di journaling Ext3 possono essere modificate aggiungendo l'opzione data = qualcosa alle opzioni di mount per un particolare file system nel file / etc / fstab, come documentato nella pagina man di mount (man mount).

Inoltre, i backup del file system e i mirror remoti possono contenere copie del file che non possono essere rimosse e che consentiranno il recupero di un file ridotto in un secondo momento.

Soluzione: utilizzare un file system crittografato ed eliminare i file.


+1 per il puntatore su brandello, ho avuto un caso simile prima. Non ha funzionato su NFS di NetApp. NetApp utilizza WAFL e che utilizza il copy-on-write incluso il metajournalling, quindi è giusto. Anche con l'ultimo ZFS di Solaris c'è un altro caso in cui si distruggono brandelli.
Nikhil Mulley,

6
Questa è una cattiva soluzione. Un file system crittografato è sicuro solo se bloccato (e quindi non montato). Non appena il sistema operativo è attivo e funzionante, i dati sono disponibili.
Ooleks,

3
@oleks: sia l'uso shredche la crittografia dei dati impediscono la lettura dei dati da un dispositivo di archiviazione offline (pensate a furto o polizia) con la crittografia dei dati con l'ulteriore vantaggio di proteggere tutti i file, non solo quelli (correttamente) eliminati. Una volta montato il file system, torniamo alle buone autorizzazioni unix in entrambi i casi e la protezione dei dati diventa di nuovo un compito di sicurezza del sistema operativo e corretta amministrazione del sistema. La crittografia iniziale del filesystem non è sicuramente peggiore nel proteggere i dati a riposo dell'uso strategico di shred!
ntninja

12

Utilizzare invece l'eliminazione sicura.

sudo apt-get install secure-delete
srm -r pathname

Fatto. L'eliminazione sicura è molto più paranoica della distruzione, utilizzando 38 passaggi anziché 3. Per eseguire un passaggio singolo rapido, utilizzare

srm -rfll pathname

fll ti offre un generatore di dati meno casuale e un solo passaggio.



Come potrebbe? No
Cookie

Si noti che questo metodo ha l'ulteriore vantaggio rispetto ai findmetodi basati sulla proposta che proveranno anche a cancellare i nomi dei file memorizzati rinominando i file prima di troncarli e scollegarli.
ntninja,

I metodi basati su find di @ntninja usano shred e shred rinomina i file prima di terminarli per eliminarli. Quindi gli stessi benefici, giusto?
tuxayo,

11

Combinando questa risposta con le opzioni più conosciute per distruggere utilizzando questo link di overflow dello stack " Eliminazione permanente e sicura dei file su CentOS ":

find <directory> -depth -type f -exec shred -v -n 1 -z -u {} \;

Modifica: tenere presente che la risposta migliore per la distruzione di un singolo file impone una sincronizzazione che scrive le modifiche sul supporto prima di eliminare il file perché alcuni o tutti i filesystem con journal hanno un buffer.

Se possibile, il comando find dovrebbe chiamare uno script shell sul file che esegue:

shred -v -n 1 /path/to/your/file #overwriting with random data
sync #forcing a sync of the buffers to the disk
shred -v -n 0 -z -u /path/to/your/file #overwriting with zeroes and remove the file

su ogni file.


Dopo aver letto e ricercato molte risposte, ho trovato (imho) questa risposta come la più completa. Aggiungo solo che dal momento che shred non rimuove le directory ho aggiunto rm -rvf $1allo script della shell (dove $ 1 è il file / path / to / your / passato {}dall'espansione nel find... -exec)
JoelAZ

4
shred fa già un fsync (2) dopo ogni passaggio. Proprio perché è necessario forzare le modifiche ai file per raggiungere il disco prima del passaggio successivo.
Ángel,

Che cosa depthfa qui? Anche incerto sulla
reazione negativa

5
find /your/directory -exec shred {} \;

Ha votato, ma James ti ha battuto di un minuto per l'accettazione.
Steve V.

Funziona senza l'opzione -depth? Funziona su moderni file system journaling?
utente sconosciuto

3
find [dirname] -depth -type f -exec shred -n1 {} \;

Ciò esegue una ricerca approfondita dei file nella directory [dirname], quindi esegue il shred -n1comando su ciascun file. Quando si rimuovono file e / o directory, l'aggiunta -depthcome predefinita è una buona abitudine, anche se non è strettamente necessaria per questo caso. Quando si esegue questo tipo di comando con rm -rfinvece di shred, -depthè necessario assicurarsi che le directory non vengano eliminate prima di tentare di eliminare il contenuto delle directory (causando così errori).


3
Dovresti usare shred -N 1, perché il default, triturando 3 volte, è l'olio di serpente. Una volta è sufficiente o 30 volte non funzioneranno.
utente sconosciuto

Fornire un semplice comando come risposta non è il modo migliore per rispondere a una domanda. Vorrei raccomandare di aggiungere una piccola spiegazione su ciò che la linea sta facendo e sulle possibili limitazioni legate all'utilizzo.
n0pe

0

Il shredmetodo più completo che ho trovato, che include anche la rimozione della directory, è di findchiamare uno script per avere shred:

  • sovrascrivere il file
  • sync
  • quindi eliminare
  • e infine chiama rm per rimuovere i nomi delle directory.

Questo metodo gestisce anche correttamente i nomi dei file con spazi all'interno.

Primo: lo shredscript (ho chiamato il mio dirShredder.she l' ho memorizzato nella /rootdirectory:

shred -v -n 1 "$1" #overwriting with random data
sync #forcing a sync of the buffers to the disk
shred -v -n 0 -z -u "$1" #overwriting with zeroes and remove the file
rm -rvf "$1" # call rm to remove the directories

Quindi, chiama lo script in questo modo:

find /volume1/pathToShred/ -mindepth 1 -depth -exec /root/dirShredder.sh "{}" \;

Assicurati di contrassegnare il killit.shfile eseguibile ( chmod +x) e ovviamente aggiorna il percorso per la directory che vuoi distruggere e dirShredder.shse lo memorizzi altrove.

NOTA BENE - shredpresenta problemi sui filesystem Copy-on-Write (ZFS, BTRFS, et al) e persino sui file system Journaling. Non esiste un modo "migliore" per accettare ciò che ho trovato oltre ai "filesystem crittografati", ma non sono sicuro di quanto sia efficace dopo ciò.
Il più vicino che puoi ottenere è quello di sovrascrivere tutto lo spazio vuoto sull'unità con dati casuali dopo le operazioni di distruzione (non zeri, sembra che questo non sia sempre affidabile). Inoltre, gli SSD possono avere anche altre considerazioni (come TRIM).

Non entrerò in quelli qui, ci sono altre risposte Stack (ad esempio la risposta di @user unknown in questa domanda) e molte discussioni in tutta la rete che coprono questi argomenti, quindi cercali se hai bisogno di quel livello di sicurezza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.