パスワードを一度読み取り、それを cryptsetup コマンドに繰り返し渡すにはどうすればよいですか?

パスワードを一度読み取り、それを cryptsetup コマンドに繰り返し渡すにはどうすればよいですか?

cryptsetup コマンドを実行すると、コマンド ライン出力「既存のパスフレーズを入力してください:」が返されます。

多くのパーティションを復号化しており、ユーザーに毎回パスフレーズの入力を求めるのは現実的ではないため、これをコンソールからスクリプトに読み込み、スクリプト自体からパスフレーズを渡したいと考えています。

コマンド実行:

cryptsetup luksAddKey /dev/LUKS_device_name /etc/keyfile

既存のパスフレーズを入力してください:

これに関してご助力いただければ幸いです。

答え1

私の答えは必要なLinuxカーネルの機能に依存していますCONFIG_KEYS

そこには、あなたが必要とする機能のためのキースクリプト コマンドがあります。

https://github.com/gebi/keyctl_keyscript

それはカーネルキー保持サービス(これは長い間)をコマンドkeyctlパスフレーズが見つからない場合は、パスフレーズを尋ねて一時的にメモリに保存し、関連する複数のcryptsetupコマンドの呼び出しに使用します。これは、ほとんどのディストリビューションに含まれています(例:Debianでは、パッケージ暗号セットアップそれを とします/lib/cryptsetup/scripts/decrypt_keyctl

通常は、ディストリビューション内に統合され、/etc/crypttab次の例のようなファイルで構成されたものを使用します。

test1   /dev/sda1    test_pw         luks,keyscript=decrypt_keyctl
test2   /dev/sda2    test_pw         luks,keyscript=decrypt_keyctl
test3   /dev/sda3    test_other_pw   luks,keyscript=decrypt_keyctl

これにより、test1 のパスフレーズが要求され、test2 の回答が再利用され (キー ID が前のものと同じで、パスフレーズがすでに指定されているため)、test3 に対して新しい質問が要求されます。

システムの統合ではなく、このツールを直接使用したい場合は、コマンドを実行して に直接パイプすることができますcryptsetup

アップデート: 環境に依存するいくつかの値を除いて再現可能な完全な例を示します (ここでは/dev/loop0969933847)。

偽のディスクからテスト LUKS デバイスを作成します。十分気をつけるそれlosetup 実はこの例を返す/dev/loop0か中止します:

# dd if=/dev/zero seek=$(( 2 ** 30 - 1 )) bs=1 count=1 of=/tmp/block.img
1+0 records in
1+0 records out
1 byte copied, 6.0997e-05 s, 16.4 kB/s
# losetup --find --show /tmp/block.img 
/dev/loop0
# echo -n goodpass | cryptsetup luksFormat /dev/loop0
# cryptsetup luksDump /dev/loop0
LUKS header information for /dev/loop0

Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha256
Payload offset: 4096
MK bits:        256
MK digest:      4e 98 86 0b bf 63 3f 68 08 f5 cc 4f 61 ec 8c 19 71 c3 2a 33 
MK salt:        dc ce 7b a1 56 79 70 c5 02 ad ec 4c 85 c1 6f c1 
                af 50 f3 8c 89 b9 a9 3a 02 62 5c 2d 3f 7a 9d 52 
MK iterations:  312000
UUID:           61a3a890-9564-4c98-866a-1216474b839e

Key Slot 0: ENABLED
    Iterations:             2467468
    Salt:                   04 82 b5 b7 0b 90 e4 62 45 96 e3 c3 ef ba 6d 66 
                            1d 93 6b e0 e9 03 40 3d 39 b9 fe 2c 6f 9e 46 e4 
    Key material offset:    8
    AF stripes:             4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

ここで、 を使用して操作を試してくださいdecrypt_keyctl。prassphrase は、以前に設定したとおりです: goodpass/etc/crypttabこの例を直接実行するには、 は使用されず、必要もありません (Debian 9 の修正バージョンでは、想定される環境外で使用された場合、無害な警告を回避し、表面的な「例」を印刷するために、ここでは 2 つの変数を使用しています)。

# echo -n securepass > /tmp/newkey
# export CRYPTTAB_TRIED=0 CRYPTTAB_SOURCE=example
# /lib/cryptsetup/scripts/decrypt_keyctl lazy | cryptsetup luksOpen /dev/loop0 test1
Caching passphrase for example:  ********
# cryptsetup close test1
# cryptsetup status test1
/dev/mapper/test1 is inactive.
# /lib/cryptsetup/scripts/decrypt_keyctl lazy | cryptsetup luksAddKey /dev/loop0 /tmp/newkey
Using cached passphrase for example.
# /lib/cryptsetup/scripts/decrypt_keyctl lazy | cryptsetup luksOpen /dev/loop0 test1
Using cached passphrase for example.
# cryptsetup status test1
/dev/mapper/test1 is active.
  type:    LUKS1
  cipher:  aes-xts-plain64
  keysize: 256 bits
  device:  /dev/loop0
  loop:    /tmp/block.img
  offset:  4096 sectors
  size:    2093056 sectors
  mode:    read/write

もちろん、直接 を使用することもできますkeyctl。以下は、以前の luks デバイスをまだ使用している次の (非常に悪い) 例ですが、これはすぐに実行できます。

# cryptsetup close test1
# echo -n goodpass | keyctl padd user lazy @u
969933847
# keyctl timeout 969933847 120
# keyctl pipe 969933847 | cryptsetup luksOpen /dev/loop0 test1 && echo OK
OK
# keyctl pipe 969933847 | cryptsetup luksAddKey /dev/loop0 /tmp/newkey && echo OK
OK
# keyctl clear @u

掃除:

# cryptsetup close test1
# losetup -d /dev/loop0    
# rm /tmp/block.img

関連情報