ハードドライブを安全に暗号化する方法について読みました。その1つは、暗号化されたデータがハードドライブの他のデータと区別されないように、ドライブにランダムなビットを書き込むことです。
dd if=/dev/urandom of=/dev/sda
ところが以前に試してみるとETAが数日ほどになりました。代わりにurandomを使用することを見ましたが、badblocks
あまり役に立たないようです。dd
オプションや私が逃した可能性があるものなど、スピードを上げるのに役立つ方法があるのか、それともスピードがHDの制限にすぎないのか疑問に思います。
答え1
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年代のハードドライブ技術では、ゼロでハードドライブを上書きすると、少し高価なハードウェアを使用して回復できる小さな残りの電荷が残りました。これは任意のデータで複数回上書きする必要があります(「Guttermanを削除」)。今日ゼロで一度でも上書きすると、実験室条件でも現実的に回復できないデータが残ります。
パーティションを暗号化するときに暗号化されたデータの機密性を維持するために、ディスクを任意のデータで埋める必要はありません。これは、暗号化されたデータが使用するスペースを未使用スペースと区別できないようにする必要がある場合にのみ役立ちます。ランダムではないコンテナの上に暗号化されたボリュームを構築すると、暗号化されたボリュームでかつてどのディスクブロックが使用されたかを確認できます。これはファイルシステムの最大サイズのための良いヒントですが(時間が経つにつれて悪くなっても)それ以上ではありません。
答え2
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
進行状況/到着予定時刻を取得できます。今(ルートシェルで)実行されているコマンドは次のとおりです。
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
私のアイデアは次のとおりです。この回答、同じ問題が発生した後不合理なゾーン、WHOコメントしました。上記のGilesの答えについて。これにより、新しいRAIDアレイの削除速度が11 MB / sから約300 MB / sに増加し、1週間に必要な時間が10時間に短縮されました。
上記のステートメントの代わりに、より複雑なステートメントを使用できる必要があることを付け加えたいのですが、16MBの出力のみを生成できるようにするバグがあります。 (このバグは2016年1月に受け取りました。)openssl rand #of_bytes
openssl enc ...
ssl
そして答えによるとこの問題openssl
そして、CPUがボトルネックを引き起こしていると仮定すると、別々のコアで複数の並列プロセスを実行し、FIFOを使用してそれらを組み合わせることで速度をさらに向上させることができます。
答え3
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,800MB/秒
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
セキュリティ/暗号化の目的でこれを行うのではなく、後で読み取るテストがゼロ以外の実際のデータであることを確認することだけです。 SSD / NVMeの前処理にも同じfioコマンドを使用できます。 /dev/zeroのみを使用すると、ディスクレベルの圧縮によって実際の書き込み回数が「だまされている」可能性があるためです。-loops=2
ベンチマーク目的で新しいSSDならフラグを追加しますが。
本当に安全にしたい場合は、その-randrepeat=bool
オプションを使用できます。これにより、「結果が実行中に繰り返されるように、予測可能な方法で乱数ジェネレータをシードします。デフォルト:true」が切り替わりますが、私はまだそうしません。持っていません。それがどれほど安全であるかを決定します。
また、一部のエンタープライズHDDには、暗号化キーを循環して記録されたすべてのデータをすぐに安全に削除するための自己暗号化ドライブ(SED)機能があります。
最後に、私は過去にCDとUSBブートオプションの両方があり、SourceForgeでホストされているオープンソースプロジェクトであるDBAN(別名Darik's Boot and Nuke)を使用しました。このプログラムは、ハードドライブのデータまで安全に削除するように設計されています。永久に削除されました。 "削除されたため、復元できなくなりました。"
答え4
Marcoの答えを完成させるには、より高速な乱数ジェネレータが必要です。
簡単なプログラムを使用してboost::random
。dd
ブーストを選択すると使用できますこれたとえば、experiment
必要に応じて機能を変更します。