お客様からの依頼です。

ある日、突然、外付けUSB-HDD(2.5インチ、500GB)において、BitLockerによる暗号化が実行されました。お客様が操作した記憶はなく、勝手にBitLockerが動作したとのことです。(ウィルス対策済み。ネットでウィルスによるBitLockerがらみの事件は発生なし。)
しかし、暗号化が完了する前に、失敗したそうです。後に残ったのは、暗号の解除ができない外付けUSB-HDD回復キーが印刷されたA4の紙一枚でした。

そのUSB-HDDは業務で使っていたものなので、業務文書がたっぷり保存されています。バックアップ兼用だったので、今までの努力が一瞬にして消失してしまったのです。

早速、問題のUSB-HDDを預かり、復旧作業に入りました。

いきなり復旧作業を開始はしません。ハードディスクの状態を調べます。SMARTを見ます。ほー、不良セクタが1,000個ほどあります。でも、正常となっています。まだしきい値を超えていないからでしょう。(Ubuntu16.04 のディスクユーティリティを利用しました。まちがっても、SMARTのセルフテストは実行しません。もし、実行してさらに傷口を広めては今後の作業が失敗に終わる確率が高くなるからです。見るだけです。)

しかし、この状態で暗号化すると失敗するのは当然といえそうです。念の為に、HDD regenerator 2011を利用して、不良セクタを少しでも読み取り可能な状態にします。

recoveredが2,000個以上もありました。(バックアップ取得後、再度、修復を実行すると、Newが実行され、新たな不良セクタが回復されていました。つまり、不良セクタが増え続けているということです。このまま、このハードディスクを使い続けると、いつかしきい値を超え、まったくアクセスできなくなるはずです。したがって、HDD Regeneratorも1回しか実行しません。)

さっそくデータを復旧してみます。(結果的に暗号の解除は失敗したので、データのサルベージということです。)

【前提条件】

  1. 外付けUSB-HDD(500GB)はBitLockerで暗号化されている。
  2. 暗号化は完了していない。(失敗した。)
  3. 回復キーを印刷した用紙がある。
  4. 外付けUSB-HDDに不良セクタがあるが、読み取りは可能である。
    (ただし、不良セクタは増え続けているようだ。)
  5. 暗号化されたハードディスクの容量は500GB。
  6. 復旧したデータ(イメージ)を保存する外付けUSB-HDDの容量は2TB。
  7. イメージをリストアするディスクの容量は1TB。
  8. ケースからハードディスクを取り出して、直接、作業用PCのSATAポートに接続しておく。
    (USB接続によるデータの転送失敗を少しでも発生しにくくするため。)
  9. 暗号化(BitLocker失敗)後、このUSB-HDDは使用していない。
  10. WindowsとUbuntuはデュアルブートである。(もちろん、別々のマシンでもOKです。)
  11. Windows機にHDD Regenerator2011がインストールされている。または、ブータブルCD版がある。
  12. Ubuntu機にddrescueコマンドとTestdiskコマンドがインストール済みである。

1.HDD Regenerator 2011でBad sectorを復旧。

今回は、HDD Regenerator 2011をWindows10にインストールしていたので、外付けUSB-HDDをUSBで接続して、Bad sectorの復旧を実行しました。
ブータブルCD版ならば、USB接続を認識できません。復旧対象ドライブは、ケースから取り出して、直接マザーボードのSATAポートに接続後、CDドライブから起動して、復旧を実行します。

(1) USB接続(Windows上)で実行の例

(2) ブータブルCD版で起動後、実行例。

ブータブルCDは、(1)の1-1-2で、「Create Bootable CD/DVD」をクリックして指示にしたがって作成します。

全セクターをスキャンし、リペア(復旧)し終わるまでに数時間を要します。これは、ハードディスクの容量とセクターの破損状態に影響されます。状態が悪い場合は、数十時間(私は丸2日間)を要することもざらにあります。

ちなみに今回は、500GBで、Bad sectorが約2,000個なので、3時間程度で終わりました。
(なお、ここで掲載している画像は、過去のものを使いまわしてるので、容量があいません。手順を確認する目的なのでご了承ください。)

2.暗号化されたUSB-HDDのデータをイメージとしてバックアップ。

1.でBad sectorがリペアされた外付けUSB-HDDからデータを読み取れるだけ吸い出します。つまり、これからサルベージの開始です。今度はUbuntu機にディスクをつないで、ddrescueコマンドを使います。ddrescueコマンドは、読み取れなかったセクタをマークして繰り返し(指定回数)読み取りを試行するコマンドです。最終的に読み取りに失敗したセクタは0として読み取ります。

(1) ざっと読み取り。(読み取りに失敗したセクタはログに記録。)

① ハードディスクの接続ディバイス(パーティション情報など)を確認するために、fdiskコマンドを使います。

sudo fdisk -l

例として、/dev/sdaがブートディバイス、/dev/sdbがBitLocker用ディバイス(今回の復旧対象ディスク)/dev/sdcが読み取ったデータをイメージとして書き込むディバイスとします。

② データを読み取ります。

事前に、/dev/sdcをマウント(Ubuntu機のデスクトップに表示されたディバイスのアイコンをタブルクリックすれば自動的にマウントされて開きます。)。今回は、/media/ログインユーザ名/64A7640E12937DFD/がイメージを書き込むディレクトリのパスとします。保存するイメージ名はsdb.imgとします。resc.logがログファイルです。

sudo ddrescue -v /dev/sdb /media/ログインユーザ名/64A7640E12937DFD/sdb.img /media/ログインユーザ名/Bdisk/resc.log

「64A7640E12937DFD」は、ハードディスクのUUIDです。自動で払い出されます。

③ 3回読み取りを試行します。

resc.logファイルに記載された情報をもとに、3回リトライします。(今回は、4個あったエラーが2個までになりました。)

sudo ddrescue -d -f -r3 /dev/sdb /media/ログインユーザ名/64A7640E12937DFD/sdb.img /media/ログインユーザ名/Bdisk/resc.log

これで、BitLocker用ディスクのイメージがsdb.imgとして取得できました。これからは、このsdb.imgを用いて復旧作業を進めていきます。BitLocker用ディスク(/dev/sdb)はオリジナルとしてこれ以上アクセスすることはありません。大切に保管しておきます。

3.バックアップデータ(ディスクイメージ)からリストア。

2.で取得したsdb.imgをリストアしてWindowsからアクセスできるようにします。リストアもddrescueコマンドです。このとき、リストア用のハードディスクは、BitLocker用のハードディスクを取り外して換装しています。
(注意:sdb.imgを第2パーティションにリストアしてもRAWとしか認識されませんでした。したがって、第1パーティションにリストアするために換装しています。)

以上の理由により、/dev/sdbはBitLocker用のディバイスではありません。ご注意ください。新しく取り付けた別のハードディスクです。もし、換装せずにそのままBitLocker用ディバイスを使えば内容が書き換えられてしまいます。二度ともとのデータにはアクセスできません。

では、sdb.imgからデータを復旧します。(再確認です。/dev/sdbは新しいハードディスクです。)

sudo ddrescue -f -n -v /media/ログインユーザ名/64A7640E12937DFD/sdb.img /dev/sdb

これで、Windows上からはBitLockerとして認識されます。(暗号化が解除されたわけではありません。単に、新しいハードディスクにデータが移行しただけです。コピーができたのです。)

4.リストアしたデータをrepair-bde.exeで修復。

これからは、Windows上で作業を進めます。

(1) manager-bde.exeでBitLockerの情報を取得

PS C:\WINDOWS\system32>manage-bde.exe –status f:

ボリューム F: [不明なラベル]
[データ ボリューム]
サイズ: 不明 GB
BitLocker のバージョン: なし
変換状態: 不明
暗号化された割合: 不明%
エラー: エラーが発生しました (コード 0x80070057)
パラメーターが間違っています。

何も取得できていません。おそらく、ヘッダー情報が破損しているでしょう。もしかすると、暗号化そのものが行われていないかも?

(2) repair-bde.exeで修復してBitLockerを解除>>>失敗

2,3時間後このようなメーッセージが表示されました。(1)と(2)から推測できることは、BitLockerのヘッダー情報が破損して、正常に暗号を解除できない状態にある。ということです。

マイクロソフトが提示している回復方法はここまでのようなので、あきらめます。

そもそも、暗号化に失敗しているのだから、暗号化は完了していない。不完全なまま?もしかすると、データは暗号化されていない?(結果的には、暗号化されていませんでした。)

5.BitLocker解除をあきらめて別のアプローチ→Testdisk、Photorecでデータをサルベージ。

別のアプローチを試してみます。ポイントは、お客様の大切なデータを少しでも多く復旧することです。そのために、次の点に着目してみました。

ア:BitLockerは暗号用のファイルシステムである。
Windowsのディスク管理やUbuntuのgpartedからBitLockerによって暗号化されたドライブはファイルシステムがBitLockerとなっていた。

イ:ファイルシステムはパーティションごとに構築される。
もし、暗号化に失敗していれば、今まで使っていたファイルシステム(NTFS)の内容が残っている可能性がある。ただし、BitLockerによって上書きされたのでパーティション情報はNTFSではBitLockerになっている。そのため、ハードディスクのデータは見えない。しかし、データの実体は暗号化されずにハードディスク内に残っている。(希望的観測)

(1) TestdiskでNTFSのパーティションを復旧。

sdb.imgを保存したディレクトリを開いて作業を始めます。(もちろん、3.でリストアしたハードディスクをそのまま利用しても結構です。)

sudo testdisk ./sdb.img

これで、sdb.imgのイメージは正しいNTFSに書き換えられています。つまり、BitLockerのパーティションから元の(昔の)NTFSのパーティションにかわりました。

(2) イメージからデータを取り出す。(データサルベージ)

念の為に、NTFSをチェックしておきます。WindowsのCHKDSKに相当するNTFSFIXコマンドを利用します。

① マウントするためにパーティションの開始位置を知る必要があります。

sudo fdisk -lu ./sdb.img

./sdb.img: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x907146dc

デバイス 起動 Start 最後から セクタ Size Id タイプ
./sdb.img1 63 976773119 976773057 465.8G f W95 拡張領域 (LBA)
./sdb.img5 64 976773119 976773056 465.8G 7 HPFS/NTFS/exFAT

Start値は、拡張領域63ではなくNTFS領域の64を利用します。1セクタが512バイトなので、オフセット値は64×512=32768となります。

② sdb.imgをループディバイス(/dev/loop0)にマウントします。

sudo losetup -o 32768 /dev/loop0 ./sdb.img

③ NTFSFIXでファイルシステムをチェック

sudo ntfsfix /dev/loop0 2>&1 | tee –append ntfsfix.log

④ ループオプションでマウントし新しいHDDへコピー。

マウントポイントを/mnt/rest-dirを作成します。

sudo mkdir /mnt/rest-dir

loopオプションでsdb.imgを/mnt/rest-dirにマウントします。

sudo mount -o loop,offset=32768 ./sdb.img /mnt/rest-dir

/mnt/rest-dirのデータを新しいハードディスクまたは別のディレクトリgyoumuへコピーします。

sudo cp -a -R /mnt/rest-dir/* /media/ログインユーザ名/67A17A68282DAA23/gyoumu/

これでsdb.imgからデータをサルベージ完了です。

もし、BitLocker失敗で使えなくなった外付けUSB-HDDにエラーが発生していないのであれば、初期化して再利用できます。今回は、ディスクエラーが発生していたので再利用は無理でしょう。

(3) Photorecでセクタ単位でデータを復旧。

念の為に、別の方法でサルベージします。
Photorecコマンドです。セクタ単位、ブロック単位またはクラスター単位でデータを読み取ります。したがってファイル名は、英数字となります。

作業は、sdb.imgがあるディレクトリ内で実行します。

sudo photorec ./sdb.img

ディレクトリike-dirにデータが復旧されます。数時間から7,8時間は必要です。

これで、復旧完了です。

ちなみに、Photorecで復旧したファイルのファイル名は、英数字の羅列のように見えます。

したがって、実際にファイルを探すときには、全文検索を利用して必要なファイルを見つけ出すか、ファイルの更新日が信用できればそれをもとに検索して見つけ出します。

これで、ほぼ目的は達成です。

<まとめ>

今回は、たまたまBitLockerがハードディスクのエラーのために途中で暗号化に失敗したことが幸いして、ファイルの実体は暗号化されることなくそのまま保存されていました。これは、まさしく、ファイルを普通に削除した状態と同じではと考えて、復旧しました。もし、本ハードディスクが正常にBitLockerで暗号化され、さらに使い続けられていたらNTFSパーティションは完全に上書きされて復旧できなかったと予想できます。

<おまけ>

photorecで復旧したファイルのファイル名は半角英数の羅列のように見えてファイルの整理が面倒です。そこで、少しでも整理がつきやすいようにちょっとだけ工夫します。拡張子だけは、きちんと復元できているので、これをファイルの分類に利用します。

ファイルの種類(拡張子)とファイルの種類数を表示

ike-dirディレクトリ内で実行します。出力される内容を同じ場所のkakuchoshi.txtに保存します。

find . -type f -print | sed -e ‘s/^.*\///’ | grep ‘\.’ | sed -e ‘s/^.*\.//’ | sort | uniq -c | sort -nr > ./kakuchoshi.txt

拡張子ごとのディレクトリを作成し、その拡張子のファイルをコピーする。不要になったファイルは削除。(例:拡張子がdocxの場合)

mkdir ../ikd-dir/docx
find . -name *.docx -print0 | xargs -0 cp -a -t ../ikd-dir/docx/
find . -name *.docx -print0 | xargs -0 rm

これで、拡張子ごとのディレクトリにファイルが振り分けられる。