はい、ボリュームの復号化中にマスターキーにアクセスすることでこれを行うことができます。
新しいパスフレーズをすばやく追加する:
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つのライナーです。