¿Hay una alternativa a / dev / urandom?

21

¿Hay alguna forma más rápida que / dev / [u] random? A veces, necesito hacer cosas como

cat / dev / urandom> / dev / sdb

Los dispositivos aleatorios son "demasiado" seguros y desafortunadamente demasiado lentos para eso. Sé que existen wipeherramientas similares para la eliminación segura, pero supongo que también hay algunos medios integrados para eso en Linux.

cgp
fuente
Equivalente en StackOverflow: stackoverflow.com/questions/841356/…
David Z
posible duplicado de la forma más rápida y segura de borrar un disco duro?
Kyle Brandt
1
¿No es una mejor manera de hacer esto? ¿Posiblemente un candidato para el premio UUoC?
Tom O'Connor

Respuestas:

12

Si está buscando hacer un borrado "seguro" de un disco duro (o archivo), debe mirar la utilidad de trituración.

Como señalan los carteles anteriores, los dispositivos aleatorios / dev / * están destinados a ser utilizados como una fuente de pequeños fragmentos de datos aleatorios.

MikeyB
fuente
1
Según la página del manual, 'shred' usa / dev / urandom. Entonces, aunque es una buena respuesta para limpiar el disco, no ofrecerá una aceleración sobre ninguna otra técnica de lectura de / dev / urandom. (Otro consejo si se utiliza 'triturar': la mayoría de la gente probablemente serán más felices con 1-2 pases, en lugar de la cuenta predeterminada gigante, de modo que una toallita no tomar días.)
gojomo
44
En realidad, triturar es mucho más rápido que / dev / urandom. Supongo que proporciona sus propios datos pseudoaleatorios usando / dev / urandom o / dev / random como semilla.
thomasrutter
24

Desafortunadamente, Linux tiene una mala implementación de urandom. Puede usar aes256-ctr con una clave aleatoria y obtener varios cientos de megabytes de pseudoaleatoriedad por segundo, si su CPU admite AES-NI (aceleración de hardware). Tengo muchas ganas de cambiar urandom a un enfoque moderno también.

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

Este cachorro tiene 1.0 GB / s en mi caja (en comparación con 14 MB / s de / dev / urandom). Utiliza urandom solo para crear una contraseña aleatoria y luego realiza un cifrado muy rápido de / dev / zero con esa clave. Esto debería ser un PRNG criptográficamente seguro, pero no haré garantías.

Tronic
fuente
Gracias por esta increíble respuesta, pude subir de 9.5 MB / s con / dev / urandom a más de 120 MB / s con openssl.
RDA
Excepto por la primera declaración de que Linux tiene una mala implementación de urandom , apruebo esta respuesta. Lo suficientemente bueno como para limpiar (o llenar) un disco duro antes del cifrado.
Vikrant Chaudhary
55
Pase por pvun buen indicador de progreso. openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero | pv -pterb > /dev/sdb.
Vikrant Chaudhary
@VikrantChaudhary urandom produce números pseudoaleatorios de alta calidad, claro, pero eso no es excusa para ser lento. El modo de contador AES es mucho más rápido y es difícil discutir cómo sería menos seguro que / dev / urandom.
Perseidas
1
Sólo para añadir a la pvrecomendación, se pueden canalizar al pv -pterb -s $(blockdev --getsize64 /dev/sdb) >/sdbtener pvque mostrar el progreso hacia terminar la escritura.
asciiphil
7

En una prueba rápida con Ubuntu 8.04 en un Thinkpad T60p con CPU T2500, 1 GB de datos aleatorios de 3 a 4 openssl randveces más rápido que /dev/urandom. Es decir,

time cat /dev/urandom | head -c 1000000000 > /dev/null

... fue alrededor de 4 minutos mientras ...

time openssl rand 1000000000 | head -c 1000000000 > /dev/null

... fue poco más de 1 minuto.

No estoy seguro de si hay una diferencia en la calidad aleatoria, pero cualquiera de los dos probablemente esté bien para borrar HD.

gojomo
fuente
5

Veo muchas respuestas que dicen que usar datos aleatorios no es importante. Eso es bastante cierto si todo lo que está tratando de hacer es limpiar la unidad, pero no tanto si la está limpiando en preparación para el cifrado del disco.

Si llena un dispositivo con datos no aleatorios, coloque una partición cifrada en él y podría tener un problema. La parte de la unidad que almacena datos cifrados se destacará del resto de la unidad, porque los datos cifrados se verán al azar y el resto no. Esto puede usarse para determinar información sobre el disco criptográfico que podría usarse para descifrarlo. El siguiente enlace explica la teoría detrás de cómo funcionan algunos de los ataques más comunes y cómo defenderse de ellos (en Linux, de todos modos).

Configuración de cifrado del disco duro de Linux

usuario104021
fuente
1
Muy cierto. Con discos relativamente modernos (> 20 GB) cualquier sobrescritura de una sola pasada se borrará lo suficiente. Incluso la NSA y similares se verían en apuros para obtener una cantidad significativa de datos del disco. Y es muy costoso. Piensa $ 100.000 por megabyte. El comentario sobre el cifrado es muy cierto. Desea que las partes no utilizadas del disco se vean "tan aleatorias" como las partes utilizadas.
Tonny
¿El software de cifrado de su dispositivo no aleatoriza todo el disco?
Nathan Garabedian
5

Si necesita limpiar de forma segura un HD, hay una herramienta muy poderosa: DBAN

Arg
fuente
5

Si desea borrar un dispositivo de bloque enorme, entonces lo encuentro más robusto de usar ddy el mapeador de dispositivos en lugar de la redirección de salida de datos aleatorios. Lo siguiente se asignará /dev/sdbpara /dev/mapper/deviceToBeEraseddesencriptar y desencriptar de forma transparente en el medio. Para llenar el dispositivo en el extremo cifrado, los ceros se copian en el lado de texto plano del mapeador ( /dev/mapper/deviceToBeErased).

cryptsetup --cipher aes-xts-plain64 --key-file /dev/random --keyfile-size 32 create deviceToBeErased /dev/sdb
dd if=/dev/zero of=/dev/mapper/deviceToBeErased bs=1M

Se /dev/sdbgarantiza que los datos cifrados no se pueden distinguir de los datos aleatorios si no hay una debilidad grave en AES. La clave utilizada se toma /dev/random(no se preocupe, solo usa 32 bytes).

Perseidas
fuente
2

Cuanto más rápida sea su herramienta, menos seguro será el resultado. Generar buena aleatoriedad lleva tiempo.

De todos modos, podría usar algo como dd if = / dev / zero of = / dev / sdb , pero obviamente eso no será aleatorio, simplemente se borrará mucho más rápido.

Otra opción podría ser utilizar este método / sbin / badblocks -c 10240 -s -w -t random -v / dev / sdb es más rápido que urandom, pero el PRNG de badblocks es menos aleatorio.

Zoredache
fuente
1
y sinceramente, esto es MUCHO de seguridad para el disco
warren
La sobreescritura múltiple, como lo hace la trituración, lleva tiempo y proporciona una mayor seguridad que una sobrescritura de datos aleatorios "perfectamente".
Pausado hasta nuevo aviso.
"Cuanto más rápido sea su herramienta, menos seguro será el resultado. Generar una buena aleatoriedad lleva tiempo". - Eso no es cierto. Un generador de números aleatorios (pseudo) en modo contador AES se analiza mucho mejor y sus órdenes de magnitud son más rápidos que / dev / urandom. (Ver la respuesta de Tronic.)
Perseidas
2

/dev/random utiliza una gran cantidad de entropía del sistema y, por lo tanto, produce solo un flujo de datos lento.

/dev/urandom es menos seguro y más rápido, pero aún está orientado a fragmentos de datos más pequeños: no está destinado a proporcionar un flujo continuo de números aleatorios de alta velocidad.

Debe hacer un PRNG de su propio diseño y sembrarlo con algo de /dev/randomo /dev/urandom. Si lo necesita un poco más al azar, siembre periódicamente, cada pocos MB (o lo que sea la longitud de su prng). Obtener 4 bytes (valor de 32 bits) de urandom o random es lo suficientemente rápido como para que pueda hacer esto cada 1k de datos (reinicializar su prng cada 1k) y obtener resultados muy aleatorios, mientras que va muy, muy, rápidamente.

-Adán

Adam Davis
fuente
77
Es muy raro que alguien pueda escribir su propio generador de números aleatorios que sea mejor que los que ya están disponibles. La mayoría de las veces, el resultado es un patrón predecible y una falsa sensación de seguridad. Recomendaría usar shred en una unidad a través de su entrada / dev o destrucción física muy completa.
Pausado hasta nuevo aviso.
Estoy de acuerdo. Usaría shred, que por defecto usa urandom (que francamente no encuentro lento). Como nota, es posible usar / dev / random con shred (especificando --random-source = / dev / random) si es muy paciente.
Matthew Flaschen
2

Si desea borrar un disco duro rápidamente, escríbale datos no aleatorios. Esto no es menos seguro que usar datos aleatorios. De cualquier manera, cuando se conecta a una computadora, los datos originales no se pueden leer. Sobrescribir datos del disco duro: la gran controversia de limpieza muestra que los datos originales tampoco se pueden leer con un microscopio.

Sciurus
fuente
2

Formatee con LUKS y dd sobre el volumen cifrado. Luego use / dev / urandom para borrar el encabezado LUKS.

Si tiene soporte de hardware AES, esta es una solución muy rápida.

Brevemente:

cryptsetup luksFormat /dev/sdX
cryptsetup luksOpen /dev/sdX cryptodev
dd if=/dev/zero bs=1M of=/dev/mapper/cryptodev
cryptsetup luksClose cryptodev
# wipe the luks header.  Yes, it uses /dev/urandom but only for 2MB of data:
dd if=/dev/urandom bs=1M count=2 of=/dev/sdX

¡hecho!

Vea mi blog: llene rápidamente un disco con bits aleatorios (sin / dev / urandom)

Eric Wheeler
fuente
¿Por qué te molestas con LUKS si todo lo que quieres hacer es sobrescribir el dispositivo? Plain dm-crypt ("modo simple" de cryptsetup) es mucho más fácil de usar para eso.
Perseidas
2

Si desea borrar un disco duro, dd no elimina el contenido de los sectores reasignados, y es muy lento si el disco duro está muriendo. En su lugar, puede utilizar la función de borrado integrada de unidades, que se ha estandarizado durante mucho tiempo.

En este ejemplo, estoy borrando un disco duro mecánico de 500 GB en solo 102 minutos. Incluso cuando está lleno de sectores reasignados:

root@ubuntu:~# hdparm --security-set-pass Eins /dev/sdaj
security_password="Eins"

/dev/sdaj:
 Issuing SECURITY_SET_PASS command, password="Eins", user=user, mode=high
root@ubuntu:~# time hdparm --security-erase-enhanced Eins /dev/sdaj
security_password="Eins"

/dev/sdaj:
 Issuing SECURITY_ERASE command, password="Eins", user=user

real    102m22.395s
user    0m0.001s
sys     0m0.010s

root@ubuntu:~# smartctl --all /dev/sdaj | grep Reallocated
  5 Reallocated_Sector_Ct   0x0033   036   036   036    Pre-fail Always   FAILING_NOW 1327 

Puede ver más detalles en ata.wiki.kernel.org , sin embargo, su ejemplo no usa --security-erase-mejorado, que es necesario para eliminar los sectores reasignados antes mencionados.

Per Mejdal Rasmussen
fuente
1

En la práctica, probablemente no sea necesario sembrar todo el disco desde una secuencia aleatoria continua.

Puede crear una porción modesta de datos aleatorios y luego repetir eso una y otra vez en el disco.

Solo asegúrese de que esa porción de datos no sea un múltiplo del tamaño de bloque normal del disco, para asegurarse de que no termine sobrescribiendo bloques de datos correlacionados con exactamente el mismo bit de datos aleatorios. Un tamaño de fragmento que es un número primo en el rango de ~ 1 MB debería funcionar bien.

Para mayor seguridad, solo hazlo varias veces más, usando un tamaño de fragmento diferente cada vez.

Alnitak
fuente
1

La utilidad 'triturar' es fácil y rápida. Si los atributos SMART de la unidad indican cero sectores reasignados, es probable que 'triturar' sea lo suficientemente seguro.

Sin embargo, si la unidad tiene sectores reasignados, los datos de los sectores dañados no se sobrescribirán. Si las ubicaciones dañadas contenían datos confidenciales antes de ser reasignadas, 'triturar' puede no ser lo suficientemente bueno. Los sectores "defectuosos" pueden leerse restableciendo el mapa de asignación de la unidad y (repetidamente) leyéndolos.

La capacidad de restablecer el mapa de asignación de sectores defectuosos varía según el fabricante y el modelo de unidad.

drok
fuente
0

Si todo lo que quiere hacer es sobrescribir el disco, entonces no importa lo que use porque cualquier cosa superará a cualquier cosa menos que un laboratorio forense y no confiaría en nada menos que estropear el disco para detener ese nivel de recursos .

Simplemente use una fuente no aleatoria como todos ceros o unos o un patrón repetitivo como (creo que esto funcionará)

(head -c 4096 /dev/urandom; cat /dev/sdb/) > /dev/sdb
BCS
fuente
Ese puede ser el caso, pero a veces no puede convencer a la gerencia de que la seguridad impartida por una escritura aleatoria no es realmente mayor que usar todos los ceros dado que el nivel de tecnología requerido para recuperar datos es el mismo para ambos escenarios. En este caso, a menudo es mejor cumplir con el requisito construyendo su propio generador rápido de números aleatorios.
Adam Davis