labunix's blog

labunixのラボUnix

linuxのコマンドでデータ消去する方法を検討する

■sdaを削除する方法とする。
 機密度と時間を考慮の上、削除方式を決める。

 「HD革命/Eraser」の説明が分かりやすい。「DiskDeleter」は難しい事をしてるんですね。
 といいつつワンライナー。
 オプションで受け取って分岐でそれぞれ実行出来るようすれば
 もっと簡単に選択出来そうだけど、今日は止めておこう。。。

 消去方式はどのようなものがありますか
 http://www1.ark-info-sys.co.jp/support/hder/before/eraser2before03.html

 データ消去「DiskDeleter」に搭載されている15種類の消去方式
 http://www.diskdeleter.jp/%E6%B6%88%E5%8E%BB%E6%96%B9%E5%BC%8F%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

■MBRの消去
 書き込み回数:1,消去レベル:最低

$ sudo dd if=/dev/zero of=/dev/sda bs=512 count=1

$ man2html /usr/share/man/ja/man1/shred.1.gz | \
  w3m -dump -T text/html | grep -A 2 "^shred \-"
shred - ファイルを上書きし、その内容が分からないようにする (追加でファイルの削
除も可能)0で消去
 書き込み回数:1,消去レベル:低

$ sudo dd if=/dev/zero of=/dev/sda

■乱数値で消去
 書き込み回数:1,消去レベル:低

$ sudo dd if=/dev/random of=/dev/sda 
$ sudo dd if=/dev/urandom of=/dev/sda 

■NSA方式
 書き込み回数:3,消去レベル:中
 乱数2回、ゼロ書き1回

$ su root -c 'dd if=/dev/random of=/dev/sda; \
              dd if=/dev/random of=/dev/sda ; \
              dd if=/dev/zero of=/dev/sda'

■米国陸軍方式
 書き込み回数:3,消去レベル:中
 乱数1回、(0xff)1回、(0x70)1# dd if=/dev/urandom of=/dev/sda; \
  yes p | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  yes $(echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin of=/dev/sda

■米国陸軍方式の仕組み

$ yes p | tr -d '\n' | dd if=/dev/stdin bs=512 count=1 | hexdump -C
1+0 レコード入力
1+0 レコード出力
512 バイト (512 B) コピーされました、 0.0244516 秒、 20.9 kB/秒
00000000  70 70 70 70 70 70 70 70  70 70 70 70 70 70 70 70  |pppppppppppppppp|
*
00000200

$ yes $(echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin bs=512 count=1 | hexdump -C
1+0 レコード入力
1+0 レコード出力
512 バイト (512 B) コピーされました、 0.00945933 秒、 54.1 kB/秒
00000000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000200

■米国海軍方式
 書き込み回数:3,消去レベル:中
 (0xff)1回、(0x77)1回、(0x33)1# yes $(echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  yes w | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  yes 3 | tr -d '\n' | dd if=/dev/stdin of=/dev/sda

$ yes w | tr -d '\n' | dd if=/dev/stdin bs=512 count=1 | hexdump -C
1+0 レコード入力
1+0 レコード出力
512 バイト (512 B) コピーされました、 4.7682e-05 秒、 10.7 MB/秒
00000000  77 77 77 77 77 77 77 77  77 77 77 77 77 77 77 77  |wwwwwwwwwwwwwwww|
*
00000200

$ yes 3 | tr -d '\n' | dd if=/dev/stdin bs=512 count=1 | hexdump -C
1+0 レコード入力
1+0 レコード出力
512 バイト (512 B) コピーされました、 1.2499e-05 秒、 41.0 MB/秒
00000000  33 33 33 33 33 33 33 33  33 33 33 33 33 33 33 33  |3333333333333333|
*
00000200

■米国国防総省方式
 書き込み回数:3,消去レベル:高
 (0xff)1回、(0x77)1回、乱数1# yes $(echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  yes w | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  dd if=/dev/urandom of=/dev/sda'

■米国国防総省準拠方式 DoD5220.28-M消去方式
 (0xff)1回、(0x00)1回、乱数1回

# yes $(echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  dd if=/dev/zero of=/dev/sda; \
  dd if=/dev/urandom of=/dev/sda

■米国空軍方式 AFSSI5020消去方式
 (0x00)1回、(0xff)1回、乱数で上書きし、最後に10%書き込み検証
 書き込み検証はshredの進捗状況オプションと読み替えて、
 10%は自身で計算するものとして100Gだと。。。

# dd if=/dev/zero of=/dev/sda; \
  yes $(echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  dd if=/dev/urandom of=/dev/sda; \
  shred -n 1 -s 100G -v /dev/sda

■米国国防総省準拠方式 DoD5220.22-M消去方式
 (0x00)1回、(0xff)1回、乱数で上書きし、最後に書き込み検証

# dd if=/dev/zero of=/dev/sda; \
  yes $(echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  dd if=/dev/urandom of=/dev/sda; \
  shred -n 1 -v /dev/sda'

■国海軍方式 NAVSO P-5239-26-MFM消去方式
 (0x01)1回、(0x7fffff)1回、乱数で上書きし、最後に書き込み検証
 root権限で実行。

# yes $(echo "1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  yes $(echo "-129" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}'; \
        echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}'; \
        echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | \
        tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  dd if=/dev/urandom of=/dev/sda; \
  shred -n 1 -v /dev/sda

$ yes $(echo "1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin bs=512 count=1 | hexdump -C
1+0 レコード入力
1+0 レコード出力
512 バイト (512 B) コピーされました、 0.0191754 秒、 26.7 kB/秒
00000000  01 01 01 01 01 01 01 01  01 01 01 01 01 01 01 01  |................|
*
00000200

$ yes $(echo "-129" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}'; \
        echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}'; \
        echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | \
        tr -d '\n' | dd if=/dev/stdin bs=512 count=1
1+0 レコード入力
1+0 レコード出力
512 バイト (512 B) コピーされました、 0.0202601 秒、 25.3 kB/秒
00000000  7f ff ff 7f ff ff 7f ff  ff 7f ff ff 7f ff ff 7f  |................|
00000010  ff ff 7f ff ff 7f ff ff  7f ff ff 7f ff ff 7f ff  |................|
00000020  ff 7f ff ff 7f ff ff 7f  ff ff 7f ff ff 7f ff ff  |................|
00000030  7f ff ff 7f ff ff 7f ff  ff 7f ff ff 7f ff ff 7f  |................|
00000040  ff ff 7f ff ff 7f ff ff  7f ff ff 7f ff ff 7f ff  |................|
00000050  ff 7f ff ff 7f ff ff 7f  ff ff 7f ff ff 7f ff ff  |................|
00000060  7f ff ff 7f ff ff 7f ff  ff 7f ff ff 7f ff ff 7f  |................|
00000070  ff ff 7f ff ff 7f ff ff  7f ff ff 7f ff ff 7f ff  |................|
00000080  ff 7f ff ff 7f ff ff 7f  ff ff 7f ff ff 7f ff ff  |................|
00000090  7f ff ff 7f ff ff 7f ff  ff 7f ff ff 7f ff ff 7f  |................|
000000a0  ff ff 7f ff ff 7f ff ff  7f ff ff 7f ff ff 7f ff  |................|
000000b0  ff 7f ff ff 7f ff ff 7f  ff ff 7f ff ff 7f ff ff  |................|
000000c0  7f ff ff 7f ff ff 7f ff  ff 7f ff ff 7f ff ff 7f  |................|
000000d0  ff ff 7f ff ff 7f ff ff  7f ff ff 7f ff ff 7f ff  |................|
000000e0  ff 7f ff ff 7f ff ff 7f  ff ff 7f ff ff 7f ff ff  |................|
000000f0  7f ff ff 7f ff ff 7f ff  ff 7f ff ff 7f ff ff 7f  |................|
00000100  ff ff 7f ff ff 7f ff ff  7f ff ff 7f ff ff 7f ff  |................|
00000110  ff 7f ff ff 7f ff ff 7f  ff ff 7f ff ff 7f ff ff  |................|
00000120  7f ff ff 7f ff ff 7f ff  ff 7f ff ff 7f ff ff 7f  |................|
00000130  ff ff 7f ff ff 7f ff ff  7f ff ff 7f ff ff 7f ff  |................|
00000140  ff 7f ff ff 7f ff ff 7f  ff ff 7f ff ff 7f ff ff  |................|
00000150  7f ff ff 7f ff ff 7f ff  ff 7f ff ff 7f ff ff 7f  |................|
00000160  ff ff 7f ff ff 7f ff ff  7f ff ff 7f ff ff 7f ff  |................|
00000170  ff 7f ff ff 7f ff ff 7f  ff ff 7f ff ff 7f ff ff  |................|
00000180  7f ff ff 7f ff ff 7f ff  ff 7f ff ff 7f ff ff 7f  |................|
00000190  ff ff 7f ff ff 7f ff ff  7f ff ff 7f ff ff 7f ff  |................|
000001a0  ff 7f ff ff 7f ff ff 7f  ff ff 7f ff ff 7f ff ff  |................|
000001b0  7f ff ff 7f ff ff 7f ff  ff 7f ff ff 7f ff ff 7f  |................|
000001c0  ff ff 7f ff ff 7f ff ff  7f ff ff 7f ff ff 7f ff  |................|
000001d0  ff 7f ff ff 7f ff ff 7f  ff ff 7f ff ff 7f ff ff  |................|
000001e0  7f ff ff 7f ff ff 7f ff  ff 7f ff ff 7f ff ff 7f  |................|
000001f0  ff ff 7f ff ff 7f ff ff  7f ff ff 7f ff ff 7f ff  |................|
00000200

■米国海軍方式 NAVSO P-5239-26-RLL消去方式
 (0x01)1回、(0x27ffffff)1回、乱数で上書きし、最後に書き込み検証

# dd if=/dev/zero of=/dev/sda; \
  yes $(echo "1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}'; \
        echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}'; \
        echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | \
        tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  shred -n 1 -v /dev/sda

$ yes $(echo "1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}'; \
        echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}'; \
        echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') |         tr -d '\n' | dd if=/dev/stdin bs=512 count=1 2>/dev/null | hexdump -C
00000000  01 ff ff 01 ff ff 01 ff  ff 01 ff ff 01 ff ff 01  |................|
00000010  ff ff 01 ff ff 01 ff ff  01 ff ff 01 ff ff 01 ff  |................|
00000020  ff 01 ff ff 01 ff ff 01  ff ff 01 ff ff 01 ff ff  |................|
00000030  01 ff ff 01 ff ff 01 ff  ff 01 ff ff 01 ff ff 01  |................|
00000040  ff ff 01 ff ff 01 ff ff  01 ff ff 01 ff ff 01 ff  |................|
00000050  ff 01 ff ff 01 ff ff 01  ff ff 01 ff ff 01 ff ff  |................|
00000060  01 ff ff 01 ff ff 01 ff  ff 01 ff ff 01 ff ff 01  |................|
00000070  ff ff 01 ff ff 01 ff ff  01 ff ff 01 ff ff 01 ff  |................|
00000080  ff 01 ff ff 01 ff ff 01  ff ff 01 ff ff 01 ff ff  |................|
00000090  01 ff ff 01 ff ff 01 ff  ff 01 ff ff 01 ff ff 01  |................|
000000a0  ff ff 01 ff ff 01 ff ff  01 ff ff 01 ff ff 01 ff  |................|
000000b0  ff 01 ff ff 01 ff ff 01  ff ff 01 ff ff 01 ff ff  |................|
000000c0  01 ff ff 01 ff ff 01 ff  ff 01 ff ff 01 ff ff 01  |................|
000000d0  ff ff 01 ff ff 01 ff ff  01 ff ff 01 ff ff 01 ff  |................|
000000e0  ff 01 ff ff 01 ff ff 01  ff ff 01 ff ff 01 ff ff  |................|
000000f0  01 ff ff 01 ff ff 01 ff  ff 01 ff ff 01 ff ff 01  |................|
00000100  ff ff 01 ff ff 01 ff ff  01 ff ff 01 ff ff 01 ff  |................|
00000110  ff 01 ff ff 01 ff ff 01  ff ff 01 ff ff 01 ff ff  |................|
00000120  01 ff ff 01 ff ff 01 ff  ff 01 ff ff 01 ff ff 01  |................|
00000130  ff ff 01 ff ff 01 ff ff  01 ff ff 01 ff ff 01 ff  |................|
00000140  ff 01 ff ff 01 ff ff 01  ff ff 01 ff ff 01 ff ff  |................|
00000150  01 ff ff 01 ff ff 01 ff  ff 01 ff ff 01 ff ff 01  |................|
00000160  ff ff 01 ff ff 01 ff ff  01 ff ff 01 ff ff 01 ff  |................|
00000170  ff 01 ff ff 01 ff ff 01  ff ff 01 ff ff 01 ff ff  |................|
00000180  01 ff ff 01 ff ff 01 ff  ff 01 ff ff 01 ff ff 01  |................|
00000190  ff ff 01 ff ff 01 ff ff  01 ff ff 01 ff ff 01 ff  |................|
000001a0  ff 01 ff ff 01 ff ff 01  ff ff 01 ff ff 01 ff ff  |................|
000001b0  01 ff ff 01 ff ff 01 ff  ff 01 ff ff 01 ff ff 01  |................|
000001c0  ff ff 01 ff ff 01 ff ff  01 ff ff 01 ff ff 01 ff  |................|
000001d0  ff 01 ff ff 01 ff ff 01  ff ff 01 ff ff 01 ff ff  |................|
000001e0  01 ff ff 01 ff ff 01 ff  ff 01 ff ff 01 ff ff 01  |................|
000001f0  ff ff 01 ff ff 01 ff ff  01 ff ff 01 ff ff 01 ff  |................|
00000200

■旧NSA方式 Bit Toggle消去方式
 (0x00)1回、(0xff)1回、(0x00)1回、(0xff)1# dd if=/dev/zero of=/dev/sda; \
  yes $(echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  dd if=/dev/zero of=/dev/sda; \
  yes $(echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin of=/dev/sda

■ドイツ標準方式 VSITR消去方式
 (0x00)1回、(0xff)1回、(0x00)1回、(0xff)1回、(0x00)1回、(0xff)1回、(0xaa)1# dd if=/dev/zero of=/dev/sda; \
  yes $(echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  dd if=/dev/zero of=/dev/sda; \
  yes $(echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  dd if=/dev/zero of=/dev/sda; \
  yes $(echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  yes $(echo "-0x56" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin  of=/dev/sda

$ yes $(echo "-0x56" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin bs=512 count=1 | hexdump -C
00000000  aa aa aa aa aa aa aa aa  aa aa aa aa aa aa aa aa  |................|
*
00000200
1+0 レコード入力
1+0 レコード出力
512 バイト (512 B) コピーされました、 0.00640119 秒、 80.0 kB/秒

■グートマン(Peter Gutmann)推奨方式
 乱数を4回、その後固定値を27回、最後に乱数を4# for l in `seq 1 4`;do \
    dd if=/dev/urandom of=/dev/sda; \
  done; \
  for m in `seq 1 27`;do \
    yes $(echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  done; \
  for n in `seq 1 4`;do \
    dd if=/dev/urandom of=/dev/sda; \
  done

■米国国防総省準拠方式DoD5220.28-M + グートマン(Peter Gutmann)推奨方式
 (0xff)1回、(0x00)1回、乱数1回、乱数を4回、その後固定値を27回、最後に乱数を4# yes $(echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  dd if=/dev/zero of=/dev/sda; \
  dd if=/dev/urandom of=/dev/sda; \
  for l in `seq 1 4`;do \
    dd if=/dev/urandom of=/dev/sda; \
  done; \
  for m in `seq 1 27`;do \
    yes $(echo "-1" | awk '{printf "%c",$1}' | awk '{printf "%s",$1}') | tr -d '\n' | dd if=/dev/stdin of=/dev/sda; \
  done; \
  for n in `seq 1 4`;do \
    dd if=/dev/urandom of=/dev/sda; \
  done