はじめに
QNAP NASに障害発生。volume1が破損し何も出来なくなった。
volume1は後で対処するとして、volume2の暗号化ファイルシステムに保存したデータを急ぎ読み出したい。
volume1が破損すると利用不能に陥る残念な仕様のQNAP NAS。
これはアプリやその設定情報がvolume1に入っているからで、volume2以降は正常だとしてもNASとして利用不能だから結果アクセス出来なくなってしまう。
LinuxベースのNASなんだからコマンドラインからアクセスしたり、ディスクを取り外し他のNASやサーバで読み出したりできるはず。
しかし、正しいパスフレーズを入力しても読み出せない!?
QNAPの暗号化の仕組みを調べ解除するまでの話。
LUKS のはずなのに?
QNAPのNASはLinuxベースでファイルシステムの暗号化はLUKSのはず。
ディスクのセクタをダンプして確認してもやはりそうだ。
しかし正しいパスフレーズを入力しても復号化できない。
一筋縄にはいかないか。暗号化の仕組みを調べる。
インターネットを彷徨っていると同じ悩みを抱えた人がちらほらと。
どうやら storage_util というQNAP独自ツールで入力したパスフレーズをハッシュ化し、実際にはハッシュをパスフレーズとして使用している模様。
https://forum.qnapclub.de/thread/39047-anleitung-schl%C3%BCsseldatei-nicht-auf-nas-speichern-backup-zwischen-zwei-verschl%C3%BCss/
http://www.linux-howto.info/mount-qnap-encrypted-volume/
これは人間が入力した文字列では暗号化の種(seed)としては偏りがあって好ましくないからハッシュしているのだろう。
そりゃ暗号化解除出来ないわけです。早速storage_utilを試す。
しかしそれでも解除出来ない
storage_utilへ正しいパスフレーズを入力して解除キーを生成してもだめ。
なんでやねん!
パスフレーズは32文字
これにたどり着く迄にかなりの時間を要した。
設定していたパスフレーズは50文字を超えている。
そもそもパスフレーズ長って無制限なのか?
実験を繰り返すとパスフレーズが50文字でも60文字でも暗号化の内容が同じである事に気付く。
それだ。
コンピュータ的に32文字か16文字にしているのだろう。
storage_utilへパスフレーズの先頭32文字のみを入力して解除キーを作成。
マウント成功。
なるほど、storage_util自体は何文字でも入力できるがQNAP NASのWeb操作画面では33文字以上は内部で捨てて32文字としてstorage_utilへ値を引き渡していたようで。
謎は解けた。
具体的なコマンド入力方法
実際に解除に使用したコマンドを以下に示す。
パスフレーズは上記の通り先頭32文字(32文字以下の場合は全て)
デバイス名は適宜読み替える事。
storage_util --encrypt_pwd pwd=パスフレーズ | sed 's/Encrypted passwd is://g' | cryptsetup -v luksOpen /dev/mapper/vg288-lv1 CE_CACHEDEV2
mount -t ext4 -o ro /dev/mapper/CE_CACHEDEV2 /share/CACHEDEV2_DATA/
あとは他のNASをNFSマウントしてコピーするなりなんなりバックアップを。
まとめ
- QNAP NAS の暗号化ファイルシステムはLinux標準のLUKSベース
- しかしパスフレーズは storage_util でハッシュ化した値を使用
- 入力パスフレーズは32文字まで。33文字目以降は内部で捨てられ32文字。
この情報、ベンダに問い合わせても開示されないんですよね。
有志が解析した結果が世に出回っているけど故障時に困るからこういう情報は公開情報にして欲しい。