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

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

ハード ドライブを暗号化に対して安全にする方法について読んだことがありますが、その手順の 1 つは、暗号化されたデータをハード ドライブ上の他のデータと区別できないようにするために、ドライブにランダム ビットを書き込むことです。

dd if=/dev/urandom of=/dev/sdaしかし、以前使用してみたときは、ETA は数日程度になるようでした。urandombadblocksの代わりに を使用するという記事を見ましたが、あまり役に立たないようです。オプションやdd他に見落としているものなど、これを高速化できる方法があるかどうか、または速度が HD の制限にすぎないかどうか知りたいだけです。

答え1

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

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

最終的に、改善があるかどうかは、CPU とディスクのどちらの部分がボトルネックになっているかによって決まることに注意してください。

幸いなことに、ディスクをランダムなデータで埋めるのはほとんど無駄です。まず、よくある誤解を払拭するために、ゼロ消去は今日のハードウェアでも同様に有効である1980 年代のハードディスク技術では、ハードディスクをゼロで上書きすると、多少高価なハードウェアで回復できるわずかな残留電荷が残り、ランダム データで複数回上書きする (「ガットマン ワイプ」) 必要がありました。今日では、ゼロで 1 回上書きしただけでも、実験室の条件でも現実的に回復できないデータが残ります。

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

答え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進行状況/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

このアイデアはこの答え、同じ問題を抱えた後非合理的なジョン、 誰がコメントした上記の Gilles の回答に従ってください。これにより、新しい RAID アレイへの消去速度が 11 MB/秒から約 300 MB/秒に向上し、1 週間かかるところが 10 時間に短縮されました。

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

そして、この質問opensslCPU がボトルネックであると仮定し続けると、複数の並列プロセスを別々のコアで実行し、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

これはセキュリティや暗号化の目的で行っているわけではなく、後の読み取りテストが単なる 0 ではなく実際のデータであることを確認しようとしているだけです。この同じ fio コマンドは、SSD/NVMe の事前調整にも使用できます。/dev/zero を使用するだけでは、ディスク レベルの圧縮によって実際に書き込まれる量が「不正」になる可能性があります。ただし、-loops=2ベンチマーク用の新しい SSD の場合は、フラグを追加します。

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

さらに、一部のエンタープライズ クラスの HDD には SED (自己暗号化ドライブ) があり、暗号化キーをスピンさせることで、書き込まれたすべてのデータを瞬時に安全に消去できます。

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

答え4

Marco の回答を完了すると、必要なのはより高速な乱数ジェネレーターです。

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

ブーストを選択した場合は、これたとえば、experimentニーズに合わせて機能を変更するなどです。

関連情報