目次
ハードディスクのデータを消去する方法です。
DoD5220.22-M (米国国防総省) 方式
HDD 全体に 0 を書き込み、 1 を書き込み、 乱数を書き込みをする方法です。 合計3回の書き込みを行います。
これは DoD5220.22-M の初期のもので、 今では別のガイドラインが作成されています。
歴史
、最初のバージョンが発行されました。このバージョンでは、ハードディスクドライブ(HDD)のデータ消去方法として、ゼロと一のパターンで3回上書きする手順が規定されました。これは、DoD 5220.22-Mサニタイズ手法と呼ばれるようになりました。
、国防総省は、DoD 5220.22-Mの拡張版として、DoD 5220.22-M ECEサニタイズ手法を指定しました。この手法では、7回の上書きパスを実施することが求められました。
、最新版のDoD 5220.22-Mが発行されました。このバージョンでは、HDDのデータ消去方法として、上書きパターンが指定されなくなりました。代わりに、消去、消磁、物理的破壊などの他のサニタイズ手法が推奨されました。
、DoD 5220.22-Mが改訂されました。このバージョンでは、フラッシュベースのストレージやモバイルデバイスなどの新しい技術に対応するために、サニタイズ手法のガイドラインが更新されました。
、国防総省は、DoD 5220.22-Mを参照しなくなり、代わりに国立標準技術研究所(NIST)のメディアサニタイズガイドライン(NIST SP 800-88)を順守するようにしました。
コマンド
Linux では、 dd
コマンドを利用すると削除できます。
0 を書き込む
1 2 |
dd if=/dev/zero of=/dev/sdb bs=4096 |
dd
は、データをコピーするコマンドです¹。if=/dev/zero
は、入力ファイルとして/dev/zero
を指定しています。/dev/zero
は、無限にゼロを出力する特殊なファイルです。of=/dev/sdb
は、出力ファイルとして/dev/sdb
を指定しています。/dev/sdb
は、ハードディスクやUSBメモリなどのデバイスファイルです¹。bs=4096
は、ブロックサイズとして 4096 バイトを指定しています。ブロックサイズは、一度に読み書きするデータの単位です。
/dev/zero
から /dev/sdb
に 4096 バイトずつゼロをコピーし続けることで、/dev/sdb
のデータを上書きして消去します。
確認する
ディスクの先頭を確認する
1 2 |
dd if=/dev/sdb bs=512 count=1 | hexdump -C |
ハードディスクやUSBメモリなどのデバイスの先頭の512バイトを16進数で表示します。
dd
は、データをコピーするコマンドです。if=/dev/sdb
は、入力ファイルとして/dev/sdb
を指定しています。bs=512
は、ブロックサイズとして 512 バイトを指定しています。ブロックサイズは、一度に読み書きするデータの単位です。count=1
は、読み込むブロック数として 1 を指定しています。これにより、先頭の 512 バイトだけを読み込みます。hexdump -C
は、パイプで受け取ったデータを16進数とASCIIコードで表示するコマンドです。-C
は、16進数とASCIIコードをカラムで表示するオプションです。
この結果を見ると、ハードの先頭部分が0で埋められていることが確認できます。
もし dd
コマンドのパラメータに、 of=output.bin
などを指定すると、 output.bin
ファイル に先頭の512バイトを書き込めます。
ディスクの末尾を確認する
1 |
dd if=/dev/sdb bs=512 skip=$(($(blockdev --getsz /dev/sdb) - 1)) | hexdump -C |
ハードディスクやUSBメモリなどのデバイスの最後尾の512バイトを16進数で表示します。 このコマンドは、ハードディスクの総セクタ数から1を引いた値を skip
に渡して、最後の1ブロックだけを読み込んでいます。
- 繰り返しになりますが、
dd
は、データをコピーするコマンドです。 if=/dev/sdb
は、入力ファイルとして/dev/sdb
を指定しています。bs=512
は、ブロックサイズとして 512 バイトを指定しています。-
skip=$(($(blockdev --getsz /dev/sdb) - 1))
は、読み飛ばすブロック数を指定していますblockdev --getsz /dev/sdb
は、ハードディスクの総セクタ数を取得するコマンドです。$(())
は、算術演算を行うための記法です。
1 を書き込む
1 |
tr '\0' '\377' < /dev/zero > /dev/sdb |
tr
は、文字を変換するコマンドです。-
'\0'
,'\377'
は、入力された文字のうち、\0
(8進数で0)を\377
(8進数で255)に変換することを指定しています。これにより、0ビットを1ビットに変換しています。- ((3 x 8) + 7) x 8 + 7 = 255
< /dev/zero
は、標準入力元として/dev/zero
を指定しています。> /dev/sdb
は、標準出力先として/dev/sdb
を指定しています。
このコマンドは、/dev/zero
から0を読み込み、tr
で1に変換し、/dev/sdb
に1を書き込み続けることで、/dev/sdb
のデータを上書きして消去します。
確認する
0 を書き込んだ時と同じように、確認を行いました。
ディスクの先頭を確認する
1 2 |
dd if=/dev/sdb bs=512 count=1 | hexdump -C |
ディスクの末尾を確認する
1 2 |
dd if=/dev/sdb bs=512 skip=$(($(blockdev --getsz /dev/sdb) - 1)) | hexdump -C |
乱数を書き込む
1 2 |
dd if=/dev/urandom of=/dev/sdb bs=4096 |
/dev/urandom
というデバイスからランダムなデータを読み込み、/dev/sdb
に書き込みます。
/dev/urandom
を使うと、 /dev/zero
を使う場合に比べて時間がかかります。 これは 単純に乱数生成に時間がかかるからです。
/dev/urandom
は、環境ノイズ(マウス、キーボードなどデバイスに関わる状態)から乱数を作ります。
確認する
0 を書き込んだ時と同じように、確認を行いました。
ディスクの先頭を確認する
1 2 |
dd if=/dev/sdb bs=512 count=1 | hexdump -C |
ディスクの末尾を確認する
1 2 |
dd if=/dev/sdb bs=512 skip=$(($(blockdev --getsz /dev/sdb) - 1)) | hexdump -C |