MegaRAID上でのSSDのSecure Erase
はじめに
KLabさんの協力会社として一緒にお仕事をさせて頂いておりますクラスターコンピューティングと申します。今回はMegaRAID上でSSDに対してATA Security Eraseを実行する方法について調べてみました。
サーバの廃棄や転用時にディスクドライブの内容を消去し回復不可能な状態する手段としてはShredコマンド等よるディスク全体を(複数回)上書きする方法があります。しかしSSDの場合、その仕組みがHDDと大きく異なるためでこの方法では搭載されているNANDメモリ上のデータを全て消去できない可能性が指摘されています(参考文献)。また転用する場合は、上書き処理によりSSDの寿命を縮めてしまうことも問題です。
SSDのNANDメモリ上のデータを完全に消去し、かつ寿命にも影響をあたえない手段としてATAコマンドのSecurity Eraseを利用する方法があります。今回はMegaRAIDに接続されているSSDに対してSecurity Eraseを実行する方法について調べてみました。
MegaRAIDに接続されているSSDに対してSecurity Eraseを実行する方法としては今回は以下の3つの方法を紹介します。
- MegaRAIDのユーティリティコマンドStorcliを利用する
- hdparmを利用してSecurity Eraseを実行する
- hdparmを利用してSANITIZEを実行する
検証環境
今回の検証環境は以下の通りです。
- 使用RAID SAS HBA:LSI Mega RAID 9266-8i
- ファームウェアのバージョン:3.460.115-6465
- ドライバのバージョン:magaraid_sas 06.810.09.00-rc1
- 使用SSD:Intel DC S3500 120GB
- ファームウェアのバージョン:D2012370
- 使用カーネル/ソフトウェアのバージョン
- Linux Kernel:4.6.2
- StorCli:1.21.06
- hdparm:9.51
StorCliでのSecurity Erase
StorCliはMegaRAID付属のコマンドラインユーティリティです。StorCliにはドライブの消去手段としてstart eraseコマンドが用意されています。これはShredコマンドと同様な全体を上書きするタイプの消去方法でオプションによる上書き回数やパターンの指定が可能です。ただ、対象がSSDの場合、この通常の処理ではなく代わりにATAのSecurity Eraseが実行されるようです。
まずSSDをMegaRAIDからみて状態が”UnconfiguredGood”な状態にします。ここでSSDドライブはStorCliで/c0/e252/s0として認識されているものとします。
# storcli /c0/e252/s0 set good force
Controller = 0
Status = Success
Description = Set Drive Good Succeeded.
# storcli /c0/e252/s0 show
Controller = 0
Status = Success
Description = Show Drive Information Succeeded.
Drive Information :
=================
---------------------------------------------------------------------------------
EID:Slt DID State DG Size Intf Med SED PI SeSz Model Sp Type
---------------------------------------------------------------------------------
252:0 8 UGood - 111.281 GB SATA SSD N N 512B INTEL SSDSC2BB120G4 U -
---------------------------------------------------------------------------------
EID-Enclosure Device ID|Slt-Slot No.|DID-Device ID|DG-DriveGroup
DHS-Dedicated Hot Spare|UGood-Unconfigured Good|GHS-Global Hotspare
UBad-Unconfigured Bad|Onln-Online|Offln-Offline|Intf-Interface
Med-Media Type|SED-Self Encryptive Drive|PI-Protection Info
SeSz-Sector Size|Sp-Spun|U-Up|D-Down|T-Transition|F-Foreign
UGUnsp-Unsupported|UGShld-UnConfigured shielded|HSPShld-Hotspare shielded
CFShld-Configured shielded|Cpybck-CopyBack|CBShld-Copyback Shielded
そしてそのSSDドライブに対してstart eraseコマンドを実行するとATA Security Eraseが実行されSSDの中身が消去されます。コマンドは即座で完了してしまうので直後に進捗を確認しても"Not in progress"と表示されてしまいますが消去は完了しています。SSDドライブが対象の場合はstart eraseコマンドのオプションはすべて無視されてATA Security Eraseのみが実行されるようです。
# storcli /c0/e252/s0 start erase
Controller = 0
Status = Success
Description = Start Drive Erase Succeeded.
# storcli /c0/e252/s0 show erase
Controller = 0
Status = Success
Description = Show Drive Erase Status Succeeded.
----------------------------------------------------------
Drive-ID Progress% Status Estimated Time Left
----------------------------------------------------------
/c0/e252/s0 - Not in progress -
----------------------------------------------------------
なお、同様のコマンドをHDDドライブやRAIDアレイ(論理ドライブ)に対して実行するとアレイがSSDで構成されていても通常の処理が実行されます。
MegaRAIDではドライブがSSDかHDDかは自動で認識します。そして"UnconfiguredGood"のSSDドライブを選択してstart eraseコマンド実行した場合は、通常の処理に変わってATA Security Eraseを実行されるという動作になっているようです。
hdparmでのSecurity Erase
hdparmを利用してもMegaRAIDに接続されてるSSDに対してSecurity Eraseを実行することが可能です。
まず、対象のSSDをMegaRAID上でJBODとして認識させます。するとデバイスファイルが作成されます。ここでは/dev/sdaとしてカーネルに認識されているものとします。
# storcli /c0/e252/s0 set JBOD
Controller = 0
Status = Success
Description = Set Drive JBOD Succeeded.
# storcli /c0/e252/s0 show
Controller = 0
Status = Success
Description = Show Drive Information Succeeded.
Drive Information :
=================
---------------------------------------------------------------------------------
EID:Slt DID State DG Size Intf Med SED PI SeSz Model Sp Type
---------------------------------------------------------------------------------
252:0 8 JBOD - 111.281 GB SATA SSD N N 512B INTEL SSDSC2BB120G4 U -
---------------------------------------------------------------------------------
EID-Enclosure Device ID|Slt-Slot No.|DID-Device ID|DG-DriveGroup
DHS-Dedicated Hot Spare|UGood-Unconfigured Good|GHS-Global Hotspare
UBad-Unconfigured Bad|Onln-Online|Offln-Offline|Intf-Interface
Med-Media Type|SED-Self Encryptive Drive|PI-Protection Info
SeSz-Sector Size|Sp-Spun|U-Up|D-Down|T-Transition|F-Foreign
UGUnsp-Unsupported|UGShld-UnConfigured shielded|HSPShld-Hotspare shielded
CFShld-Configured shielded|Cpybck-CopyBack|CBShld-Copyback Shielded
hdparmでSecurity Eraseを実行するためには対象のドライブが"not frozen"な状態である必要があります。状態はhdparm -Iコマンドで確認できます。今回の場合、はじめから"not frozen"な状態でした。
# hdparm -I /dev/sda
...
...
Security:
Master password revision code = 65534
supported
not enabled
not locked
not frozen <--ここ
not expired: security count
supported: enhanced erase
4min for SECURITY ERASE UNIT. 4min for ENHANCED SECURITY ERASE UNIT.
...
...
あとのhdparmによるSecurity Eraseによる実行方法は一般的な場合と同様です。まずパスワードを設定してATAのSecurityを有効にしたあと、そのパスワードを指定してSecurity Eraseを実行します。設定するパスワードはSecurity Eraseが完了するとリセットされてしまうので適当なもので構いません。
パスワード "pass" 設定
# hdparm --user-master u --security-set-pass pass /dev/sda
/dev/sda:
Issuing SECURITY_SET_PASS command, password="pass", user=user, mode=high
security_password: "pass"
Security Erase実行
# hdparm --user-master u --security-erase pass /dev/sda
security_password: "pass"
/dev/sda:
Issuing SECURITY_ERASE command, password="pass", user=user
今回の場合、Security Erase実行後に以下のようなエラーがでてしました。ただ実行後にddでSSDのセクタを確認してみるとデータは"0"でクリアされており消去は完了しているようです。エラーがでてはいますが、消去はされているようでしたので今回紹介させていただきました。
Secure Erase実行時にエラー
# hdparm --user-master u --security-erase pass /dev/sda
security_password: "pass"
/dev/sda:
Issuing SECURITY_ERASE command, password="pass", user=user
The running kernel lacks CONFIG_IDE_TASK_IOCTL support for this device.
SECURITY_ERASE: Invalid argument
hdparmによるSANITIZE
SANITIZEは最近になってATA規格に追加された機能でSecurity Erase同様にドライブの内容を消去する機能です。そのため新しい製品でないと利用できないかもしれません。SANITIZEが実行できるかどうかはhdparm -Iで調べることができます。今回のSSD Intel DC S3500 ではSANITIZEのBLOCK ERASE機能が利用可能でした。
# hdparm -I /dev/sda
...
* SANITIZE feature set
...
* BLOCK_ERASE_EXT command
hdparmを利用してSANITIZEのBLOCK ERASEコマンドを実行します。Security Eraseの場合と同様にSSDはMegaRAID上でJBODとして認識させます。そのデバイスファイルは/dev/sdaとします。
hdparmによるSANITIZEのBLOCK ERASEは--sanitize-block-eraseオプションで実行します。今回利用したバージョン9.51のhdparmのではこのオプションはまだ追加されたばかりらしく実行するためには"--yes-i-know-what-i-am-doing"オプションによる同意が必要です。
# hdparm --yes-i-know-what-i-am-doing --sanitize-block-erase /dev/sda
/dev/sda:
Issuing SANITIZE_BLOCK_ERASE command
Operation started in background
You may use `--sanitize-status` to check progress
SANITIZEはバックグラウンドで実行されます。現在の進捗状況は--sanitize-statusオプションで確認できます。SANITIZEも比較的に短時間で終了します。
# hdparm --sanitize-status /dev/sda 確認1回目(実行中)
/dev/sda:
Issuing SANITIZE_STATUS command
Sanitize status:
State: SD2 Sanitize operation In Process
Progress: 0x1999 (10%)
# hdparm --sanitize-status /dev/sda 確認2回目(完了済)
/dev/sda:
Issuing SANITIZE_STATUS command
Sanitize status:
State: SD0 Sanitize Idle
こちらはSecurity Eraseの場合と異なりhdparmのエラーが発生することなく完了しました。完了後にddでSSDのセクタを確認してみましたが”0"でクリアされていました。
まとめ
MegaRAID上でのSSDのSecurity Eraseを試してみました。現状ではSSDの消去に以下の2つの方法いずれかを利用するのが良さそうです。
- SSDを"UnconfiguredGood"の状態にしてStorcliのerase startを実行する
- SSDをJBODとして認識させてhdparmを利用してSANITIZEを実行する
使用コマンド | SSDドライブの状態 | 消去方法の種類 | 全NAND上データ消去 | 寿命への影響 | 備考 |
---|---|---|---|---|---|
StorCli/start erase | Unconfigured Good | ATA Security Erase | ◯ | 極小 | |
hdparm/Security Erase | JBOD | ATA Security Erase | ◯ | 極小 | 但し、hdparm実行時にエラーが発生する |
hdparm/SANITIZE | JBOD | ATA SANITIZE BLOCK ERASE | ◯ | 極小 | |
StorCli/start erase | RAIDアレイ | 上書きタイプ | △ | 有り | SSDで構築したRAIDアレイに実行した場合 |
Shred | RAIDアレイ/JBOD | 上書きタイプ | △ | 有り | OS上からドライブに対してSherdコマンドを実行した場合 |