SSDを簡単に消去するコマンドを作ってみた

# SSDを簡単に消去するコマンドを作ってみた
<!--
	https://qiita.com/belgianbeer/items/ecd070a649d859143e59
	https://www.facebook.com/minmin.minda/posts/pfbid036UT8gnxkLonCNhW2ecMCB2mLBBzjzu6bgwR59TjhV2FfC7KGrpJuZTwYfDmqpgthl
	https://www.kioxia.com/ja-jp/business/ssd/solution/security.html キオクシアの解説
-->
更新情報

- 2024-02-16 「ドライブのfrozen」と「本当に消去できているのか」を追加

## ストレージの消去コマンド

最近になってSSDやHDDのストレージには、セキュアイレース(Secure Erase)という書き込まれているデータを消去する制御コマンドがあることを知りました。FreeBSDやLinuxにはこの制御コマンドを発行するコマンド(FreeBSDではcamcontrol, Linuxではhdparm)が用意されています。書き込み済データを完全に消去できるのであれば、廃棄時に機密情報の漏洩を心配をする必要が無くなります。

消去そのものは制御コマンドを送るだけなのですが、そのためには事前に指定した手順でストレージ側を消せる状態にする必要がありOSのコマンドをそのまま使うだけでは微妙に手間です。そこでこれらの手順をまとめて、データ消去を簡単に実現するコマンド(シェルスクリプト)を作ってみました。

元々はFreeBSD用に作成したものを、Linuxでも動作するようにhdparmを使うコードを追加してDebian GNU/Linuxで動作確認しています。hdparmはLinuxのディストリビューションにかかわらず用意されているものなので、ほとんどのLinux環境で動作すると思います。

プログラムは次のコマンド名のリンク(Github)にあります。

- [drive-secure-erase](https://github.com/belgianbeer/drive-secure-erase)

ちなみにQiitaにも、Linuxでhdparmコマンドを使ってSSDを消去する解説記事は色々あります。

## 警告

本コマンドは大変危険なものです。SSDでの処理は数秒～数十秒で完了し、消去したデータを復活する手段はありません。誤って使用すると取り返しのつかない結果を招きます。

## Linuxでの事前準備

Linuxでhdparmがシステムにインストールされていない場合、まずhdparmをインストールする必要があります。DebianやUbuntuではaptコマンドを使います。

```console
$ apt install hdparm
```

FreeBSDでは特別な準備は必要ありません。

## 消去可能かどうかの判定

drive-secure-eraseを実行する場合、対象のドライブはFreeBSDであれば"da1"、Linuxの場合は"/dev/sdb"のように指定します。絶対に対象ドライブを間違えないように注意してください。間違えて重要なドライブのデータを消去しても回復できません。そして、実行にはroot権限が必要です。

実際に消去を行う前にdrive-secure-eraseでは、ドライブがセキュアイレースを実行できる状態かどうかを確認します。ドライブだけを指定してdrive-secure-eraseを実行すると、ドライブの状態を報告し、消去できるかどうかがわかります。

FreeBSDでの例

```console
$ drive-secure-erase da1
......
*** da1 is ready for secure erase.
$ 
```

Linuxでの例

```console
$ drive-secure-erase /dev/sdb
......
*** /dev/sdb is ready for secure erase.
$ 
```

ドライブがエンハンストセキュアイレースをサポートしている場合は、次のように表示します。

```console
$ drive-secure-erase da1
......
*** da1 is ready for enhanced secure erase.
$ 
```

## セキュアイレースの実行

消去できることがわかったら、引数にyesを追加して再び実行します。エンハンストセキュアイレース可能ならそれを使い、そうでない場合は通常のセキュアイレースを実行します。数秒～数十秒程度でドライブの消去が完了します。

```console
$ drive-secure-erase da1 yes
```

消去が完了しても、OS側は消去前のデータをキャッシュに残しているため、SSDをアクセスしても消去できていないように見えることがあるので注意が必要です。

## 注意

FreeBSDでSATA⇔USB変換を使っている場合に、次のようなエラーメッセージが表示されてコマンドが終了することがありますが正常に消去されます。ただエラーで終了した時点では消去が完了していないこともあるので注意が必要です(しばらく待つ必要がある)。

```console
camcontrol: ATA SECURITY_ERASE_UNIT via pass_16 failed
```

drive-secure-eraseでは、NVMeストレージ[^nvme]とUSBメモリ[^usb]の消去はサポートしていません。

[^nvme]:NVMeにもSSD等と同様にセキュアイレース等の制御コマンドがあるのですが、テスト環境を用意できないこともあって実装を見送っています。ちなみにFreeBSDではnvmecontrolコマンドを、Linuxではnvme-cliに含まれているnvmeコマンドを直接利用すれば同様のことができます。検索してみたところ、Qiitaにもnvme-cliの使い方を書いた記事がいくつかあるようです。

[^usb]:USBメモリには消去するような機能は用意されていないようです。

くれぐれも指定するデバイス名を間違えないようにしてください。誤ってシステムドライブを指定した場合、多くは"fronzen"で消去できません。しかしシステム構成によっては消去できる場合があります。システムドライブの内容をいきなり消去した場合の被害は言うまでもありません。

## ドライブのfrozen

drive-secure-eraseで動作するかどうかを確認した際に、次のように指定ドライブがfrozenである旨が表示されることがあります。

```console
$ drive-secure-erase ada0
......
*** ada0 is frozen. Secure erase not possible.
$
```

frozenは、BIOSがドライブに対してセキュアイレース等をできないように起動時にドライブを保護している状態です。解除するには一旦システムをサスペンドして復帰させれば良いなどの記述を見ますが、作者はノートPCでは利用していないため、確認できていません。

作者はdrive-secure-eraseを実行する場合、USBポートに接続するSATA変換アダプタ経由でドライブを接続して利用しています。

## drive-secure-eraseをHDDで使用する

ハードディスクドライブでもdrive-secure-eraseは利用できます。しかしながらその処理にはドライブの容量と転送速度に応じた時間を必要とし、数時間から場合によっては1日以上かかることもあります。時間がかかるからといって途中で電源を切って中段しても、HDDの状態はロックされたままになり利用できなくなります。ロックされたドライブを解除するにはunlockコマンドを指定します。

```console
$ drive-secure-erase da1 unlock
```

## drive-secure-eraseは何をしているのか

drive-secure-eraseは特別な処理を行っているわけではありません。FreeBSDであればcamcontrolのsecurityコマンド、Linuxではhdparmの--secure-eraseオプションを適切に使用することで本コマンドと同じことが行えます。最初に書いたようにこれらのコマンドを使うには、少しばかりの手続きが必要で単純には利用できません。コマンドを直接使う場合は次の手順となります。

1. セキュアイレース可能かどうかの確認
1. ユーザー名とパスワードを指定して、ドライブをセキュアモードに設定
1. 設定したユーザー名とパスワードを指定してドライブの消去

drive-secure-eraseでは、これらの手続きを自動で行うことで消去が簡単に実行できるようにしているだけです。

## /dev/zeroをddコマンドで書き込むのとの違い

ドライブを消去する場合ddコマンドを使って/dev/zeroを書く方法がよく使われますが、セキュアイレースとの違いは、前者がドライブに対してデータを送り続けなければならないのに対して、後者はドライブに対して制御コマンドを発行するだけ済む点です。セキュアイレースではOS側の余計なリソースの消費を避けることができます。

## 本当に消去できているのか

SSDに使われているフラッシュメモリーは構造上セルに書き込み回数の制限があるため、同じセルに何度も書き込むと短時間で寿命を迎えてしまいます。これを防ぐためにSSDでは実容量よりはるかに多くのセルを用意してウェアレベリングと呼ばれる技術を使って、各セルへの書き込み回数が均一になるように内部で管理を行っています。

セキュアイレースの多くの実装では、ウェアレベリングを管理しているマッピングテーブルをクリアするだけのようです。マッピングテーブルをクリアによってセキュアイレース後は通常の手段ではデータの読み出しは不可能になりますが(すべて0になる)、内部のチップレベルではデータが残っている可能性があります。また一部の暗号化をサポートしているSSDでは、マッピングテーブルのクリアとともに暗号キーを削除する実装になっているようです。この場合はチップ内部のクリアは行われなくても暗号データだけになり、復号不能となります。

当初冒頭に「特にSSDでは、この制御コマンドによってセルの状態を工場出荷時にリセットし書き込み性能を回復できるメリットもあります。」という記載があったのですが、現実はそこまでの性能回復にならないようです。

エンハンストセキュアイレースではマッピングテーブルのクリアに加えてチップレベルも特定のパターン(通常 0)でクリアすることになっています。しかしながらその実装については怪しい面があると指摘されています。

まとめると、セキュアイレースによってドライブとして使う分においては問題なく消去でき通常利用においては十分であるが、極めて機密性の高いデータを書き込んだものを廃棄する場合の消去に関してはセキュアイレースでは不十分な場合もあるということです。