Raspbian

為什麼我的 LUKS 分區安裝時不要求輸入密碼?

  • November 18, 2017

在我的系統上,我有兩個加密磁碟:

  1. crypt 包含 raspbian 拉伸的根分區
  2. 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 機器來測試這是否屬實,或者我只是在某處誤讀了程式碼。

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