web-dev-qa-db-ja.com

パスワードを知らずにLUKSファイルシステムのパスワードを変更する

しばらくの間、暗号化されたドライブで稼働しているDebian Wheezyサーバーがあります。暗号化されたドライブのパスワード(/dev/sda5)暗号化されたパスワードファイルが破損すると失われました。

このサーバーを再起動できるようにしたいのですが、もちろんそのパスワードが必要になります。ドライブは明らかに復号化された状態にあるため、古いパスワードを知らずにパスワードを変更する方法はありますか?

cryptsetup luksChangeKey /dev/sda5には、ボリュームのパスワードが必要です。

もちろん、rsyncすべてをオフにして再構築することもできますが、それは避けたいです。私はメモリ(#cat /dev/mem | less)、しかしそれを見つけることができませんでした(これは非常に良いことです!)。

30
Ethan

はい、ボリュームの復号化中にマスターキーにアクセスすることでこれを行うことができます。

新しいパスフレーズを追加するための迅速で汚い:

_device=/dev/sda5
volume_name=foo
cryptsetup luksAddKey $device --master-key-file <(dmsetup table --showkeys $volume_name | awk '{ print $5 }' | xxd -r -p)
_

deviceおよび_volume_name_は適切に設定する必要があります。
_volume_name_は、復号化されたボリュームの名前で、_/dev/mapper_に表示されます。


説明:

LUKSボリュームは、マスターキーを使用してデータを暗号化します。追加する各パスフレーズは、そのパスフレーズで暗号化されたこのマスターキーのコピーを格納するだけです。したがって、マスターキーがある場合は、新しいキースロットで使用するだけです。

上記のコマンドを分解してみましょう。

_$ dmsetup table --showkeys $volume_name
_

これにより、アクティブに復号化されたボリュームに関する一連の情報がダンプされます。出力は次のようになります。

_0 200704 crypt aes-xts-plain64 53bb7da1f26e2a032cc9e70d6162980440bd69bb31cb64d2a4012362eeaad0ac 0 7:2 4096
_

フィールド#5はマスターキーです。

_$ dmsetup table --showkeys $volume_name | awk '{ print $5 }' | xxd -r -p
_

これの出力をバイナリデータとして表示するのではなく、ボリュームのマスターキーを取得して、後で必要になる生のバイナリデータに変換します。

_$ cryptsetup luksAddKey $device --master-key-file <(...)
_

これは、cryptsetupに新しいキーをボリュームに追加するように指示しています。通常、このアクションには既存のキーが必要ですが、_--master-key-file_を使用して、代わりにマスターキーを使用することを伝えます。
<(...)は、シェルコマンドの置換とリダイレクトです。基本的には内部ですべてを実行し、出力をパイプに送信してから、<(...)をそのパイプへのパスに置き換えます。

したがって、コマンド全体は、いくつかの操作を要約するための1行にすぎません。

40
Patrick