
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 del disco duro.
Sin embargo, cuando intenté usarlo dd if=/dev/urandom of=/dev/sda
en el pasado, la ETA parecía estar en el orden de los días. Vi algo sobre el uso badblocks
en lugar de urandom, pero eso no pareció ayudar mucho. Sólo me gustaría saber si hay alguna forma que pueda ayudarme a acelerar esto, como opciones dd
o algo más que me pueda faltar, o si la velocidad es solo una limitación del HD.
Respuesta1
dd if=/dev/urandom of=/dev/sda
, osimplemente cat /dev/urandom >/dev/sda
, no es la forma más rápida de llenar un disco con datos aleatorios. Linux /dev/urandom
no es el RNG criptográfico más rápido que existe.¿Existe 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 prácticamente inútil. En primer lugar, 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 dejaba una pequeña carga residual que podía recuperarse con hardware algo costoso; Fueron necesarias varias pasadas de sobrescritura con datos aleatorios (el “borrado de Gutmann”). Hoy en día, incluso una sola pasada de sobrescritura con ceros deja datos que, de manera realista, no se pueden recuperar ni siquiera en condiciones de laboratorio.
Cuando cifra una partición, no es necesario llenar el disco con datos aleatorios para garantizar la confidencialidad de los datos cifrados. Sólo es útil si necesita que el espacio utilizado por los datos cifrados sea indistinguible del espacio no utilizado. La creación de un volumen cifrado sobre un contenedor no aleatorio revela qué bloques de disco han sido utilizados alguna vez por el volumen cifrado. Esto da una buena pista sobre el tamaño máximo del sistema de archivos (aunque a medida que pase el tiempo será una aproximación cada vez peor), y poco más.
Respuesta2
Puede hacer que OpenSSL cifre /dev/zero
con una contraseña aleatoria, proporcionando datos pseudoaleatorios decentes muy rápido (si su CPU admite la aceleración).
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 el progreso/ETA. Los comandos que estoy ejecutando ahora (en un shell 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
Saqué esta idea deesta respuesta, después de tener el mismo problema queJuan irracional, OMScomentósobre la respuesta de Gilles anterior. Esto aumentó mi velocidad de limpieza en mi nueva matriz RAID de 11 MB/s a alrededor de 300 MB/s, reduciendo lo que iba a tomar una semana a 10 horas.
Agregaré que deberías poder usar en lugar de la declaración más complicada anterior, pero hay un error que permitirá producir solo 16 MB de salida. (Este error se presentó en enero de 2016).openssl rand #of_bytes
openssl enc ...
ssl
Y, según la respuesta aesta pregunta, y si seguimos asumiendo que la CPU es el cuello de botella, es posible aumentar aún más la velocidad ejecutando múltiples openssl
procesos paralelos en núcleos separados, combinándolos mediante un FIFO.
Respuesta3
El openssl no pareció funcionar para mí. Recibí "opciones desconocidas" y otros problemas con las soluciones proporcionadas. Así que terminé eligiendo el programa fio.
fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0
Lo que parece tardar 3 horas en hacer 19 TB en 24 discos duros. 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 realmente datos aleatorios. La página de manual dice fio "Predeterminado: llenar los buffers con datos aleatorios".http://linux.die.net/man/1/fio
No lo hago con fines de seguridad/cifrado, solo intento asegurarme de que mis pruebas de lectura posteriores sean datos reales y no solo 0. Este mismo comando fio podría usarse para el preacondicionamiento de SSD/NVMe. Como simplemente usar /dev/zero puede llevar a que la compresión a nivel de disco "engañe" cuánto se escribe realmente. Aunque le agregaría una -loops=2
bandera, si es un SSD nuevo para realizar pruebas comparativas.
Si desea que sea seguro, puede utilizar la -randrepeat=bool
opción, ya que alternará "Sembrar el generador de números aleatorios de forma predecible para que los resultados se puedan repetir en todas las ejecuciones. Valor predeterminado: verdadero", pero todavía no lo estoy. seguro de lo seguro que sería.
Además, algunos discos duros de clase empresarial que existen son SED (unidades de cifrado automático) y le permitirán girar la clave de cifrado para borrar de forma instantánea y segura todos los datos escritos.
Por último, en el pasado he usado DBAN (también conocido como Darik's Boot and Nuke), que tiene opciones de arranque desde 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 sean permanentes". eliminado y ya no es recuperable"
Respuesta4
Para completar la respuesta de Marco, lo que necesitas es un generador de números aleatorios más rápido.
Usas un programa simple que repite números aleatorios de una buena biblioteca como boost::random
y usas ese en dd
.
Si eliges boost, puedes usarestePor ejemplo, cambiando la experiment
función según sus necesidades.