Borrados y bien borrados

Existen varias formas de borrar datos, o sea, ficheros y/o directorios. La más cómoda, y seguramente la más usual entre los que usamos GNU/Linux, es a través de algún administrador gráfico de ficheros como Thunar, Nautilus, Krusader, PCMan, GNOME Commander o cualquier otro. Estas aplicaciones, normalmente, no eliminan completamente los ficheros; en su lugar los envían a la papelera de reciclaje por si, en caso de borrado accidental, queremos recuperarlos. Aunque, desde hace un tiempo, también ofrecen la opción de borrar “completamente” los ficheros, sin pasar por la papelera.

Thunar menú borrar

Herramienta de borrado en Thunar

Otra forma de borrar datos –menos utilizada entre los usuarios– es haciendo uso de la terminal, con el comando rm, que elimina ficheros o directorios del disco sin dar la posibilidad de recuperarlos en la papelera.

Esas dos opciones son muy útiles si estamos usando un ordenador compartido; o si estamos trabajando sobre una unidad de almacenamientos extraíble (disco duro externo, lápiz USB de memoria, etc.); o, simplemente, si -por el motivo que sea- estamos interesados en proteger nuestra privacidad haciendo desaparecer cualquier rastro de nuestros datos (porque vamos a regalar el ordenador, o a vender el disco duro o lo que sea).

El problema es que ninguna de las opciones anteriores permite eliminar los datos del todo, pues mediante las herramientas de software adecuadas es posible rescatar fácilmente casi cualquier fichero que hayamos borrado con un gestor de ficheros o con rm, pudiendo dejar al descubierto información privada de carácter personal como contraseñas, conversaciones de mensajería instantánea o fotos íntimas.

Evidentemente, a nadie le hace gracia que otra persona pueda tener acceso a sus datos personales. Por ese motivo se han desarrollado utilidades en GNU/Linux que nos permite no solo borrar, sino triturar de manera contundente cualquier fichero, sin dejar ningún rastro, ni la más remota posibilidad de ser recuperado. Voy a dar un repaso por las herramientas más útiles.

Comandos para un borrado seguro

Tenemos a nuestra disposición un surtido variado de comandos para el shell que nos van a permitir eliminar ficheros con distintos grados de fiabilidad, dependiendo del comando y las opciones con las que se ejecute.

secure-delete
borrando disco duro
Se trata de un paquete de cuatro herramientas orientadas a eliminar todo rastro de datos residentes en cualquier parte del ordenador, no solo en las unidades de almacenamiento, también en la memoria RAM. Tras instalar el paquete disponemos de las siguientes utilidades:

srm
Es la versión segura del comando rm. Permite borrar ficheros de forma que, posteriormente, tendrán pocas posibilidades de ser recuperados. Utiliza un algoritmo de limpieza basado en el documento «Eliminación segura de datos desde la memoria magnética y de estado sólido», escrito por Peter Gutmann, uno de los mayores expertos en criptografía civil.

El proceso de borrado consta de los siguientes pasos:

  • sobrescribe una vez el contenido de cada fichero con el carácter 0xff
  • sobrescribe 5 veces el contenido del fichero con números aleatorios generados de forma segura mediante el fichero especial /dev/random
  • sobrescribe 27 veces el contenido con valores especiales definidos en el documento de Gutmann
  • sobrescribe otras 5 veces el contenido con números aleatorios generados de forma segura mediante el fichero especial /dev/urandom
  • renombra el fichero con una cadena generada al azar
  • trocea el fichero

Para acelerar el proceso, srm sobrescribe en bloques de 32k, llenando buffers de la caché de disco para obligarlos a eliminar y sobrescribir los datos que estaban contenidos en el archivo que se está borrando.

$ srm -v foto_01.jpg foto_02.jpg
Using /dev/urandom for random input.
Wipe mode is secure (38 special passes)
Wiping foto_01.jpg ************************************** Removed file foto_01.jpg ... Done
Wiping foto_02.jpg ************************************** Removed file foto_02.jpg ... Done

Existen diferentes opciones para modificar el comportamiento del comando:

  • -d → si se utiliza el comodín .* para borrar todos los ficheros ocultos de un directorio se ignorará los ficheros especiales . y ..
  • -f → modo de borrado rápido (fast) y menos seguro. No se generan números aleatorios con /dev/urandom
  • -l → hace disminuir la seguridad del borrado al aplicar solamente dos sobrescrituras: una con valores 0xff y otra con valores aleatorios.
  • -r → borra todos los subdirectorios en modo recursivo.
  • -v → muestra información de lo que está haciendo

sfill
Tritura los restos de los datos que permanecen disponibles en el espacio libre de una partición de almacenamiento, tras haber sido “borrados” en modo inseguro (con rm, por ejemplo). Utiliza un algoritmo de limpieza basado también en el documento de Peter Gutmann.

El proceso de borrado está basado en cuatro pasos, que son los pasos numerados del 1 al 4 en el comando srm. Después se generan tantos archivos temporales como sea posible para limpiar el espacio de i-nodos libre, tras lo cual se borran esos ficheros temporales y finaliza la ejecución de sfill.

Opciones que se pueden incluir:

  • -f → modo de borrado rápido (fast) y menos seguro. No se generan números aleatorios con /dev/urandom
  • -i → limpia solamente el espacio de i-nodos libre, no el espacio libre en disco.
  • -I → al revés que el anterior. Limpia el espacio libre en disco, no el espacio de i-nodos libres.
  • -l → hace disminuir la seguridad de la limpieza al aplicar solamente dos sobrescrituras: una con valores 0xff y otra con valores aleatorios.
  • -l → si se duplica esta opción disminuye aún más la seguridad al aplicarse solamente el paso 1
  • -v → muestra información de lo que está haciendo.

Tras las opciones debe especificarse la ruta de la partición que se desea limpiar.

$ rm IMG-WA0001.jpg
$ sudo sfill -fIlv `pwd`
Wipe mode is insecure (two passes [0xff/random])
Wiping now ...
Creating /media/TARJETA_1G/oooooooo.ooo ... ** Finished

En el ejemplo superior he borrado -en modo inseguro- una foto almacenada en una unidad de almacenamiento USB (un lápiz de memoria de 1 Gb) y luego he machacado el rastro dejado por dicho fichero haciendo un borrado rápido (y, por tanto, no muy seguro) en dos pasadas y limpiando solamente el espacio libre en disco.

La ejecución de este comando puede tomar un tiempo considerable dependiendo del tamaño de la partición y, sobre todo, de las opciones con las que lo ejecutemos.

sdmem
Aún borrando con el comando srm y limpiando el espacio libre en disco de cualquier rastro de ficheros eliminados anteriormente, es posible que sigan quedando huellas de tales ficheros en la memoria RAM. módulo RAM Aunque esos datos desaparecerán en cuanto se apague el ordenador, si estamos en un ordenador compartido, que cambia de manos continuamente sin que nadie lo apague, es posible que alguien pueda hacer un volcado de la memoria y obtener datos ajenos que hayan permanecido en algún lugar de la RAM, algo bastante factible desde que existen las memorias SDRAM.

Para evitar tal posibilidad tenemos el comando sdmem, que elimina de forma segura cualquier dato residual que permanezca en memoria. El algoritmo de limpieza también está basado en el documento de Peter Gutmann, y aplica los mismos cuatro pasos que se ejecutan en el comando sfill.

Podemos ejecutarlo con las siguientes opciones:

  • -f → modo de borrado rápido (fast) y menos seguro. No se generan números aleatorios con /dev/urandom
  • -l → hace disminuir la seguridad de la limpieza al aplicar solamente dos sobrescrituras: una con valores 0xff y otra con valores aleatorios
  • -l → si se duplica esta opción disminuye aún más la seguridad al aplicarse solamente el paso 1
  • -v → muestra información de lo que está haciendo
$ sudo sdmem -fv
Starting Wiping the memory, press Control-C to abort earlier. Help: "sdmem -h"
Wipe mode is secure (38 special passes)
**************************************************************************************************
**************************************************************************************************
**************************************************************************************************
**************************************************************************************************
*****************************

En este ejemplo he ejecutado una limpieza rápida -e insegura- del espacio libre de la RAM. No he probado a ejecutarlo sin parámetros, ya que, al parecer, en tal caso se toma bastante más tiempo.

sswap
esquema memoria swappingEs posible que incluso tras borrar un fichero, limpiar el espacio libre de la partición donde se encontraba y hacer una limpieza de la memoria RAM disponible, aún queden vestigios del mismo en la partición de intercambio (SWAP) del disco, donde se almacenan temporalmente datos que no están en uso y tampoco tienen cabida en la RAM.

Para ello tenemos el comando sswap, que elimina de forma segura cualquier dato que haya en el espacio de intercambio, de forma que no puede recuperarse. El algoritmo de limpieza está basado en el documento de Gutmann, y aplica los mismos pasos que el comando sfill.

Se le puede indicar las siguientes opciones:

  • -f → modo de borrado rápido (fast) y menos seguro. No se generan números aleatorios con /dev/urandom
  • -l → hace disminuir la seguridad de la limpieza al aplicar solamente dos sobrescrituras: una con valores 0xff y otra con valores aleatorios
  • -l → si se duplica esta opción disminuye aún más la seguridad al aplicarse solamente el paso 1
  • -v → muestra información de lo que está haciendo
$ swapon -s
Filename    Type        Size      Used    Priority
/dev/sd3    partition   499708    355928    -1
$ sudo swapoff /dev/sd3
$ sudo sswap -fllv /dev/sd3
Wipe mode is insecure (one pass [random])
Writing to device /dev/sd3: * done
$ sudo sswap -flv /dev/sd3
Wipe mode is insecure (two passes [0xff/random])
Writing to device /dev/sd3: ** done
$ sudo sswap -fv /dev/sd3
Wipe mode is secure (38 special passes)
Writing to device /dev/sd3: ************************************** done
$ sudo sswap -v /dev/sd3
Wipe mode is secure (38 special passes)
Writing to device /dev/sd3: Using /dev/urandom for random input.
************************************** done
$ sudo swapon /dev/sd3

En este ejemplo he realizado varias limpiezas con distintas combinaciones de opciones de ejecución: desde la menos a la más segura.

Como puede verse, antes de proceder con la eliminación de datos del área de intercambio hay que saber cual es la partición asignada a ese área con el comando swapon, después hay que deshabilitarla con swapoff y, una vez limpiada, volverse a rehabilitar de nuevo con swapon.

shred
Otro comando alternativo a srm que podemos utilizar para machacar, de forma segura, el contenido de cualquier fichero especificado como argumento, sobrescribiéndolo tres veces con caracteres variados y aleatorios.

Admite las siguientes opciones:

  • -f → modifica los permisos del fichero si es necesario para hacer posible la sobrescritura
  • -n valor → sobrescribe el contenido del fichero el número de veces determinado por el valor que se especifique
  • -s valor[K|M|G] → sobrescribe una cantidad de bytes (indicada en valor) del contenido del fichero. El valor especificado puede expresarse en Kilobytes, Megabytes o Gigabytes.
  • -random-source=FILE → obtiene del fichero indicado una cantidad de bytes aleatorios necesarios para sobrescribir el fichero que se desea eliminar
  • -u → trunca y borra el fichero después de sobrescribirlo 1
  • -z → añade una sobrescritura final con ceros para ocultar la trituración
  • -v → muestra información de lo que está haciendo.
$ shred -fuzv IMG-WA0001.jpg
shred: IMG-WA0001.jpg: paso 1/4 (random)...
shred: IMG-WA0001.jpg: paso 2/4 (random)...
shred: IMG-WA0001.jpg: paso 3/4 (random)...
shred: IMG-WA0001.jpg: paso 4/4 (000000)...
shred: IMG-WA0001.jpg: borrando
shred: IMG-WA0001.jpg: renombrado a 00000000000000000000000
shred: 00000000000000000000000: renombrado a 0000000000000000000000
shred: 0000000000000000000000: renombrado a 000000000000000000000
shred: 000000000000000000000: renombrado a 00000000000000000000
shred: 00000000000000000000: renombrado a 0000000000000000000
shred: 0000000000000000000: renombrado a 000000000000000000
shred: 000000000000000000: renombrado a 00000000000000000
shred: 00000000000000000: renombrado a 0000000000000000
shred: 0000000000000000: renombrado a 000000000000000
shred: 000000000000000: renombrado a 00000000000000
shred: 00000000000000: renombrado a 0000000000000
shred: 0000000000000: renombrado a 000000000000
shred: 000000000000: renombrado a 00000000000
shred: 00000000000: renombrado a 0000000000
shred: 0000000000: renombrado a 000000000
shred: 000000000: renombrado a 00000000
shred: 00000000: renombrado a 0000000
shred: 0000000: renombrado a 000000
shred: 000000: renombrado a 00000
shred: 00000: renombrado a 0000
shred: 0000: renombrado a 000
shred: 000: renombrado a 00
shred: 00: renombrado a 0
shred: IMG-WA0001.jpg: borrado

Hay que tener en cuenta que shred se basa en una suposición muy importante: que el sistema de archivos sobrescribe los datos in situ, que es la forma tradicional de hacerlo. Pero muchos sistemas de archivos modernos no hacen las cosas exactamente de esta manera, por lo que podría no ser efectivo utilizar este comando. Por ejemplo, en los sistemas con registro por diario (journaling), como ext3 y ext4, la eficacia del comando es limitada en las unidades que se montan con la opción del modo de datos establecida a journal, mientras que en los modos ordered y writeback funciona correctamente.

wipe
wipe es un comando que sobrescribe con patrones especiales de caracteres el contenido de los ficheros que se quieren borrar. Por defecto se usan 34 patrones, de los cuales 8 son aleatorios. Al igual que en los comandos de secure-delete, esos patrones fueron recomendados en el documento de Peter Gutmann. Existe un procedimiento abreviado que permite aplicar solamente 4 sobrescrituras con patrones aleatorios, y que es, por supuesto, menos seguro.

Este comando se suele utilizar para limpiar completamente particiones o unidades de almacenamiento (como discos duros), en este último caso conviene utilizar este comando con mucha precaución y con las opciones adecuadas.

No es buena idea confiar ciegamente en la efectividad de este comando, ya que, como afirma el propio autor del comando, «no podemos garantizar que wipe borrará realmente tus datos, o que los datos borrados no son recuperables mediante técnicas avanzadas», pues, como él mismo reconoce, «el mejor modo de desinfectar un medio de almacenamiento es someterlo a temperaturas superiores a 1500°K».

Es muy difícil evaluar si la aplicación de wipe sobre un fichero determinado borrará realmente su contenido; todo dependerá de una serie de factores como el tipo de sistema de ficheros donde se encuentra el fichero (sobre un sistema NFS o journaling es más que probable que no funcione) o el tipo de medio de almacenamiento utilizado.

Estas son algunas de las opciones que admite:

  • -f → deshabilita la petición de confirmación antes de ejecutar el comando
  • -r → permite eliminar un árbol completo de directorios. No sigue los enlaces simbólicos
  • -c → cambia los permisos necesarios para poder realizar el borrado
  • -i → muestra información de lo que hace
  • -q → realiza una limpieza rápida de 4 pasadas para cada fichero, escribiendo datos aleatorios
  • -Q valor → establece un número de pasadas para la limpieza rápida con la opción -q
  • -D → permitirá borrar los ficheros enlazados por enlaces simbólicos que wipe se encuentre. No es compatible con la opción -r
  • -k → mantiene los archivos, no los desvincula después de haber sido sobrescritos. Útil para limpiar un dispositivo de almacenamiento manteniendo el fichero especial asociado.
/media/Lapiz_1G/$ ls -l
total 1,3M
drwx------ 2 aag aag  16K feb 28 10:23 lost+found/
-rw------- 1 aag aag 139K mar  3 14:10 IMG-WA0002.jpg
-rw------- 1 aag aag  95K jul 28  2015 IMG-WA0003.jpg
-rw------- 1 aag aag 331K jul 28  2015 IMG-WA0005.jpg
-rw------- 1 aag aag 308K jul 28  2015 IMG-WA0008.jpg
-rw------- 1 aag aag 341K jul 28  2015 IMG-WA0009.jpg
/media/Lapiz_1G/$ wipe -cirqk /media/aag/Lapiz_1G/
Okay to WIPE 1 directory ? (Yes/No) Yes
Entering directory '/media/Lapiz_1G/'
File IMG-WA0005.jpg (338066 bytes) wiped
File IMG-WA0003.jpg (96348 bytes) wiped
File IMG-WA0009.jpg (348846 bytes) wiped
Entering directory 'lost+found'
Going back to directory /media/Lapiz_1G
File IMG-WA0002.jpg (141525 bytes) wiped
File IMG-WA0008.jpg (314743 bytes) wiped
Going back to directory /media/Lapiz_1G
Operation finished.
5 files wiped and 0 special files ignored in 2 directories, 0 symlinks removed but not followed, 0 errors occured.
/media/Lapiz_1G/$ ls -l
total 28K
drwx------ 2 aag aag 16K feb 28 10:23 lost+found/
-rw------- 1 aag aag   2 mar  4 15:12 IMG-WA0002.jpg
-rw------- 1 aag aag   1 mar  4 15:12 IMG-WA0003.jpg
-rw------- 1 aag aag   0 mar  4 15:12 IMG-WA0005.jpg
-rw------- 1 aag aag   0 mar  4 15:12 IMG-WA0008.jpg
-rw------- 1 aag aag   2 mar  4 15:12 IMG-WA0009.jpg

En el ejemplo he ejecutado una limpieza de los ficheros almacenados en un lápiz de memoria. Los nombres de los ficheros siguen estando, pero sus contenidos han sido eliminados. Puede comprobarse comparando el tamaño de los mismos, antes y después de efectuar la limpieza.

dd
Es un comando poderoso y versátil que puede ser utilizado con fines diversos. Básicamente, es un duplicador y convertidor de datos (Dataset Definition) que lee datos de una fuente y los escribe en un destino. Tanto la fuente como el destino puede ser un fichero, un dispositivo de almacenamiento o una partición, lo cual nos permite clonar, limpiar o … sobrescribir el contenido de cualquier partición o dispositivo de almacenamiento. Precisamente esa es la aplicación que me interesa destacar, pues podríamos usarlo para sobrescribir el contenido de una partición con caracteres aleatorios o con un determinado carácter que será especificado en la opción correspondiente.

La sintaxis genérica del comando es:

dd if=$ datos-entrada of=$ datos-salida [ opciones ]

$datos-entrada y $datos-salida pueden ser discos, particiones, archivos o dispositivos; básicamente todo aquello que se pueda escribir a o leer de.

Algunas de las opciones más comunes son:

  • -bs=N → lee y escribe hasta N bytes de una vez
  • -cbs=N → convierte N bytes a la vez
  • -count=N → copia solamente N bloques de entrada
  • -ibs=N → lee hasta N bytes de una vez (por defecto: 512 bytes)
  • -obs=N → escribe hasta N bytes de una vez (por defecto: 512 bytes)

Los valores de las opciones admiten sufijos multiplicativos: K=1 kilobyte, M=1 Megabyte, G=1 Gigabyte y así sucesivamente para los demás múltiplos (Terabyte, Picobyte, …).

$ sudo bash -c "dd if=/dev/urandom | pv | dd  of=/dev/sdb1 bs=4k"[sudo] password for aag:
dd: error al escribir en «/dev/sdb1»: No queda espacio en el dispositivo                                                                            <=>              ]
10913+1809708 registros leídos
10913+1809707 registros escritos
997809152 bytes (998 MB) copiados, 345,042 s, 2,9 MB/s
952MB 0:05:45 [2,76MB/s] [                                                                                                                            <=>           ]

Como la interfaz de dd es un tanto espartana y no informa de lo que acontece durante su ejecución, es aconsejable complementar la sintaxis de dd con el comando pv, que recibe a través de una tubería los datos que lee un primer comando dd, y los envía por otra tubería a otro comando dd para ser escritos en el destino. La función de pv es mostrar un poco de información en la terminal, para que podamos conocer en tiempo real la información sobre los bytes transferidos, el tiempo de ejecución, la tasa de transferencia y una especie de barra de progreso.

La sobrescritura de un disco o partición con dd no garantiza en absoluto la total eliminación de los ficheros que había almacenados, por lo que es más que probable que puedan ser restablecidos con herramientas más o menos avanzadas de recuperación de datos.

La ejecución de este comando puede llegar a hacerse eterna, dependerá de la cantidad de datos que haya que transferir, de la cantidad de bytes que se transfieran en cada ciclo de lectura/escritura y de la velocidad de los dispositivos de almacenamiento implicados.

Conclusión

Hacer desaparecer por completo un fichero con información valiosa no es una tarea tan sencilla como pudiera pensarse. Incluso aplicando sucesivamente varios de estos comandos, no se puede garantizar que dicha información pueda volver a recuperarse mediante técnicas, aplicaciones o herramientas sofisticadas (y poco conocidas) que, obviamente, no están al alcance de todos los usuarios, pero sí de personas u organizaciones con intenciones poco benévolas que podrían estar muy interesadas en conocer aspectos de tu intimidad

Ello no significa que podamos recurrir a estos comando con ligereza cada vez que queramos, todo lo contrario, es muy recomendable utilizarlos con sumo cuidado, y estando muy seguros de lo que se está haciendo, pues el borrado accidental de un archivo, o de una partición del disco duro, con la consiguiente pérdida de la información contenida en él, puede provocar un cataclismo de dimensiones insospechadas.


  1. La acción por defecto es no borrar el fichero cuyo contenido se quiere machacar, ya que podría tratarse de un fichero de dispositivo (p. ej.: /dev/sda2
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s