ハードディスクのデータを消去するDoD5220.22-M (米国国防総省) 方式


ハードディスクのデータを消去する方法です。

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 を書き込む

  • 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 のデータを上書きして消去します。

確認する

ディスクの先頭を確認する

ハードディスクや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バイトを書き込めます。

ディスクの末尾を確認する

ハードディスクや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 を書き込む

  • 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 を書き込んだ時と同じように、確認を行いました。

ディスクの先頭を確認する
ディスクの末尾を確認する

乱数を書き込む

/dev/urandomというデバイスからランダムなデータを読み込み、/dev/sdbに書き込みます。

/dev/urandom を使うと、 /dev/zero を使う場合に比べて時間がかかります。 これは 単純に乱数生成に時間がかかるからです。 /dev/urandom は、環境ノイズ(マウス、キーボードなどデバイスに関わる状態)から乱数を作ります。

確認する

0 を書き込んだ時と同じように、確認を行いました。

ディスクの先頭を確認する
ディスクの末尾を確認する