¿Forma rápida de aleatorizar HD?


14

He leído sobre cómo hacer que los discos duros sean seguros para el cifrado, y uno de los pasos es escribir bits aleatorios en el disco, para que los datos cifrados no se puedan distinguir del resto de los datos en el disco duro.

Sin embargo, cuando intenté usarlo dd if=/dev/urandom of=/dev/sdaen el pasado, ETA parecía estar en el orden de los días. Vi algo sobre el uso badblocksen lugar de urandom, pero eso no pareció ayudar mucho. Solo me gustaría saber si hay alguna forma que pueda ayudarme a acelerar esto, como las opciones ddo alguna otra cosa que me pueda faltar, o si la velocidad es solo una limitación de la HD.


Cambie el tamaño de su bloque a algo más amigable con los discos duros. dd bs=1Mpor ejemplo.
Patrick

¿Qué velocidad estabas obteniendo? Se tarda un tiempo en escribir un disco duro completo de 3 TB (por ejemplo). También verifique iostat -kx 10qué porcentaje de ocupado está en la unidad.
derobert

55
shred -v -n 1 /dev/overwritethises rápido. Se trata del único caso en el shredque realmente es útil para algo.
frostschutz

@derobert: Realmente no puedo decir con certeza qué tan rápido fue, pero me fui durante unas horas, regresé, y estaba alrededor del 10% completo para mi HD 500G interno la primera vez que probé esto. Gracias por el consejo "iostat" por cierto
bitflips

@Patrick: Intenté bs = 4M a ciegas, ya que vi eso en la guía sobre cómo colocar el CD de Arch en un usb. Ayudó un poco, pero aún fue bastante lento.
bitflips

Respuestas:


14

dd if=/dev/urandom of=/dev/sda, o simplemente cat /dev/urandom >/dev/sda , no es la forma más rápida de llenar un disco con datos aleatorios. Linux /dev/urandomno es el RNG criptográfico más rápido que existe. ¿Hay una alternativa a / dev / urandom? tiene algunas sugerencias En particular, OpenSSL contiene un PRNG criptográfico más rápido:

openssl rand $(</proc/partitions awk '$4=="sda" {print $3*1024}') >/dev/sda

Tenga en cuenta que al final, si hay una mejora o no depende de qué parte es el cuello de botella: la CPU o el disco.

La buena noticia es que llenar el disco con datos aleatorios es inútil. Primero, para disipar un mito común, limpiar con ceros es igual de bueno en el hardware actual . Con la tecnología de disco duro de la década de 1980, sobrescribir un disco duro con ceros dejó una pequeña carga residual que podría recuperarse con hardware algo costoso; Fueron necesarios múltiples pases de sobrescritura con datos aleatorios (el "borrado de Gutmann"). Hoy, incluso un solo paso de sobrescritura con ceros deja datos que no pueden recuperarse de manera realista incluso en condiciones de laboratorio.

Cuando está encriptando una partición, no es necesario llenar el disco con datos aleatorios para la confidencialidad de los datos encriptados. Solo es útil si necesita hacer que el espacio utilizado por los datos cifrados no se pueda distinguir del espacio no utilizado. La creación de un volumen cifrado encima de un contenedor no aleatorio revela qué bloques de disco ha utilizado el volumen cifrado. Esto da una buena pista sobre el tamaño máximo del sistema de archivos (aunque con el tiempo se convertirá en una aproximación cada vez peor), y poco más.


44
Gutmann es un mito en su totalidad, tampoco creo que se haya hecho para un disco duro de la década de 1980. La ironía es que con las unidades cada vez más inteligentes, en realidad debería usar datos aleatorios hoy en día para asegurarse de que la unidad se ve obligada a escribir, en lugar de sectores libres (recortar) o comprimir datos. Los ceros solo son buenos si en realidad están escritos.
frostschutz

1
@mellowmaroon Sí, cat /dev/zerocasi siempre es suficiente. Solo no es suficiente si desea ocultar la cantidad de espacio libre en el volumen cifrado.
Gilles 'SO- deja de ser malvado'

1
@mellowmaroon Es bastante inútil. Un espía sabrá que tiene a lo sumo X MB de datos (y posiblemente mucho menos, porque el espacio utilizado anteriormente pero ahora libre es indistinguible del espacio utilizado), ¿y qué? Además, la ubicación del espacio libre puede revelar el tipo de sistema de archivos (copias de superbloque); eso rara vez es un problema (generalmente está expuesto en texto sin /etc/fstabcifrar, a menos que haya encriptado la partición raíz, e incluso entonces no hay tantas opciones posibles).
Gilles 'SO- deja de ser malvado'

2
@Gilles El problema que encontré en Ubuntu 13.10 es que openssl randparece tener un límite superior en la cantidad de bytes que generará. Si excede ese límite, por ejemplo, 'openssl rand 810000000000 openssl' , then no random output is generated. Only a brief "help" text is printed. I'm trying to random (pretty much) fill a 3TB hard drive. Not sure if there is a way to get para generar tantos bytes aleatorios.
irracional John

1
Para el problema irracional del límite superior de John, 810 mil millones de bytes llegan a alrededor de 754 GB. ¿Qué hay de particionar su disco en múltiples particiones de 700 GB, luego ejecutar el openssl randcomando en cada partición en reversa comenzando desde sda5 o lo que sea y trabajando hacia atrás hasta sda1 y finalmente sda?
jia103

6

El openssl no parecía funcionar para mí. Obtuve "opciones desconocidas" y otros problemas con las soluciones proporcionadas. Así que terminé yendo con el programa fio.

fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0

Lo que parece estar tomando 3 horas para hacer 19 TB en 24 discos duros. Entonces, aproximadamente 1,800 MB / s

smp-016:~ # fdisk -l /dev/md0
Disk /dev/md0: 18890.1 GB, 18890060464128 bytes

smp-016:~ # fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0
fill: (g=0): rw=write, bs=512M-512M/512M-512M/512M-512M, ioengine=libaio, iodepth=4
fio-2.2.10
Starting 1 process
Jobs: 1 (f=1): [W(1)] [2.7% done] [0KB/1536MB/0KB /s] [0/3/0 iops] [eta 03h:01m:11s]

Espero que estos sean datos aleatorios. La página de manual dice fio "Predeterminado: llenar buffers con datos aleatorios". http://linux.die.net/man/1/fio

No lo estoy haciendo con fines de seguridad / encriptación, solo estoy tratando de asegurarme de que mis pruebas de lectura posteriores sean datos reales y no solo ceros. Este mismo comando fio podría usarse para el preacondicionamiento SSD / NVMe. Como el solo uso de / dev / zero puede llevar a una compresión de nivel de disco "trampa" cuánto se escribe realmente. Aunque le agregaría una -loops=2bandera, si es un SSD nuevo para la evaluación comparativa.

Si desea que sea seguro, puede usar la -randrepeat=bool opción, ya que eso alternará "Sembrar el generador de números aleatorios de una manera predecible para que los resultados se repitan en las ejecuciones. Valor predeterminado: verdadero", pero todavía no seguro de lo seguro que sería.

Además, algunos discos duros de clase empresarial son SED (unidades de autocifrado) y le permitirán girar la clave de cifrado para borrar de forma instantánea y segura todos los datos escritos.

Por último, he usado DBAN (también conocido como Darik's Boot and Nuke), que tiene opciones de arranque de CD y USB y "es un proyecto de código abierto alojado en SourceForge. El programa está diseñado para borrar de forma segura un disco duro hasta que sus datos estén permanentemente eliminado y ya no es recuperable "


1
El tamaño = 100% no funcionó para mí, pero fill_device = 1 (o fill_fs = 1) sí.
d.jamison

Creo que eso dependería si le das un dispositivo de nivel de bloque o un sistema de archivos para llenar. Con el dispositivo de nivel de bloque, sabe cuán grande es y el tamaño es un porcentaje del tamaño del dispositivo. Donde como el fill_device va hasta que obtiene un error completo del dispositivo. Creo que el indicador fill_device puede no sobrescribir ningún archivo, solo espacio no utilizado. No lo he puesto a prueba, ya que generalmente evito los sistemas de archivos a menos que sea necesario cuando hago pruebas de dispositivos.
TaylorSanchez

6

Puedes hacer que OpenSSL encripte /dev/zero con una contraseña aleatoria, lo que proporciona datos pseudoaleatorios decentes muy rápido (si su CPU admite acelerarlo).

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

Podrías canalizar esto pv para obtener progreso / ETA. Los comandos que estoy ejecutando en este momento (en un shell de raíz) son:

DISK="sda"
DISKSIZE=$(</proc/partitions awk '$4=="'"$DISK"'" {print sprintf("%.0f",$3*1024)}')
apt-get install pv
openssl enc -aes-256-ctr -nosalt \
  -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" \
  < /dev/zero |
  pv --progress --eta --rate --bytes --size "$DISKSIZE" |
  dd of=/dev/"$DISK" bs=2M

Tengo esta idea de esta respuesta , después de tener el mismo problema que John irracional , quien comentó sobre la respuesta de Gilles arriba. Esto aumentó mi velocidad de borrado a mi nueva matriz RAID de 11 MB / s a ​​alrededor de 300 MB / s, reduciendo lo que iba a llevar una semana a 10 horas.

Agregaré que deberías poder usar openssl rand #of_bytes lugar de la openssl enc ...declaración más complicada anterior, pero hay un error que permitirá sslproducir solo 16 MB de salida. (Este error se archivó en enero de 2016).

Y, según la respuesta a esta pregunta , y continuando asumiendo que la CPU es el cuello de botella, puede ser posible aumentar aún más la velocidad ejecutando múltiples opensslprocesos paralelos en núcleos separados, combinándolos usando un FIFO.


No estoy seguro de que la edición fuera necesaria. Otras respuestas a esta pregunta sugieren openssl rand.
tembloroso

2
Benchmark:: dd if=/dev/urandom18MiB / s openssl enc,: ~ 180MiB / s fio,: 169MiB / s, openssl randsin soporte> 754GB. Tenga en cuenta que si usted también quiere cálculo de tamaño automático, utilice: openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt </dev/zero | pv --progress --eta --rate --bytes --size $(</proc/partitions awk '$4=="sda" {print sprintf("%.0f",$3*1024)}') | dd of=/dev/sda bs=2M. Cuidado, sdaestá presente dos veces en este comando.
KrisWebDev

0

Completando la respuesta de Marco, lo que necesita es un generador de números aleatorios más rápido.

Utiliza un programa simple que hace eco de números aleatorios de una buena biblioteca boost::randomy usa ese en dd.

Si elige boost, puede usar este ejemplo, cambiando la experimentfunción a sus necesidades.


¿Cuánto más rápido es la solución de impulso en su sistema? Un punto de referencia rápido no científico en mi máquina produce exactamente la misma velocidad que /dev/urandom.
Marco

boost::randomno ofrece un Crypto RNG, ¿verdad? Si va a usar un RNG no criptográfico, también podría usar ceros: al menos no tendrá una ilusión de seguridad.
Gilles 'SO- deja de ser malvado'

No puedo ser específico acerca de cuánto más rápido boost::randomson los generadores, la única forma de saberlo con certeza es medir su algoritmo más rápido/dev/urandom
RSFalcon7

0

El cuello de botella no es ni el tamaño del bloque ni el disco duro, sino la lenta generación de números pseudoaleatorios. /dev/urandomes en magnitud más rápido en comparación con /dev/randomya que no está bloqueando en un grupo de baja entropía.

Puede confirmar esto midiendo la salida sin formato de sus números pseudoaleatorios:

pv /dev/urandom >/dev/null

Esta velocidad será mucho más lenta que la velocidad de escritura de su disco duro. Una solución correcta depende totalmente de su nivel de seguridad requerido. Si necesita alta seguridad, use un generador aleatorio de hardware rápido o acepte la velocidad lenta. Si sus necesidades de seguridad no son tan altas, podría capturar unas pocas docenas de MiB de datos y escribir esa cadena repetidamente en la unidad. O tal vez incluso escribir ceros desde /dev/zeroes una opción.

Resumen

/dev/random - seguro, muy lento
/dev/urandom- menos seguro¹,
hardware lento RNG - seguro, rápido, muy costoso
( /dev/zero - no aleatorio en absoluto, muy rápido)

¹ Según ¿Es seguro un rand de / dev / urandom para una clave de inicio de sesión? /dev/urandomes tan seguro como /dev/random. Gracias a Gilles por señalar esto.


El ya esta usando urandom.
Patrick

En efecto. Mi punto es que incluso el urandom es demasiado lento para sus necesidades, por eso necesita una solución diferente al urandom.
Marco


@Gilles Gracias por el enlace. La página del manual dice claramente: ... Como resultado, si no hay suficiente entropía en el grupo de entropía, los valores devueltos son teóricamente vulnerables a un ataque criptográfico ... Es por eso que lo clasifiqué como menos seguro.
Marco

0

Estaba tratando de llenar un HDD USB externo de 4TB con dd if=/dev/urandom of=/dev/sdX status=progressque era demasiado lento (independientemente de la bs=configuración), y parece que openssltiene un límite en la cantidad de datos aleatorios que saldrá (al menos para la versión 1.0.2p). La mejor opción que encontré fue el comentario de frostschutz para usar shred, como en:

shred -v -n 1 /dev/sdX

Asegúrese de usar lo -n 1contrario, de forma predeterminada se escribirá el dispositivo 3 veces (más el -vque muestra el progreso). No creo que la calidad de los números pseudoaleatorios sea ​​tan alta, pero es suficiente para mí preparar un HDD portátil de gran capacidad para el cifrado.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.