Un moyen rapide de randomiser la HD?


14

J'ai lu comment sécuriser les disques durs pour le cryptage, et l'une des étapes consiste à écrire des bits aléatoires sur le lecteur, afin de rendre les données cryptées indiscernables du reste des données sur le disque dur.

Cependant, quand j'ai essayé d'utiliser dd if=/dev/urandom of=/dev/sdadans le passé, l'ETA cherchait à être de l'ordre des jours. J'ai vu quelque chose à propos de l'utilisation badblocksà la place de l'andandom, mais cela ne m'a pas beaucoup aidé. Je voudrais juste savoir s'il existe des moyens qui pourraient m'aider à accélérer cela, comme des options pour ddou autre chose qui pourrait me manquer, ou si la vitesse n'est qu'une limitation de la HD.


Modifiez la taille de votre bloc en quelque chose de plus convivial pour les disques durs. dd bs=1Mpar exemple.
Patrick

Quelle vitesse aviez-vous? L'écriture d'un disque dur entier de 3 To (par exemple) prend du temps. Vérifiez également iostat -kx 10le pourcentage d'occupation du lecteur.
derobert

5
shred -v -n 1 /dev/overwritethisest rapide. Il s'agit du seul cas où shredest réellement utile pour quelque chose.
frostschutz

@derobert: Je ne peux pas vraiment dire avec certitude à quelle vitesse il a été, mais je suis parti pendant quelques heures, je suis revenu, et c'était terminé à environ 10% pour mon disque dur interne 500G la première fois que j'ai essayé. Merci pour la pointe "iostat" btw
bitflips

@ Patrick: J'ai essayé bs = 4M en quelque sorte à l'aveuglette, car je l'ai vu sur le guide pour savoir comment mettre le CD Arch sur une clé USB. Cela a aidé légèrement, mais c'était encore assez lent.
bitflips

Réponses:


14

dd if=/dev/urandom of=/dev/sda, ou tout simplement cat /dev/urandom >/dev/sda , n'est pas le moyen le plus rapide de remplir un disque avec des données aléatoires. Linux /dev/urandomn'est pas le RNG cryptographique le plus rapide du marché. Existe-t-il une alternative à / dev / urandom? a quelques suggestions. En particulier, OpenSSL contient un PRNG cryptographique plus rapide:

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

Notez qu'en fin de compte, qu'il y ait une amélioration ou non dépend de quelle partie est le goulot d'étranglement: le CPU ou le disque.

La bonne nouvelle est que le remplissage du disque avec des données aléatoires est pratiquement inutile. Tout d'abord, pour dissiper un mythe commun, essuyer avec des zéros est tout aussi bon sur le matériel d'aujourd'hui . Avec la technologie du disque dur des années 80, l'écrasement d'un disque dur avec des zéros a laissé une petite charge résiduelle qui pourrait être récupérée avec du matériel un peu cher; plusieurs passages d'écrasement avec des données aléatoires (le «chiffon de Gutmann») ont été nécessaires. Aujourd'hui, même une seule passe d'écrasement avec des zéros laisse des données qui ne peuvent pas être récupérées de manière réaliste même dans des conditions de laboratoire.

Lorsque vous chiffrez une partition, il n'est pas nécessaire de remplir le disque avec des données aléatoires pour la confidentialité des données chiffrées. Il n'est utile que si vous avez besoin de rendre l'espace utilisé par les données chiffrées indiscernable de l'espace inutilisé. La création d'un volume chiffré au-dessus d'un conteneur non aléatoire révèle quels blocs de disque ont déjà été utilisés par le volume chiffré. Cela donne une bonne indication de la taille maximale du système de fichiers (bien qu'avec le temps, cela deviendra une approximation de pire en pire), et un peu plus.


4
Gutmann est un mythe dans son intégralité, je ne pense pas que cela ait jamais été fait pour un disque dur des années 80 non plus. L'ironie, c'est qu'avec les lecteurs qui deviennent plus intelligents, vous devez en fait utiliser des données aléatoires de nos jours pour vous assurer que le lecteur est forcé d'écrire, plutôt que de libérer le secteur (couper) ou de compresser les données. Les zéros ne sont bons que s'ils sont réellement écrits.
frostschutz

1
@mellowmaroon Oui, cat /dev/zeroc'est presque toujours suffisant. Ce n'est pas suffisant si vous voulez masquer l'espace libre sur le volume chiffré.
Gilles 'SO- arrête d'être méchant'

1
@mellowmaroon C'est à peu près inutile. Un écouteur saura que vous avez au plus X Mo de données (et peut-être beaucoup moins, car l'espace autrefois utilisé mais maintenant libre ne se distingue pas de l'espace utilisé), alors quoi? L'emplacement de l'espace libre peut également révéler le type de système de fichiers (copies de superbloc); c'est rarement un problème (il est généralement exposé en texte clair /etc/fstab, sauf si vous avez chiffré la partition racine, et même alors, il n'y a pas un si grand nombre d'options plausibles).
Gilles 'SO- arrête d'être méchant'

2
@Gilles Le problème que j'ai rencontré dans Ubuntu 13.10 est qu'il openssl randsemble avoir une limite supérieure sur le nombre d'octets qu'il va générer. Si vous dépassez cette limite, par exemple «openssl rand 810000000000 , 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 openssl» pour produire autant d'octets aléatoires.
John irrationnel

1
Pour le problème de limite supérieure irrationnel de John, 810 milliards d'octets sortent à environ 754 Go. Que diriez-vous de partitionner votre disque en plusieurs partitions de 700 Go, puis d'exécuter la openssl randcommande sur chaque partition en sens inverse à partir de sda5 ou autre et de travailler en arrière vers sda1 et enfin sda?
jia103

6

L'opensl ne semblait pas fonctionner pour moi. J'ai obtenu des «options inconnues» et d'autres problèmes avec les solutions fournies. J'ai donc fini par suivre le programme fio.

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

Ce qui semble prendre 3 heures pour faire 19 To sur 24 disques durs. Donc, environ 1800 Mo / 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]

J'espère que ce sont en fait des données aléatoires. La page de manuel indique fio "Par défaut: remplir les tampons avec des données aléatoires." http://linux.die.net/man/1/fio

Je ne le fais pas à des fins de sécurité / cryptage, j'essaie simplement de m'assurer que mes tests de lecture ultérieurs sont des données réelles et pas seulement des 0. Cette même commande fio peut être utilisée pour le préconditionnement SSD / NVMe. Comme l'utilisation de / dev / zero peut conduire à une compression au niveau du disque "tricher" combien est réellement écrit. Bien que j'ajouterais un -loops=2indicateur, s'il s'agit d'un nouveau SSD pour l'analyse comparative.

Si vous vouliez qu'il soit sécurisé, vous pourrez peut-être utiliser l' -randrepeat=bool option, car cela basculera "Amorcer le générateur de nombres aléatoires de manière prévisible afin que les résultats soient reproductibles d'une exécution à l'autre. Par défaut: vrai.", Mais je ne le suis toujours pas certain que ce serait sûr.

De plus, certains disques durs de classe entreprise sont équipés de disques SED (Self Encrypting Drives) et vous permettront de faire tourner la clé de cryptage pour effacer instantanément et en toute sécurité toutes les données écrites.

Enfin, j'ai utilisé dans le passé DBAN (alias Darik's Boot et Nuke), qui a des options de démarrage CD et USB et "est un projet open source hébergé sur SourceForge. Le programme est conçu pour effacer en toute sécurité un disque dur jusqu'à ce que ses données soient définitivement supprimé et non récupérable "


1
La taille = 100% n'a pas fonctionné pour moi, mais fill_device = 1 (ou fill_fs = 1) l'a fait.
d.jamison

Je pense que cela dépendra si vous lui donnez un périphérique de niveau bloc ou un système de fichiers à remplir. Avec le périphérique de niveau bloc, il sait sa taille et sa taille est un pourcentage de la taille du périphérique. Où en tant que fill_device va jusqu'à ce qu'il obtienne une erreur de périphérique complet. Je pense que le drapeau fill_device ne peut pas écraser de fichiers, juste de l'espace inutilisé. Je n'ai pas mis cela à l'épreuve, car j'évite généralement les systèmes de fichiers, sauf si cela est nécessaire lorsque je fais des tests de périphérique.
TaylorSanchez

6

Vous pouvez demander à OpenSSL de chiffrer /dev/zeroavec un mot de passe aléatoire, ce qui donne des données pseudo-aléatoires décentes très rapidement (si votre CPU prend en charge l'accélération).

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

Vous pouvez passer par là pvpour obtenir des progrès / ETA. Les commandes que j'exécute en ce moment (dans un shell root) sont:

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

J'ai eu cette idée de cette réponse , après avoir eu le même problème que John irrationnel , qui a commenté la réponse de Gilles ci-dessus. Cela a augmenté ma vitesse de nettoyage de ma nouvelle matrice RAID de 11 Mo / s à environ 300 Mo / s, ce qui prenait une semaine à 10 heures.

J'ajouterai que vous devriez pouvoir utiliser plutôt que la déclaration plus compliquée ci-dessus, mais il y a un bogue qui ne permettra de produire que 16 Mo de sortie. (Ce bug a été déposé, janvier 2016.)openssl rand #of_bytesopenssl enc ...ssl

Et, selon la réponse à cette question , et en continuant à supposer que le CPU est le goulot d'étranglement, il peut être possible d'augmenter encore la vitesse en exécutant plusieurs opensslprocessus parallèles sur des cœurs séparés, en les combinant à l'aide d'un FIFO.


Je ne sais pas si la modification était nécessaire. D'autres réponses à cette question suggèrent openssl rand.
tremby

2
Indice de référence:: dd if=/dev/urandom18 Mo / s openssl enc,: ~ 180 Mo / s fio,: 169 Mo / s, openssl randpas de prise en charge> 754 Go. Notez que si vous voulez également le calcul automatique de taille, utilisez: 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. Attention, sdaest présent deux fois dans cette commande.
KrisWebDev

0

Pour compléter la réponse de Marco, vous avez besoin d'un générateur de nombres aléatoires plus rapide.

Vous utilisez un programme simple qui fait écho à des nombres aléatoires d'une bonne bibliothèque boost::randomet utilisez celui-ci dans dd.

Si vous choisissez boost, vous pouvez utiliser cet exemple en modifiant la experimentfonction selon vos besoins.


À quel point la solution boost est-elle plus rapide sur votre système? Une référence non scientifique rapide sur ma machine donne exactement la même vitesse que /dev/urandom.
Marco

boost::randomn'offre pas de crypto RNG, n'est-ce pas? Si vous allez utiliser un RNG non crypto, vous pourriez aussi bien utiliser des zéros: au moins, vous n'aurez pas l'illusion de sécurité.
Gilles 'SO- arrête d'être méchant'

Je ne peux pas être précis sur la vitesse des boost::randomgénérateurs, la seule façon de savoir avec certitude est de mesurer leur algorithme le plus rapide par rapport à/dev/urandom
RSFalcon7

0

Le goulot d'étranglement si ni la taille du bloc ni le disque dur, mais la lente génération de nombres pseudo-aléatoires. /dev/urandomest en magnitude plus rapide que /dev/randomcar il ne bloque pas sur un pool à faible entropie.

Vous pouvez le confirmer en mesurant la sortie brute de vos nombres pseudo-aléatoires:

pv /dev/urandom >/dev/null

Ce taux sera beaucoup plus lent que le taux d'écriture de votre disque dur. Une solution correcte dépend totalement de votre niveau de sécurité requis. Si vous avez besoin d'une haute sécurité, utilisez un générateur aléatoire matériel rapide ou acceptez la vitesse lente. Si vos besoins de sécurité ne sont pas si élevés, vous pouvez capturer quelques dizaines de Mio de données et écrire cette chaîne à plusieurs reprises sur le lecteur. Ou peut-être même que l'écriture de zéros /dev/zeroest une option.

Sommaire

/dev/random - sécurisé, très lent
/dev/urandom- moins sécurisé¹,
RNG matériel lent - sécurisé, rapide, très cher
( /dev/zero - pas aléatoire du tout, très rapide)

¹ Selon Un rand de / dev / urandom est-il sécurisé pour une clé de connexion? /dev/urandomest aussi sûr que /dev/random. Merci à Gilles de l'avoir signalé.


Il utilise déjà urandom.
Patrick

En effet. Mon point est que même urandom est trop lent pour ses besoins, c'est pourquoi il a besoin d'une solution différente de urandom.
Marco


@Gilles Merci pour le lien. La page de manuel indique clairement: … Par conséquent, s'il n'y a pas suffisamment d'entropie dans le pool d'entropie, les valeurs renvoyées sont théoriquement vulnérables à une attaque cryptographique… C'est pourquoi je l'ai classé comme moins sécurisé.
Marco

0

J'essayais de remplir un disque dur USB externe de 4 To avec dd if=/dev/urandom of=/dev/sdX status=progressbeaucoup trop de lenteur (quels que soient les bs=paramètres), et il semble que cela opensslait un plafond sur la quantité de données aléatoires qu'il produira (au moins pour la version 1.0.2p). La meilleure option que j'ai trouvée était le commentaire de frostschutz à utiliser shred, comme dans:

shred -v -n 1 /dev/sdX

Assurez-vous d'utiliser le -n 1sinon il sera écrit par défaut sur l'appareil 3 fois (plus le -vqui montre la progression). Je ne pense pas que la qualité des nombres pseudo-aléatoires soit si élevée, mais il me suffit de préparer un disque dur portable de grande capacité pour le chiffrement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.