HDをランダム化する高速な方法は?


14

暗号化のためにハードドライブをセキュリティで保護する方法について読みましたが、暗号化されたデータをハードドライブ上の他のデータと区別できないようにするために、ドライブにランダムビットを書き込むことが手順の1つです。

ただし、dd if=/dev/urandom of=/dev/sda過去に使用してみたときに、ETAは数日であるように見えました。badblocksurandomの代わりに使用することについて何かを見ましたが、それは大して役に立たないようでした。私はこれをスピードアップするのに役立つ可能性のある方法があるかどうか、たとえばdd私が不足している可能性のあるもの、または速度がHDの制限であるかどうかを知りたいです。


ブロックサイズをハードドライブに適したものに変更します。dd bs=1M例えば。
パトリック

速度はどのくらいでしたか?3TB(たとえば)HDD全体を書き込むには時間がかかります。またiostat -kx 10、ドライブのビジー%を確認してください。
デロバート

5
shred -v -n 1 /dev/overwritethis速いです。それshredは実際に何かに役立つ唯一のケースです。
frostschutz

@derobert:それがどれほど速いか確かに言うことはできませんが、数時間離れて戻ってきて、これを初めて試したときに500G内蔵HDの約10%が完了しました。「iostat」のヒントをありがとう
-bitflips

@Patrick:私はbs = 4Mを盲目的に試しました。ArchCDをusbに入れる方法のガイドで見たからです。それはわずかに役立ちましたが、それでもかなり遅かったです。
ビットフリップ

回答:


14

dd if=/dev/urandom of=/dev/sda、または単に cat /dev/urandom >/dev/sda、ランダムデータでディスクをいっぱいにする最速の方法ではありません。Linux /dev/urandomは、最速の暗号化RNGではありません。/ dev / urandomに代わるものはありますか?いくつかの提案があります。特に、OpenSSLには、より高速な暗号化PRNGが含まれています。

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

最終的に、改善があるかどうかは、ボトルネックとなっている部分(CPUまたはディスク)によって異なります。

良いニュースは、ディスクをランダムデータでいっぱいにすることはほとんど役に立たないことです。まず、一般的な神話を払拭するために、今日のハードウェアではゼロワイプするのと同じくらい良いです。1980年代のハードディスクテクノロジーでは、ハードディスクをゼロで上書きすると、わずかな残留電荷が残りましたが、いくらか高価なハードウェアで回復できます。ランダムデータによる上書きの複数のパス(「ガットマンワイプ」)が必要でした。今日、ゼロで上書きする単一のパスでさえ、実験室の状態でさえ現実的に回復できないデータを残します。

パーティションを暗号化する場合、暗号化されたデータの機密性を確保するために、ディスクにランダムデータを書き込む必要はありません。暗号化されたデータで使用される領域を未使用の領域と区別できないようにする必要がある場合にのみ役立ちます。ランダム化されていないコンテナの上に暗号化されたボリュームを構築すると、暗号化されたボリュームによって使用されたディスクブロックが明らかになります。これにより、ファイルシステムの最大サイズに関する良いヒントが得られます(時間が経つにつれて、ファイルシステムの概算はますます悪くなります)。


4
Gutmannは完全に神話であり、1980年代のハードディスクでも実際に行われたとは思いません。皮肉なことに、ドライブがよりスマートになったので、最近では実際にランダムデータを使用して、空きセクター(トリム)やデータの圧縮ではなく、ドライブへの書き込みを強制する必要があります。ゼロは、実際に書き込まれている場合にのみ有効です。
frostschutz

1
@mellowmaroonはい、cat /dev/zeroほとんどの場合は十分です。暗号化されたボリュームの空き容量を隠したいだけでは不十分です。
ジル 'SO-悪であるのをやめる'

1
@mellowmaroonそれはほとんど役に立たないです。盗聴者は、最大でX MBのデータを持っていることを知っているでしょう(以前は使用されていたが現在使用されていないスペースは使用済みのスペースと見分けがつかないため、はるかに少ないかもしれません)。また、空き領域の場所は、ファイルシステムのタイプ(スーパーブロックコピー)を明らかにする可能性があります。これはめったに懸念事項/etc/fstabではありません(ルートパーティションを暗号化していない限り、通常はcleartext で公開されますが、そのような選択肢はそれほど多くありません)。
ジル「SO-悪であるのをやめる」

2
@Gilles Ubuntu 13.10で遭遇した問題は、openssl rand生成されるバイト数に上限があるようです。その制限を超えた場合、たとえば '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`がその数のランダムバイトを生成します。
不合理なジョン14年

1
非合理的なジョンの上限の問題では、8100億バイトが約754 GBになります。ディスクを複数の700 GBパーティションに分割し、openssl randsda5などから逆方向に各パーティションでコマンドを実行し、sda1に戻り、最後にsdaに戻りますか?
jia103

6

opensslは私には機能しなかったようです。提供されたソリューションで「不明なオプション」およびその他の問題が発生しました。だから私はプログラムfioに行きました。

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

24台のHDDで19TBを実行するのに3時間かかっているようです。約1,800 MB /秒

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]

これが実際にはランダムなデータであることを願っています。マニュアルページには、fioの「デフォルト:ランダムデータでバッファを埋める」と書かれています。http://linux.die.net/man/1/fio

私は安全/暗号化の目的のためにそれをしていません。ただ、後の読み取りテストが実際のデータであり、0だけではないことを確認しようとしています。この同じfioコマンドをSSD / NVMeの事前調整に使用できます。/ dev / zeroを使用するだけで、実際に書き込まれるディスクレベルの圧縮「不正」が発生する可能性があるためです。-loops=2ベンチマーク用の新しいSSDであれば、フラグを追加しますが。

安全にしたい場合は、-randrepeat=bool オプションを使用できる場合があります。これにより、「乱数ジェネレーターを予測可能な方法でシードできるため、結果が実行間で繰り返し可能になります。デフォルト:true」。それがどれほど安全かは確かです。

さらに、一部のエンタープライズクラスのHDDにはSED(Self Encrypting Drives)があり、暗号化キーをスピンして、書き込まれたすべてのデータを即座に安全に消去できます。

最後に、過去にDBAN(別名Darik's Boot and Nuke)を使用しました。これは、CDおよびUSBのブート可能なオプションがあり、「SourceForgeでホストされるオープンソースプロジェクトです。プログラムは、データが完全に消去されるまでハードディスクを安全に消去するように設計されています削除され、回復不能になりました」


1
size = 100%は機能しませんでしたが、fill_device = 1(またはfill_fs = 1)は機能しました。
d.jamison

ブロックレベルのデバイスまたはファイルシステムを一杯にするのであれば、それは依存すると思います。ブロックレベルのデバイスでは、デバイスの大きさがわかり、サイズはデバイスサイズの割合になります。fill_deviceがデバイスの完全なエラーを受け取るまで。fill_deviceフラグはファイルを上書きせず、未使用の領域を上書きするだけだと思います。デバイスのテストを行うときに必要な場合を除き、通常はファイルシステムを使用しないため、テストには使用していません。
テイラーサンチェス16

6

OpenSSLを/dev/zeroランダム化されたパスワードで暗号化して、まともな擬似ランダムデータを非常に高速に提供できます(CPUが加速をサポートしている場合)。

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

これをパイプ処理しpvて、進行状況/ ETAを取得できます。現在(ルートシェルで)実行しているコマンドは次のとおりです。

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

私がこのアイデアを得たこの答えと同じ問題を抱えた後、不合理ジョンコメント上記ジルの答えに。これにより、新しいRAIDアレイのワイプ速度が11 MB /秒から約300 MB /秒に増加し、1週間かかっていた時間が10時間に短縮されました。

上記のより複雑なステートメントではなく使用できるはずです が、16 MBの出力しか生成できないバグがあります。(このバグは2016年1月に報告されました。)openssl rand #of_bytesopenssl enc ...ssl

また、この質問への回答に従って、CPUがボトルネックであると仮定し続けると、複数の並列opensslプロセスを別々のコアで実行し、FIFOを使用してそれらを組み合わせることにより、さらに速度を上げることができる場合があります。


編集が必要かどうかはわかりません。この質問への他の答えは提案しopenssl randます。
震災

2
ベンチマーク::dd if=/dev/urandom18MiB / s 、openssl enc:〜180MiB / s 、fio: 169MiB / s、openssl randサポートなし> 754GB。自動サイズ計算も必要な場合は、次を使用してください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。注意してください、sdaこのコマンドには2回存在します。
KrisWebDev

0

Marcoの答えを完成させるために必要なのは、より高速な乱数ジェネレータです。

のような優れたライブラリから乱数をエコーする単純なプログラムを使用し、そのライブラリboost::randomを使用しddます。

ブーストを選択した場合、この例を使用experimentして、必要に応じて機能を変更できます。


システムのブーストソリューションの速度はどれくらいですか?私のマシンでの非科学的なベンチマークは、とまったく同じ速度をもたらし/dev/urandomます。
マルコ

boost::random暗号化RNGを提供していませんか?非暗号RNGを使用する場合は、ゼロを使用することもできます。少なくともセキュリティの錯覚はありません。
ジル 'SO-悪であるのをやめる'

私はboost::randomジェネレーターがどれくらい速いかについて特定することはできません、確実に知る唯一の方法は、に対して最も速いアルゴリズムを測定することです/dev/urandom
-RSFalcon7

0

ブロックサイズもハードドライブもボトルネックではなく、擬似乱数の生成が遅い場合。低エントロピープールでブロックされていない/dev/urandomため/dev/random、に比べて大幅に高速です。

これを確認するには、擬似乱数の生の出力を測定します。

pv /dev/urandom >/dev/null

この速度は、ハードドライブの書き込み速度よりもはるかに遅くなります。正しい解決策は、必要なセキュリティレベルに完全に依存します。高度なセキュリティが必要な場合は、高速のハードウェアランダムジェネレーターを使用するか、低速を受け入れてください。セキュリティニーズがそれほど高くない場合は、数十MiBのデータをキャプチャし、その文字列をドライブに繰り返し書き込むことができます。または/dev/zero、ゼロを書き込むこともできます。

概要

/dev/random -安全な、非常に遅い
/dev/urandom- レス secure¹、遅い
ハードウェアRNG -安全な、高速で、非常に高価な
/dev/zero -全くランダムではなく、非常に高速)

¹ / dev / urandomのrandはログインキーに対して安全ですか?」 /dev/urandomと同じくらい安全/dev/randomです。これを指摘してくれたGillesに感謝します。


彼はすでにを使用していurandomます。
パトリック

確かに。私のポイントは、urandomでさえ彼のニーズには遅すぎるということです。そのため、彼はurandomとは異なるソリューションを必要としています。
マルコ



0

私は4TBの外部USB HDDをいっぱいにしようとしてdd if=/dev/urandom of=/dev/sdX status=progressいました(bs=設定に関係なく)非常に遅かったので、openssl出力するランダムデータの量に上限があるようです(少なくともバージョン1.0.2pの場合)。私が見つけた最良のオプションは、使用するfrostschutzからのコメントでしshredた:

shred -v -n 1 /dev/sdX

使用していることを確認し-n 1、それ以外の場合は上のデバイスを3回書き込みがデフォルトになります(プラス-vどの番組が進行します)。擬似乱数の品質はそれほど高いとは思いませんが、暗号化のために大容量のポータブルHDDを準備すれば十分です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.