Dm-Crypt

將只讀 LUKS 分區重新映射為讀寫

  • October 12, 2018

cryptsetup 可以使用--readonlyor-r選項呼叫,這將設置一個只讀映射:

cryptsetup --readonly luksOpen /dev/sdb1 sdb1

以只讀方式打開設備後,以後可以將其重新映射為讀寫嗎?顯然,我的意思是在不先關閉它,然後再打開它的情況下將其映射為讀寫。我可以重新映射它而無需再次輸入密碼嗎?

如果這是不可能的,這僅僅是 cryptsetup 不支持這個,還是有一些更基礎的級別?

該命令似乎不可能cryptsetup。不幸的是cryptsetup,有一些這樣的不可變標誌……--allow-discards也是其中之一。如果在您打開容器時未設置,則以後無法添加。

至少,不是用cryptsetup命令。但是,由於cryptsetup創建了正常的設備映射器目標,您可以求助於dmsetup修改它們。當然,出於各種原因,不建議這樣做:這就像更改正在使用的分區的分區表 - 搞砸了,您可能會失去所有數據。

設備映射器允許在執行時動態重新映射所有設備,它根本不關心數據的安全性;這就是為什麼這個特性通常被包裹在 LVM 層之後,該層保留了必要的元數據以確保其安全。

創建只讀 LUKS 設備:

# truncate -s 100M foobar.img
# cryptsetup luksFormat foobar.img
# cryptsetup luksOpen --read-only foobar.img foobar

方式dmsetup看到它:

# dmsetup info foobar
Name:              foobar
State:             ACTIVE (READ-ONLY)
Read Ahead:        256
Tables present:    LIVE
[...]
# dmsetup table --showkeys foobar
0 200704 crypt aes-xts-plain64 ef434503c1874d65d33b1c23a088bdbbf52cb76c7f7771a23ce475f8823f47df 0 7:0 4096

請注意通常不應洩露的主密鑰,因為它破壞了 LUKS 提供的任何蠻力保護。不幸的是,我還沒有找到不使用它的方法,因為dmsetup也沒有直接的--make-this-read-write選擇。但是dmsetup reload允許完全替換映射,因此我們將在讀寫模式下將其替換為自身。

# dmsetup table --showkeys foobar | dmsetup reload foobar
# dmsetup info foobar
Name:              foobar
State:             ACTIVE (READ-ONLY)
Read Ahead:        256
Tables present:    LIVE & INACTIVE

重新載入後它仍然是只讀的,因為重新載入進入非活動表。

要使非活動表處於活動狀態,請使用dmsetup resume

# dmsetup resume foobar
# dmsetup info foobar
Name:              foobar
State:             ACTIVE
Read Ahead:        256
Tables present:    LIVE

因此我們有一個讀寫 LUKS 設備。

它適用於實時文件系統嗎?

# cryptsetup luksOpen --readonly foobar.img foobar
# mount /dev/mapper/foobar /mnt/foobar
mount: /mnt/foobar: WARNING: device write-protected, mounted read-only.
# mount -o remount,rw /mnt/foobar
mount: /mnt/foobar: cannot remount /dev/mapper/foobar read-write, is write-protected.

所以它是只讀的。使其可讀寫並重新掛載:

# dmsetup table --showkeys foobar | dmsetup reload foobar
# dmsetup resume foobar
# mount -o remount,rw /mnt/foobar
# echo hey it works > /mnt/foobar/amazing.txt

我們可以回到只讀狀態嗎?

# mount -o remount,ro /mnt/foobar
# dmsetup table --showkeys foobar | dmsetup reload foobar --readonly
# dmsetup resume foobar
# mount -o remount,rw /mnt/foobar
mount: /mnt/foobar: cannot remount /dev/mapper/foobar read-write, is write-protected.

所以它可能有效。將allow_discards標誌添加到現有 crypt 映射的過程類似 - 您必須使用包含此標誌的表重新載入。然而,一個已經檢測到沒有丟棄支持的文件系統可能不會被說服在執行中重新檢測它。所以目前還不清楚它有多實用。


儘管如此,除非您有充分的理由不這樣做,否則您應該堅持使用正常命令重新打開cryptsetup,即使這意味著解除安裝並重新提供密碼。它更安全,更重要的是,它不會繞過 LUKS 安全概念。

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