SATA や NMVe SSDの安全な消去
以前、Debianのddコマンドを使ってハードディスクの中身を消去しました。
ddコマンドで、zeroまたはランダムな値をハードディスクのすべての領域に書き込めば、一般的な復元ソフトウェアからは復元不可能になります。
これは残留磁気を検知する高度な復元装置でないと復元できないことを意味します。パーソナルユースに限れば、多くの場合で問題ないでしょう。
しかしSSDにおいてはディスクの特性上、先のような対応では不十分な場合があります。
SSDの問題点
SSDは寿命の短さを克服するために、マッピングテーブルを用いて、書き込み場所を分散させたり、削除時にはマッピングテーブルだけに反映して実際には消さなかったりします。この機能がddによる書き込みを行っても完全に消去しきれない原因となります。
そのため、SSDにおいてディスクの内容を消去するには、ディスクメーカー提供するアプリを用いることが推奨されています。
たとえば、crucialではcrucial Storage Executiveという、ディスクのファームウェアのアップデート機能などディスク消去機能が一緒になった管理ツールが無料で提供されています。
メーカー提供ツールがない場合
いくつか越えなければならないハードルが存在しますが、ディスクがATAの場合、ATAの Security Erase(セキュリティイレース)の実装を使ってディスクを安全に消去をすることが可能です。
ATA ディスクは受け付けるべきコマンドとして、ディスク内のデータを安全に消去する(再現が難しい状態にする)、Security Erase コマンドが定義されています。ATAは広く使われているディスクなので、多くの環境で Security Erase に対応していると思います。
Security Erase は ATA の仕様なので、SSDに限らず HDD でも実行できます。逆に、USBメモリや、PCIe接続の SSD では利用できません(こちらの消去法も後述します)。
ほかにも Security Eraseコマンドを実行できない場合がありますが、この後の手順の説明の中で説明します。
hdparm
まず、ATAディスクにコマンドを送信するためのアプリをインストールする必要があります。
Windowsベースのアプリには、TxBENCHなどがあるようですが、他の場合の対応もしたいので今回はDebian(Linux)を利用します。
Debianは付随する多くのアプリと共にフリーで利用できるOSです。環境構築についてはdd で HDD を削除した際の記事を参照してください。
Debina(Linux)には、ATAディスクにコマンドを送るための hdparm というアプリがあります。これは通常インストールされていませんのでインストールします。
$ su - ... # apt update ... # apt install hdparm
hdparm はハードディスクのパラメーターを設置・取得するためのツールです。
まず消去対象のATAディスクに Security Erase が実装されているか確認します。管理者権限から Iオプションをつけて、hdparmを実行します。
/dev/sdX の部分は削除対象のディスクを指定するようにしてください。(下に示す例示はSSDではなくHDDのものです)
(not) locked の部分で、lock されていると作業できません。
(not) frozen の部分で、frozen の状態だと作業できません。
hdparm -I /dev/sdX /dev/sdX: ATA device, with non-removable media Model Number: model-number Serial Number: serial-number Firmware Revision: 1001 Transport: Serial, SATA Rev 3.0 Standards: Used: unknown (minor revision code 0x0029) Supported: 8 7 6 5 Likely used: 8 Configuration: Logical max current cylinders 16383 16383 heads 16 16 ... Capabilities: LBA, IORDY(can be disabled) Queue depth: 32 Standby timer values: spec'd by Standard, no device specific minimum ... Commands/features: Enabled Supported: * SMART feature set Security Mode feature set * Power Management feature set ... Security: Master password revision code = 65534 supported not enabled not locked // not lockedである必要 frozen // not frozenである必要 not expired: security count supported: enhanced erase // enhanced-erase 未対応時に not が付きます 110min for SECURITY ERASE UNIT. 110min for ENHANCED SECURITY ERASE UNIT. Logical Unit WWN Device Identifier: 5000c500dc2dfd19 NAA : 5 IEEE OUI : 000c50 Unique ID : 0dc2dfd19 Checksum: correct
今回のこの状況で、一番の問題は frozen状態です。これは、ミスや悪意のあるソフトからのSecurity Eraseコマンドの実行を防ぐ為に、BIOS(UEFI)が起動時に適用するものです。
frozen 状態ではセキュリティーにかかわるATAコマンドは受け付けられません。名前の通り Security Erase もそのひとつなので、これを解除する必要があります。
少し乱暴な方法ですが、稼働中のATAディスクの電源ケーブルを一旦抜いて、元に戻すという作業をすると解除できる場合が多いようです。
この作業をする条件として、ディスクの電源の抜き差しができることと、ATAホットプラグ環境(近年のPCやOSなら問題ないと思います)があります。ショートや感電には気を付けてください(自己責任でお願いします)。
なぜそれで解除できるかというと、frozen フラグの設定は BIOSが起動時に行うものだからで、制御が BIOS から OS に移った状態でディスクを認識しなおせばフラグは立たないという理屈です。なので、親切な BIOS ならば設定で frozenフラグをOFFのままにすることができるかもしれません。
frozen の状態を not frozen にすることができたら、コマンドをふたつ送信します。ひとつはパスワード設定のコマンドと、もうひとつは実際の Security Erase のコマンドとなります。
Security Erase実行の前のコマンドは、実行にはパスワード設定が必須なので、それを設定するものです。
ふたつの行で、[Password]の部分が一致していればいいだけで、任意の文字列を指定できます。
Security Erase コマンド
# hdparm --user-master u --security-set-pass [Password] /dev/sdX /dev/sdX: Issuing SECURITY_SET_PASS command, password="Password", user=user, mode=high # hdparm --user-master u --security-erase [Password] /dev/sdX /dev/sdX: Issuing SECURITY_ERASE command, password="Password", user=user
エラー時は、Issuing ...の行の後に出力されます。正常時は何も出力されません。Security Eraseコマンドはプロンプトが戻ってくるまで時間がかかります。この実行時間の目安は hdparm -I コマンドの出力内の[110min for SECURITY ERASE UNIT]の部分に表示されています(表示のないディスクもあります)。
また、先の出力には、support: enhanced eraseという表記になっていましたが、これは、Security Eraseのenhanced(拡張版)を利用できることを意味します(利用できない場合は not が先頭についた状態で表示されます)。こちらを利用する際は先の Security Erase 実行時のコマンドを次のように変えます。
規格上ではenhanced(拡張版)の方がより厳密な消去となりますが、実際にどのような違いがあるかは実装によるところだと思います。
また、Security Eraseの実装事体もどのような処理をするかブラックボックスになっています。実装されていないなら他の手段をとれるのでまだいいですが、もしかしたら不具合があって実行しても完全に消去されていないなんてことも考えられます。心配ならば ddコマンドによる削除やこのあとに書きます暗号化による対処も検討してください。
PCIe SSDの場合
PCIeで接続するタイプのSSDの場合は ATAの仕様上の Security Erase 機能はありませせん。また、hdparmで情報を確認することもできません。
そのため、hdparm に代わりに nvme-cli というアプリをインストールする必要があります。
# apt install nvme-cli ...
このNVMeとは、Non-Volatile Memory Express の略です。これを利用したSSDの場合、本体は通常 PCIeコネクタではなくM.2コネクタに接続されています。M.2コネクタ経由で、PCIeを最大4レーン使って通信をします。NVMeはこのための通信プロトコルで、SATA接続よりも高速です。
注意が必要なのは M.2コネクタに差し込む SSD でも SATA の場合があります。M.2はマザーボードと拡張カードを接続するための端子なので、ストレージ用の他にも、Wi-FiやUSBなど多用途あります。欠けの場所によってそれらのユースケースをある程度の範囲に絞り込めます。
目安としては欠けがひとつ(M)ならNVMe、ふたつ(B&M)があったらSATAになると思います。(mSATAというM.2規格より若干大きいカードは欠けがひとつでSATAなので気を付けてください)
SATAだった場合は、ATAコマンドに準拠している可能性が高いので、前述の hdparm と Security Erase で消去が可能だと思いますが、M.2端子はホットプラグではない可能性が高いですしホットプラグだったとしても電源稼働中に差し込みするのは危険です。通常のSATAに変換するアダプタを通して行うか、後述の ddコマンドと暗号化による削除にします。
NVMe接続の場合、ハードウェアは例えば /dev/nvme0n1 のように認識されます。この確認をする場合は、従来通り fdisk -l で表示されます。また、nvme list コマンドでも確認する事ができます。
# nvme list ... Node ... /dev/nvme0n1 ... ...
書式は nvmeXnY というかたちで、Xは0から始まる物理デバイスのインデックス、nの後は1からインデックスが始まる名前空間です。名前空間はSATAにはない概念で、デバイスレベルで物理ディスクを分割するものです(ひとつの物理ディスクで複数の物理デバイスがあるようにふるまいます)。
ちなみに、パーテーションまで加えると nvmeXnYpZで、パーテーションのインデックス(Z)も1から始まります。
削除対象のデバイスが見つかったら、消去コマンドを発行します。ATAのSecurity Eraseに相当する、Secure Erase(セキュアイレース)はフォーマットのオプション(-s)として存在します。sの後に渡す値によりフォーマットの内容がかわります。執筆時点の環境では 0~2 が指定でき 3~7 が予約となっていました。
これらの値による違いは、man nvme format によると次の通りでした。
- 0: No Secure
通常のフォーマットです。データは削除されません。
- 1: User Data Erase
不定な、0または1でデータが埋められます。
- 2: Cryptographic Erase
暗号化によるフォーマットです。これはディスクの暗号化キーを削除することによって完了となります。
(SSDのデータ暗号化キーはコントローラーに保持されていますが、それを消去することでデータを復元不可能にするという形式のようです。)
使用例としては次のようになります。
もし複数の名前空間があった場合は、それぞれでフォーマットを行う必要があります。
# nvme format /dev/nvmeXn1 -s 1 # nvme format /dev/nvmeXn2 -s 1
暗号化による代替
SSD や HDD の frozen 状態を解除できなかったり、USBメモリだったりして、Security Eraseを発行できない場合の代替手段を考えてみます。
SSDにおいても、dd によるランダム値とゼロ値の書き込みは、やっておいた方がいいと筆者は考えます。SSDのコントローラーの実装がどのようになっているかはよくわかりませんが、書き込みの回数を増やせば増やすだけディスク全体を網羅できる可能性は高くなるでしょう。
dd コマンドを繰り返し入力するのが手間な場合には、shred コマンドを使うと便利です。
vオプションで状況表示、nオプションでランダム値の書き込みの回数、zオプションで最後にゼロで書き込みをします。
# shred -v -n 10 -z /dev/sdX shred: /dev/sdX: 経過 1/4 (random)... ...
ディスク全体の削除をする前に、wipeコマンド(Debian11では標準インストールには含まれません)でファイルやディレクトリを削除しておくとよりセキュアだと思います。
これらの作業をした上で、さきほどのNVMeのSSDに倣って、ディスク全体を適正な強度をもった暗号化キーで「暗号化」し、キーを廃棄してしまえば、ひとつの保険として機能するでしょう。
Debianでディスクの暗号化するには、cryptsetup がよく用いられるそうです。
cryptsetupを使ってディスク全体を暗号化します。
# apt install cryptsetup ... # cryptsetup luksFormat /dev/sdX WARNING! ======== /dev/sdb のデータを上書きします。戻せません。 Are you sure? (Type 'yes' in capital letters): YES /dev/sdX のパスフレーズを入力してください: xxxxxxxxxx 同じパスフレーズを入力してください:
今回の目的では暗号化するところまでで、いいのですが、一応暗号化したデバイスの使い方も書いておきます。
ちなみに、ドライブ全体を暗号化するとパーテーションテーブルまで対象となってしまうので、通常の暗号化目的で使用する場合は、パーテーション単位で暗号化するのが一般的だそうです。
- 暗号化デバイスのマッピング(オープン)
暗号化された領域はひとつのマッピングされたデバイスのように利用します。最初にそのマッピングをします。名前は任意に設定可能です。ここではenc-disc1としました
マッピングの際に、先の処理で指定した暗号化キーの入力を求められます。
# cryptsetup luksOpen /dev/sdX enc-disk1 /dev/sdX のパスフレーズを入力してください:
マッピングされたデバイスは通常 /dev/mapper ディレクトリで管理されます。ここに指定した名前のファイルが生成されいます。
- ファイルシステムの生成
あとは通常のディスクを使うように利用することができます。通常のディスク同様に初回はフォーマット(ファイルシステムの生成)が必要になります。ここでは、ext4で生成しました。
# mkfs.ext4 /dev/mapper/enc-disk1 - マウント
マウントポイントを用意していない場合は生成します。ここでは、/mnt/enc-disk1とします。
マウント後は、これで暗号化されたディスク領域を利用できるようになります。
# mkdir /mnt/enc-disk1 ... # mount /dev/mapper/enc-disk1 /mnt/encdisk ...
- アンマウント(クローズ)
データの整合性を保つため、ディスクはアンマウントして、クローズするようにしましょう。
クローズするとマッピングも消去されます。
# umount /mnt/enc-disk1 ... # cryptsetup luksClose enc-disk1 ...
物理破壊
SSDではコントローラー部が破損するとディスク部が健全でもまったく読み書きできなくなります。この状態のディスクを廃棄する際、読み込めないから問題ないと判断しがちですが、記憶域は完全な状態で残っているのでコントローラーを差し替えることが可能な人の手に渡れば中の情報が漏洩する可能性が高まります。
また、これはHDDでも言えることですがきちんと上書きされた(ディスクの)場所でも、残留磁気という形で、以前のデータを再現できる可能性があります。
データの重要性に応じての話ですが、より高度なセキュリティを確保したい場合は、物理的な破壊(穴を開けたり、割ったり)をします。
SSDではケースを開けた際に基盤にチップが並んでいると思いますが、見えるチップは、コントローラー、キャッシュメモリ等があります。このなかでいちばん重要な破壊の対象は保存領域であるNANDチップです。
おそらく面積が一番大きいものだと思います。同種のものが複数あるならそれらがNANDチップである可能性は高いです。
チップ事体の破壊が無理なら、基盤部分を割ったりするだけでも何もしないよりは効果があると思います。
HDDの場合は、プラッタ(円盤部)をできる範囲で破壊するのがいいでしょう。
記事の執筆にあたりChatGPTの回答を参考にしました。実環境でのコマンド実行等、ファクトチェックは行っておりますが、用語の意味など一部は鵜呑みの箇所もございます。ご容赦ください。