HDDやSSDのデータを完全消去してみる

古いサーバやPCなどを処分する際に、HDDのデータを復旧できない状態にしないと、情報漏洩等の危険があります。
※普通にファイル等を削除しただけでは、ツールを使ってデータを復旧できる事があります。

物理的に壊す事で対応できますが、それもなかなか難しい場合があるので、その際にはHDD全体にデータを上書きすることなどによって元々あったデータを復旧できなくする事が出来ます。それならHDD/SSDの再利用が出来るので良いですね。

:::note warn
データ消去には諸説あったり最近のトレンドもあると思います。
この記事はかなり古いメモですので予めご了承下さい。
:::

# hdparmを使用したSSDのSecure Erase＠Linux
Ubuntuでやってみた例です。
## 状態の確認
```bash
# hdparm -I /dev/sdb
Security: 
    Master password revision code = 12345
        supported
    not enabled
    not locked
        frozen
    not expired: security count
        supported: enhanced erase
    2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
```
最初は上記のようになっていることが多いと思います。
- not enabled：セキュリティ機能がOFF
- not locked：パスワードロックされていない
- frozen：Secure Eraseが実行できないように保護されている

## frozen状態を変えるためにマシンを一度サスペンドする
```bash
# systemctl suspend
```
※サスペンドしたら電源ボタンを押すなどして復帰する
※SSDの電源をOFF/ONすることで対応している人もいるようです。環境によりけりなのかな。
状態確認

## 再びhdparm -I /dev/sdbを実行し，not frozenとなっていることを確認
```bash
# hdparm -I /dev/sdb
Security: 
    Master password revision code = 12345
        supported
    not enabled
    not locked
    not frozen
    not expired: security count
        supported: enhanced erase
    2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
```
## SSDにパスワードを設定する
通常はSecure Erase実行後に自動的にパスワード設定も消えます。
```bash
# hdparm --user-master u --security-set-pass pass /dev/sdb
```
## Secure Eraseの実行
```bash
# hdparm --user-master u --security-erase pass /dev/sdb
```
## もしSecure Erase後もロックされたままになってしまったら
以下のコマンドでロックを解除します。
```bash
# hdparm --user-master u --security-unlock pass /dev/sdb
# hdparm --user-master u --security-disable pass /dev/sdb
```

# shred を使用した方法＠Linux
KNOPPIXでやってみた例です。
GNU の Coreutils に含まれている shred というツールを使用し、ランダムなデータを何度も書き込む事でデータを完全消去します。実行には長い時間がかかります。（数時間〜数日以上）
http://www.gnu.org/software/coreutils/

## 書式
```
shred [オプション] FILE
```
## 米国コンピュータセキュリティセンター(NCSC)方式(NCSC-TG-025)水準
ランダムな書き込みを3回繰り返します。

```bash
# shred -n 3 -v /dev/hda
```
※/dev/hda は対象のデバイス名（環境に合わせて変更すること）

## 米国空軍方式(AFSSI5020,AFI33-202)水準
ランダムな書き込みを25回行います。最後に0で上書きします。

```bash
# shred -z -v /dev/hda
```
※/dev/hda は対象のデバイス名（環境に合わせて変更すること）

## オプション
- -n : 回数指定
- -v : 進捗状況のメッセージを表示する
- -z : 最後にNUL(0)で上書きする

# dd を使用した方法＠Linux
ddを使ってHDD全体を0で上書きします。
if で指定したファイルから1ブロック（何も指定しない場合512byte）読み込み、 of で指定したファイル（消去したいHDDデバイス）に読み込んだデータをそのまま書き込むという動作をエラーがでるまで繰り返します。 /dev/zero というのは仮想デバイスで、読み込むと常に 0 を返すデバイスです。 それを、 HDD 全体を示すファイルに書き込むというわけです。 HDDの先頭から書き込み始め、終端まで書き込むとエラーを出して終了します。

```bash
# dd if=/dev/zero of=/dev/hda
```
※0消去を行った場合でも、残留磁気を調査する事で、データを読み出せる可能性があるようなので、国防レベルを求めるのであれば shred を使うべきでしょう。

2011追記
Solarisっぽくしながら追記

```bash
# dd if=/dev/random of=/dev/rdsk/c1t0d0s2
```
上記には、/dev/zeroと記載していましたが、
/dev/randomで書きこめば、それなりに上書きデータもランダムになるはずです。そうすれば、shredが無いSolarisでもランダムにできるかと。

※/dev/randomはSolaris9から標準搭載ということで、
　Solaris8の場合はRecommendedパッチの適用具合で
　有無が変わっていたはずです。 [^1]


[^1]: Solaris8とか・・メモした時代が伺えます。


# cipher を使用した方法＠Windows
Windowsではcipherコマンドを利用できます。
ただし、コマンドの仕組みとして、空き領域しかワイプされないので注意が必要です。
システムドライブなどの削除には向きません。
※指定したドライブにEFSTMPWPというフォルダが作成され、その中にファイルが作成されます。

Dドライブの消去例。`/w:`オプションにDドライブ`d:`を指定。
```
C:\>cipher /w:d:
できるだけ多くのデータを削除するために、CIPHER /W の実行中
はほかのアプリケーションをすべて終了してください。
0x00 に書き込み中
......................
0xFF に書き込み中
......................
乱数 に書き込み中
......................
C:\>
```