為什麼我的 LUKS 分區安裝時不要求輸入密碼?
在我的系統上,我有兩個加密磁碟:
- crypt 包含 raspbian 拉伸的根分區
- usb-crypt 是一個外部 USB 磁碟。LVM 在該磁碟上使用。
兩個磁碟都使用相同的密碼保護,但根據“cryptsetup luksDump”,主密鑰不同。兩個磁碟都沒有使用密鑰文件配置(每個 LUKS 容器只使用一個密鑰槽)。
當系統啟動時,它要求輸入“crypt”的密碼,但 usb-crypt 會自動掛載而不要求輸入密碼。注意:我從一個未加密的根分區開始,通過該設置,在啟動期間我被要求輸入 usb-crypt 的密碼。
以下是詳細設置:
$ sudo dmsetup ls --target crypt crypt (254, 0) usb-crypt (254, 1) $ sudo cat /etc/fstab /dev/mmcblk0p1 /boot vfat defaults 0 2 /dev/mapper/crypt / ext4 defaults,noatime 0 1 # ... UUID=b9fb061f-0877-4d2c-bd3c-9c155b8f88a5 /mountpoint ext4 rw,auto 0 0 $ sudo cat /etc/crypttab # <target name> <source device> <key file> <options> crypt /dev/mmcblk0p2 none luks usb-crypt UUID=31fb8df7-6148-4408-90a2-93b8ec752fa0 none luks
雖然只需要輸入一次密碼很方便,但我很驚訝看到這種行為。我本來希望被要求提供兩個密碼。
這與在兩個磁碟上使用相同的密碼有關嗎?還是U盤的主密鑰自動保存在“crypt”的加密根分區某處?如果有人能解釋這裡發生了什麼,並可能對相關日誌文件等提供一些提示,我將不勝感激。
提前致謝!
取決於詢問您密碼的初始化腳本正在做什麼。
如果是
systemd
,它可能只是一個功能。systemd-ask-password
帶有可能負責的記憶體功能。https://www.freedesktop.org/software/systemd/man/systemd-ask-password.html
--accept-cached If passed, accept cached passwords, i.e. passwords previously entered. --multiple When used in conjunction with --accept-cached accept multiple passwords. This will output one password per line.
以這種方式,它會首先嘗試您已經輸入的密碼,如果這不起作用,則只要求輸入另一個密碼。
這種想法的缺點是使用 LUKS 檢查密碼需要 1 秒的 CPU 時間,所以如果你有很多 LUKS 容器,這些嘗試可能會減慢你的速度。但大多數人只有一兩個,實際上他們使用相同的密碼片語並不少見。
我實際上找不到專門負責此的原始碼,所以以上只是推測,我不知道這是否是您可以選擇以某種方式禁用的功能。
找到似乎是負責任的程式碼,請在 Github 上查看。
有一個 for 循環,每次迭代都以 1 開始
tries = 0
並遞增tries
。如果設置為 true,則
get_password()
此循環呼叫。因此,如果在循環的第一次迭代中已經記憶體了密碼,它將只返回記憶體的密碼。如果這些不起作用,則下一次迭代設置為 false,然後它會要求您提供另一個密碼片語以嘗試使用。bool accept_cached``tries == 0 && !arg_verify``tries == 1``accept_cached
密碼列表傳遞給
attach_luks_or_plain()
. 這將是第一次迭代中先前記憶體的密碼,以及所有後續密碼中的單個新密碼,因此它不會重試先前嘗試過的密碼(除非您繼續輸入相同的密碼)。至於將密碼明文保存在記憶體中,密碼列表被聲明為 a
_cleanup_strv_free_erase_ char **passwords = NULL;
,這樣至少聽起來像是清理會在某些時候得到妥善處理。密鑰總是在記憶體中的某個地方,這無濟於事,crypt需要masterkey才能工作,只要容器是打開的,你總是可以看到它
dmsetup table --showkeys
。似乎您通常會
arg_tries = 3
嘗試三次輸入有效的密碼,但如果您有多個容器並且記憶體的密碼不起作用,它只會讓您嘗試兩次輸入密碼,因為記憶體的密碼嘗試已經算作第一次嘗試。我沒有加密的 systemd 機器來測試這是否屬實,或者我只是在某處誤讀了程式碼。