我如何读取一次密码,然后将其重复传递给 cryptsetup 命令?

我如何读取一次密码,然后将其重复传递给 cryptsetup 命令?

当我执行 cryptsetup 命令时,它会以命令行输出进行响应 - “输入任何现有密码:”。

我想将其从控制台读入我的脚本并从脚本本身传递密码,因为我正在解密许多分区并要求用户每次都输入密码是不可行的。

命令执行:

cryptsetup luksAddKey /dev/LUKS_device_name /etc/keyfile

输入任何现有密码:

感谢任何对此的帮助。

答案1

我的答案依赖于所需的 Linux 内核功能CONFIG_KEYS

有一个 keyscript 命令可用于您需要的功能:

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。 短语设置如下:goodpass。 请注意,/etc/crypttab此示例未使用也不需要直接运行(在 Debian 9 的修改版本上,这里使用两个变量来避免无害的警告,并且在预期环境之外使用时仍会打印一个漂亮的“示例”):

# 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

相关内容