Borrado seguro de datos en discos duros y SSDs (con FreeBSD)

Hace unas semanas tuve que devolver un servidor hospedado en un centro de datos remoto y me surgió la necesidad de borrar cuidadosamente sus dispositivos de almacenamiento. Normalmente usaría unas cuantas pasadas con el comando dd if=/dev/zero of=.... No obstante, este caso tiene algunos factores interesantes: la máquina tiene tanto discos duros como dispositivos SSD lo que me permite poder comparar ambos tipos de dispositivos, es lo bastante moderna como para soportar versiones recientes del estándar ATA y la máquina tiene instalado OpenSolaris. El último punto es importante, porque el entorno de recuperación que me ofrece el centro de datos no incluye Linux; tan solo una versión prehistórica (2009) de OpenSolaris y una versión aún calentita de FreeBSD.

Mi borrado habitual con varias pasadas de dd if=/dev/zero of=... es muy seguro, pero a) no borra absolutamente todo el disco duro. Por ejemplo, no se borran los sectores remapeados o sectores considerados como dañados o sectores de reserva. Y b) el tiempo de borrado es proporcional al tamaño del disco duro y, en cualquier caso, es bastante lento y monopoliza el ordenador durante el proceso.

Los discos ATA modernos implementan una extensión para el borrado seguro de datos. Su uso es mucho más rápido que el borrado "a mano" y teóricamente más exhaustivo. La entrega de este servidor fue la ocasión perfecta para probar la extensión.

Bajo FreeBSD podemos acceder a las características de seguridad del dispositivo de almacenamiento con el comando camcontrol security DEVICE.

En las SSDs (iguales) me sale:

root@rescue-bsd:~# camcontrol security ada0
pass0: <INTEL SSDSA2CT040G3 4PC10302> ATA8-ACS SATA 2.x device
pass0: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)

Security Option           Value
supported                 yes
enabled                   no
drive locked              no
security config frozen    no
count expired             no
security level            high
enhanced erase supported  yes
erase time                2 min
enhanced erase time       2 min
master password rev       fffe

En los discos duros (diferentes) me sale:

root@rescue-bsd:~# camcontrol security ada2
pass2: <HGST HUS726020ALA610 A5GNT7J7> ACS-2 ATA SATA 3.x device
pass2: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)

Security Option           Value
supported                 yes
enabled                   no
drive locked              no
security config frozen    no
count expired             no
security level            high
enhanced erase supported  no
erase time                > 508 min
enhanced erase time       unspecified
master password rev       fffe

root@rescue-bsd:~# camcontrol security ada3
pass3: <Hitachi HDS723020BLA642 MN6OA5C0> ATA8-ACS SATA 3.x device
pass3: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)

Security Option           Value
supported                 yes
enabled                   no
drive locked              no
security config frozen    no
count expired             no
security level            high
enhanced erase supported  no
erase time                432 min
enhanced erase time       unspecified
master password rev       fffe

Veo que todos los dispositivos de almacenamiento soportan borrado seguro.

El primer paso es realizar un borrado tradicional, como siempre. De esta forma podremos comparar la velocidad (el script hay que lanzarlo desde bash; da error de sintaxis con el shell por defecto de FreeBSD):

root@rescue-bsd:~# while [ true ]; do echo "SSD 1"; dd if=/dev/zero of=/dev/ada0 bs=65536; done
SSD 1
dd: /dev/ada0: short write on character device
dd: /dev/ada0: end of device
610667+0 records in
610666+1 records out
40020664320 bytes transferred in 915.525025 secs (43713348 bytes/sec)
SSD 1
...

La velocidad de escritura es bastante mediocre, 43'7MB/s. Es una SSD antigua y su principal ventaja es que no tiene tiempo de posicionamiento (seek) ni rotacional. El segundo SSD es igual y, naturalmente, la velocidad es similar:

root@rescue-bsd:~# while [ true ]; do echo "SSD 2"; dd if=/dev/zero of=/dev/ada1 bs=65536; done
SSD 2
dd: /dev/ada1: short write on character device
dd: /dev/ada1: end of device
610667+0 records in
610666+1 records out
40020664320 bytes transferred in 883.153115 secs (45315658 bytes/sec)
SSD 2
...

Aquí salen 45'3MB/s.

Lanzando cuatro instancias de este script para borrar las dos unidades SSD y los dos discos duros, veo lo siguiente:

root@rescue-bsd:~# iostat -x 10
                        extended device statistics
device     r/s   w/s     kr/s     kw/s  ms/r  ms/w  ms/o  ms/t qlen  %b
...
ada0         0   737      0.0  47194.1     0     1     0     1    1  98
ada1         0   749      0.0  47956.0     0     1     0     1    1  98
ada2         0  3018      0.0 193161.8     0     0     0     0    1  95
ada3         0  2287      0.0 146422.2     0     0     0     0    1  96
...

Aquí se ve claramente que el disco duro moderno es un 32% más rapido que el disco duro viejo y que la velocidad de escritura en streaming de las SSD es vergonzosa.

Tras un par de pasadas podemos considerar el dispositivo borrado más allá de las capacidades de recuperación de cualquiera realista, pero ahora llega la chicha: usar la extensión ATA de borrado seguro.

Veamos:

root@rescue-bsd:~# camcontrol security ada0 -s XX -e XX
pass0: <INTEL SSDSA2CT040G3 4PC10302> ATA8-ACS SATA 2.x device
pass0: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)

You are about to ERASE ALL DATA from the following device:
pass0,ada0: <INTEL SSDSA2CT040G3 4PC10302> ATA8-ACS SATA 2.x device

Are you SURE you want to ERASE ALL DATA? (yes/no) yes
Issuing SECURITY_SET_PASSWORD password='XX', user='master', mode='high'
Issuing SECURITY_ERASE_PREPARE
Issuing SECURITY_ERASE_UNIT password='XX', user='master'

Erase Complete

Todo el tráfico al dispositivo se detiene mientras dura esta operación. A veces la operación falla al principio con un mensaje camcontrol: ATA SECURITY_ERASE_UNIT failed: 0. Es cuestión de insistir. Esto ocurre con facilidad si hay actividad concurrente en el disco.

El borrado de las SSD es muy rápido: 23 segundos. 40 gigabytes. Impresionante.

Veamos ahora el borrado de los discos duros:

root@rescue-bsd:~# time camcontrol security ada2 -s XX -e XX -y
pass2: <HGST HUS726020ALA610 A5GNT7J7> ACS-2 ATA SATA 3.x device
pass2: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
Issuing SECURITY_SET_PASSWORD password='XX', user='master', mode='high'
Issuing SECURITY_ERASE_PREPARE
Issuing SECURITY_ERASE_UNIT password='XX', user='master'
Erase Complete
0.001u 0.000s 3:36:00.32 0.0%   0+0k 0+0io 0pf+0w

El disco duro rápido tarda 3 horas y 36 minutos en ser borrado.

En cuanto al otro disco duro:

root@rescue-bsd:~# time camcontrol security ada3 -s XX -e XX -y
pass3: <Hitachi HDS723020BLA642 MN6OA5C0> ATA8-ACS SATA 3.x device
pass3: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
Issuing SECURITY_SET_PASSWORD password='XX', user='master', mode='high'
Issuing SECURITY_ERASE_PREPARE
Issuing SECURITY_ERASE_UNIT password='XX', user='master'

Erase Complete
0.000u 0.001s 4:36:59.26 0.0%   0+0k 0+0io 0pf+0w

El disco duro lento tarda 4 horas y 37 minutos.

El ambos casos el ahorro de tiempo comparado con hacer sobreescrituras mediante el comando dd es muy poco reseñable, inapreciable. Los factores a valorar son que durante esta operación el ordenador no necesita invertir ningún recurso en absoluto, todo el trabajo lo hace el disco duro internamente y que el borrado posiblemente alcance zonas inaccesibles desde fuera del propio disco duro.

Durante el borrado seguro el dispositivo de almacenaje no admite ningún otro comando, así que cualquier acceso al mismo tiene que esperar. Eso queda claro viendo el estado de iostat durante el proceso.

En el caso que nos ocupa, dejé funcionando los dd en bucle durante una semana entera y, ocasionalmente, lanzaba borrados seguros a mano un par de veces al día. No es cuestión de celo, ya que estoy seguro de que con una pasada o dos es suficiente para que nadie realista pueda recuperar nada, sino porque dejé el procedimiento de borrado activo hasta que el centro de datos recuperó el control del servidor y perdí el acceso al mismo.

Inmediatamente antes de perder el acceso a ese servidor hice una última prueba de velocidad con los SSD y la velocidad había subido a los 48.9MB/s. Aún muy lejos de los 200 MB/s del disco duro rápido cuando se escribe en streaming, pero es cierto que esos dos dispositivos tienen roles muy diferentes.

Nota

Si estamos completamente seguros de lo que vamos a hacer y no necesitamos que FreeBSD nos pida confirmación (¡ojito!), podemos hacer:

root@rescue-bsd:~# camcontrol security ada3 -s XX -e XX -y

El -y es para que no pregunte si estamos seguros.

Nota

Por supuesto hay comandos similares para Linux. Echa un vistazo al manual de hdparm, por ejemplo.