當我執行 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/loop0
和969933847
):
從假磁碟建立測試 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