Luks

向 udisk 提供密碼以解鎖 LUKS 加密的設備

  • September 13, 2020

目前,我這樣做是為了掛載我的加密拇指驅動器:

# Works!
pass thumbdrive-password | # get device password entry from password manager
   head -n 1 | # get the device password itself
   sudo cryptsetup luksOpen /dev/sdb thumbdrive # unlock device
udisksctl mount -b /dev/mapper/thumbdrive # mount device

我想做這樣的事情:

# Does not work!
pass thumbdrive-password |
   head -n 1 |
   udisksctl unlock -b /dev/sdb # unlock device
udisksctl mount -b /dev/mapper/luks-foobar # mount device with uuid "foobar"

這將允許半特權使用者(org.freedesktop.udisks2.filesystem-mount在 polkit 中有權限)在不使用 sudo 的情況下掛載加密的文件系統。Udisks 不會接受這種管道方法,因為它使用互動式密碼提示。udisksctl unlock如何在不手動輸入的情況下提供我的設備密碼?

對於 udisks版本 2.6.4及更高版本

**注意:**我沒有測試過這個。一旦我得到 udisks 2.6.4(只要https://github.com/NixOS/nixpkgs/pull/41723向後移植到 NixOS 穩定版),我就會這樣做。

**更新:**我現在有 udisks 2.8.0,所以我可以測試我的解決方案。我唯一錯過的是從pass (...) | head (...). 要修剪它,可以使用-n帶有 的標誌echo,或者附加| tr -d '\n'head輸出。我在下面的兩個解決方案中反映了這一點。

通用(不安全)解決方案

使用--key-file標誌並用密碼字元串代替密鑰文件。/dev/sdb使用密碼解鎖hunter2

udisksctl unlock --block-device /dev/sdb --key-file <(echo -n "hunter2")

直接通過命令行傳遞敏感數據是不安全的,所以應該避免這種方法。

pass執行

相反,使用 檢索密碼字元串pass thumbdrive-password | head -n 1,修剪尾隨換行符,並將其替換為密鑰文件:

udisksctl unlock \
   --block-device /dev/sdb \
   --key-file <(pass thumbdrive-password | head -n 1 | tr -d '\n')

問題是數據不是從控制終端讀取的,stdin而是從控制終端讀取的:

unlock

解鎖加密設備。將從控制終端請求密碼,成功完成後,明文設備將列印到標準輸出。

您可以使用建議的解決方法frostschutz 或使用技巧使管道輸入出現在控制終端上,例如使用expectsocat

pass thumbdrive-password |
   head -n 1 |
   socat - EXEC:'udisksctl unlock -b /dev/sdb',pty,setsid,ctty

引用自:https://unix.stackexchange.com/questions/447615