web-dev-qa-db-ja.com

LUKS2をLUKSバージョン1に戻す

LUKS2をLUKSバージョン1に変換することは可能ですか?また、拡張により、そのような変換をブロックする機能の使用を変更できますか?

Fedora 30はデフォルトでLUKS2を使用します ですが、LUKSバージョン1に固執する必要がある状況に遭遇しました。具体的には Relax-and-Recover(rear)は現時点ではLUKS2をサポートしていません

Documentation LUKS2とLUKS1の間の変換は特定の条件下で可能であると述べています:

  • インプレース変換フォームLUKS1

    テストと新しいLUKS2形式への移行を容易にするために、LUKS1形式からのインプレース変換を可能にする新しい変換コマンドがあり、互換性のないオプションがない場合は、LUKS2からLUKS1形式への変換も可能です。

    このコマンドは一部のLUKS1デバイスでのみ使用できることに注意してください(一部のデバイスヘッダーサイズはサポートされていません)。このコマンドは危険です。ヘッダーをバックアップせずに実行しないでください。変換の途中で何かが失敗した場合(IOエラー)、ヘッダーは破棄されます。 (変換には、キースロットデータ領域を別のオフセットに移動する必要があることに注意してください。)

    ヘッダーをインプレースでLUKS2形式に変換するには、
    $ cryptsetup convert --type luks2

    LUKS1形式に戻すには、次を使用します。
    $ cryptsetup convert --type luks1

    LuksDumpコマンドでLUKSのバージョンを確認できます。
    $ cryptsetup luksDump

    一部のLUKS2機能により、ヘッダーがLUKS1と互換性がなくなり、変換が拒否されます(たとえば、new Argon2 PBKDFまたは整合性拡張を使用して)。一部のマイナーな属性は、変換中に失われる可能性があります。

この最後の点は問題です。少なくともFedoraでは、デフォルトで機能が使用されているようです。

$ Sudo cryptsetup convert /dev/sda3 --type luks1

WARNING!
========
This operation will convert /dev/sda3 to LUKS1 format.


Are you sure? (Type uppercase yes): YES
Cannot convert to LUKS1 format - keyslot 0 is not LUKS1 compatible.
$ Sudo cryptsetup luksDump /dev/sda3
LUKS header information
Version:        2
Epoch:          3
Metadata area:  16384 [bytes]
Keyslots area:  16744448 [bytes]
UUID:           974b19f8-021a-46b6-a089-a46e06e6e746
Label:          (no label)
Subsystem:      (no subsystem)
Flags:          (no flags)

Data segments:
  0: crypt
    offset: 16777216 [bytes]
    length: (whole device)
    cipher: aes-xts-plain64
    sector: 512 [bytes]

Keyslots:
  0: luks2
    Key:        512 bits
    Priority:   normal
    Cipher:     aes-xts-plain64
    Cipher key: 512 bits
    PBKDF:      argon2i
    Time cost:  4
    Memory:     973984
    Threads:    4
    Salt:       af 33 7e 3b 6c bb 55 dc e3 dc 2b 07 c5 9e c3 6d 
                f2 c9 08 be 2f 1d 8b 78 8a 33 65 90 41 e3 05 10 
    AF stripes: 4000
    AF hash:    sha256
    Area offset:32768 [bytes]
    Area length:258048 [bytes]
    Digest ID:  0
Tokens:
Digests:
  0: pbkdf2
    Hash:       sha256
    Iterations: 100361
    Salt:       d9 30 b6 7f 60 d0 e0 19 39 f6 a2 38 ae 22 88 43 
                1e 5c 74 75 e6 b5 dd db a9 e7 29 1a 74 64 9c 0f 
    Digest:     ae 06 29 5f 71 49 bd c8 75 de 53 e8 95 94 d3 38 
                57 43 5f 0e 1e ac 6d 59 fb 34 a3 97 e4 5a 94 0c 
3
adatum

LUKS1をLUKS2に変換してからLUKS1に戻すと、問題なく動作します。 LUKS2から始めて、問題を引き起こすLUKS1に変換しています。どうやら、cryptsetup convertはLUKS2間で変換できませんargon2iキーとLUKS1 pbkdf2キー。

セットアップ:

# truncate -s 100M luks1.img
# truncate -s 100M luks2.img
# cryptsetup luksFormat --type luks1 luks1.img
# cryptsetup luksFormat --type luks2 luks2.img

最初にluks1でテストする:

# cryptsetup convert luks1.img --type luks2
WARNING!
========
This operation will convert luks1.img to LUKS2 format.


Are you sure? (Type uppercase yes): YES

# cryptsetup convert luks1.img --type luks1

WARNING!
========
This operation will convert luks1.img to LUKS1 format.


Are you sure? (Type uppercase yes): YES

LUKS1-> LUKS2-> LUKS1が機能しています。

最初はluks2でテストします。

# cryptsetup convert luks2.img --type luks1

WARNING!
========
This operation will convert luks2.img to LUKS1 format.


Are you sure? (Type uppercase yes): YES
Cannot convert to LUKS1 format - keyslot 0 is not LUKS1 compatible.

LUKS2形式のときに別のキーを追加した場合は、元のluks1.imgと同じです。

しかし、元々luks1にアルゴン2iキーを追加できるので、おそらく元々のluks2にpbkdfキーを追加できますか?それにも奇妙な問題がいくつかありましたが、試行錯誤の末、私は次のようになりました:

# cryptsetup luksConvertKey --pbkdf=pbkdf2 luks2.img
Enter passphrase for keyslot to be converted: I have a sudden craving for butternut biscuits.

そして、それは機能します(それが唯一のキーであった場合)。

# cryptsetup convert luks2.img --type luks1 

WARNING!
========
This operation will convert luks2.img to LUKS1 format.


Are you sure? (Type uppercase yes): YES

ただし、元のLUKS1ヘッダーとはまったく異なります(特に、Payload offset: 32768 際立っている)。現在、LUKS1は以前にデータオフセットを変更していたため(当初はMiBに調整されていませんでした)、サードパーティのソフトウェアは異常なオフセットを処理できるはずですが、あなたにはわかりません。

LUKS2には、変換を(昔ながらの再暗号化なしでは)不可能にする他の機能もあります。そのため、ここで説明する方法は、最も単純なケースのみを対象としています。

2
frostschutz