Mount

dm-integrity 獨立映射器設備在重新啟動後失去

  • May 2, 2020

我目前嘗試使用 dm-integrity 在獨立模式下執行。為此,我在虛擬機 VM 中安裝了一個普通的 ubuntu 伺服器 20.04。

在接下來的步驟中,我創建 dm-integrity 設備、一個 ext4 文件系統並掛載它:

integritysetup format /dev/sdb
integritysetup open /dev/sdb hdd-int
mkfs.ext4 /dev/mapper/hdd-int
mkdir /data
mount /dev/mapper/hdd-int /data
echo "/dev/mapper/hdd-int /data ext4 defaults 0 0" >> /etc/fstab

**注意:**為簡化起見,我使用/dev/sdb而不是/dev/disk/by-id/<ID>.

現在我重新啟動,發現設備 /dev/mapper/hdd-int 不存在,因此掛載/data失敗。

現在我的問題:如何永久保存 dm-integrity 設備的資訊,以便重啟後的掛載已經存在?應該在/etc/fstab? 還是有其他配置文件?

**免責聲明:**這無論如何都不是標準實現,也沒有在實踐中經過實戰測試。它可能隨時破裂。使用風險自負。做好備份!!!

因此,除了我的理論答案之外,這裡是全新 Ubuntu 20.04 桌面安裝中獨立 DM-Integrity 的範例實現。第 1-4 步是設置和安裝過程,第 5-8 步是自定義 udev 規則和掛鉤。

原料:

  • 使用 GPT 分區方案的驅動器(用於提供PARTLABEL,因為完整性缺少 UUID)
  • 一個或多個使用 DM-Integrity 的分區,由integrity-somename標籤標識。
  • 自定義 udev 規則為每個標記的分區設置 DM-Integrity
  • 自定義 initramfs 掛鉤以包含integritysetup二進製文件以及用於早期設置的 udev 規則

分步實施:

1.創建分區

這裡的關鍵點是每個完整性分區都有一個分區標籤,在本例中為 oneintegrity-root和 one integrity-home,分別用於根分區//home分區。

# parted /dev/vda
GNU Parted 3.3
Using /dev/vda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit mib                                                         
(parted) mklabel gpt
(parted) disk_set pmbr_boot on                                            
(parted) mkpart grub 1MiB 2MiB
(parted) set 1 bios_grub on
(parted) mkpart boot 2MiB 1024MiB
(parted) set 2 lvm on                                                     
(parted) mkpart integrity-root 1024MiB 10240MiB
(parted) set 3 lvm on                                                     
(parted) mkpart integrity-home 10240MiB 100%                              
(parted) set 4 lvm on                                                     
(parted) print free                                                       
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 19456MiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: pmbr_boot

Number  Start     End       Size     File system  Name            Flags
       0.02MiB   1.00MiB   0.98MiB  Free Space
1      1.00MiB   2.00MiB   1.00MiB               grub            bios_grub
2      2.00MiB   1024MiB   1022MiB               boot            lvm
3      1024MiB   10240MiB  9216MiB               integrity-root  lvm
4      10240MiB  19455MiB  9215MiB               integrity-home  lvm
       19455MiB  19456MiB  0.98MiB  Free Space

(parted)                                                                  
Information: You may need to update /etc/fstab.

驗證分區是否出現在/dev/disk/by-partlabel相應的下方:

# ls -l /dev/disk/by-partlabel
total 0
lrwxrwxrwx 1 root root 10 May  2 17:52 boot -> ../../vda2
lrwxrwxrwx 1 root root 10 May  2 17:52 grub -> ../../vda1
lrwxrwxrwx 1 root root 10 May  2 17:52 integrity-home -> ../../vda4
lrwxrwxrwx 1 root root 10 May  2 17:52 integrity-root -> ../../vda3

2. 建立誠信

設置好分區後,您實際上必須將它們變成完整性設備。

# integritysetup format /dev/disk/by-partlabel/integrity-root 

WARNING!
========
This will overwrite data on /dev/disk/by-partlabel/integrity-root irrevocably.

Are you sure? (Type uppercase yes): YES
Formatted with tag size 4, internal integrity crc32c.
Wiping device to initialize integrity checksum.
You can interrupt this by pressing CTRL+c (rest of not wiped device will contain invalid checksum).
Finished, time 01:14.903, 9081 MiB written, speed 121.2 MiB/s

# integritysetup open /dev/disk/by-partlabel/integrity-root integrity-root

對 重複相同的操作/dev/disk/by-partlabel/integrity-home,然後驗證它是否存在於/dev/mapper

# ls -l /dev/mapper
total 0
crw------- 1 root root 10, 236 May  2  2020 control
lrwxrwxrwx 1 root root       7 May  2 18:07 integrity-home -> ../dm-1
lrwxrwxrwx 1 root root       7 May  2 18:07 integrity-root -> ../dm-0

請注意,此命名方案在技術上與 LVM 衝突,因此您不應將integrity其用作 VG 名稱。

3. 文件系統、RAID 或 LVM

有了完整性,您還必須創建一個文件系統。否則,Ubuntu 安裝程序不知道如何處理這個神秘設備,而是嘗試在其上創建一個分區表。

# mkfs.ext4 /dev/mapper/integrity-root
# mkfs.ext4 /dev/mapper/integrity-home

所以這就是你將文件系統放在完整性設備上的地方。

或者,您可以在此處使用 RAID 或 LVM。我想你也可以使用 LUKS,但是當 LUKS2 已經內置了對 Integrity 的支持時,你為什麼要這樣做呢?如果您在這裡選擇 LUKS,那麼您很可能是按照錯誤的教程進行操作。

4. 安裝 Ubuntu

Ubuntu 桌面安裝程序在技術上根本不支持完整性,但是由於您手動設置文件系統,因此無論如何它都允許您使用它們。如果沒有以下進一步的步驟,它將無法啟動。

  • 在“安裝類型”對話框中,選擇“其他”(用於手動分區)
  • “更改”integrity-root到掛載點/
  • “更改”integrity-home到掛載點/home

不要忘記您的引導程序!(不可能使用完整性設備)

  • “更改”/dev/vda1為“保留的 BIOS 引導區”
  • “更改”/dev/vda2到掛載點/boot
  • 保留其他分區(不要格式化完整性設備)

請注意,這對於 UEFI 安全啟動設置將完全不同。為簡單起見,此範例使用良好的舊式 bios grub 引導。

最後它應該是這樣的:

Ubuntu 安裝程序安裝類型顯示Integrity-root 為/,Integrity-home 為/home,vda2 為/boot

點擊“立即安裝”。

如果繼續,下面列出的更改將寫入磁碟。否則,您將能夠手動進行進一步的更改。

警告:這將破壞您已刪除的任何分區以及將要格式化的分區上的所有數據。

以下設備的分區表已更改:

Virtual disk 1 (vda)

以下分區將被格式化:

LVM VG integrity, LV home as ext4
LVM VG integrity, LV root as ext4
partition #2 of Virtual disk 1 (vda) as ext2

由於我們基本上是在欺騙安裝程序使用完整性設備作為目標,因此它錯誤地假定了 LVM VG-LV 星座。忽略它並繼續。

但是,不要重新啟動。暫時還不行。

lsblk在安裝執行時,您可以通過在終端中執行來驗證它是否順利進行:

# lsblk
vda                252:0    0    19G  0 disk  
├─vda1             252:1    0     1M  0 part  
├─vda2             252:2    0  1022M  0 part  /target/boot
├─vda3             252:3    0     9G  0 part  
│ └─integrity-root 253:0    0   8.9G  0 crypt /target
└─vda4             252:4    0     9G  0 part  
 └─integrity-home 253:1    0   8.9G  0 crypt /target/home

甚至lsblk還不支持完整性設備,它錯誤地假設它們是加密設備。/target無論如何,如果誠信根是,誠信之家是/target/home並且/dev/vda2是,一切都會去正確的地方/target/boot

安裝完成後,選擇“繼續測試”而不是“立即重啟”。

5. Chroot & 安裝完整性設置

要使 Ubuntu 真正支持安裝獨立完整性分區,您必須 chroot 進入全新安裝並設置自定義 udev 規則和 initramfs 掛鉤。

# mount /dev/mapper/integrity-root /target
# mount /dev/mapper/integrity-home /target/home
# mount /dev/vda2 /target/boot
# mount --bind /dev /target/dev
# mount --bind /proc /target/proc
# mount --bind /run /target/run
# mount --bind /sys /target/sys
# chroot /target

現在,integritysetup可能還沒有安裝。如果您使用 RAID 或 LVM,這也是您必須確保的地方mdadmlvm並且其他的也已安裝。

# apt-get install cryptsetup

6.自定義udev規則

自定義 udev 規則進入/etc/udev/rules.d. 作為參考,創建/dev/disk/by-partlabel/連結的標準規則如下所示:

ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_NAME}=="?*", SYMLINK+="disk/by-partlabel/$env{ID_PART_ENTRY_NAME}"

所以我們的自定義規則可能如下所示:

ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_NAME}=="integrity-?*", RUN+="/usr/sbin/integritysetup open $env{DEVNAME} $env{ID_PART_ENTRY_NAME}"

將其另存為/etc/udev/rules.d/99-integrity.rules.

這應該使 udev 為具有integrity-xyz分區標籤的每個分區打開完整性設置。請注意,這些名稱在系統範圍內必須是唯一的,因此在 RAID 設置中,每個驅動器需要使用不同的分區標籤。

7. 自定義 initramfs 鉤子(特定於 Ubuntu)

如果 root本身不在 Integrity 上,則 udev 規則本身可能已經正常工作。/標準的initramfs應該掛載一個非完整性的 rootfs,此時整個系統將接管處理其他所有事情。

但是對於 Integrity 上的 rootfs 本身,我們需要initramfs為我們設置它,否則它將無法掛載 rootfs,並且引導失敗。這意味著添加integritysetup二進製文件以及 udev 規則本身。

使用 Ubuntu 的 initramfs-tools,這可以通過創建自定義鉤子腳本來實現:

#!/bin/sh
PREREQ=""
prereqs()
{
   echo "$PREREQ"
}

case $1 in
   prereqs)
       prereqs
       exit 0
       ;;
esac

. /usr/share/initramfs-tools/hook-functions

# Begin real processing below this line

force_load dm_integrity
copy_exec /usr/sbin/integritysetup /usr/sbin
copy_file text /etc/udev/rules.d/99-integrity.rules

將其另存為/etc/initramfs-tools/hooks/integrity.

8.更新initramfs

與對 initramfs 配置的所有更改一樣,您必須重新建構 initramfs 才能生效:

# update-initramfs -u -k all
update-initramfs: Generating /boot/initrd.img-5.4.0-28-generic
cryptsetup: WARNING: target 'integrity-root' not found in /etc/crypttab
update-initramfs: Generating /boot/initrd.img-5.4.0-26-generic
cryptsetup: WARNING: target 'integrity-root' not found in /etc/crypttab

不幸的是,Ubuntu 的預設 cryptsetup 鉤子被混淆了,並且將完整性設備誤認為是 cryptsetup 的。值得慶幸的是,警告是無害的,可以忽略。

9.重啟

如果一切順利,從 Live CD 重新啟動到已安裝的系統後,終端中lsblk應該會像這樣向您致意:

integrity@ubuntu $ lsblk
vda                252:0    0   19G  0 disk  
├─vda1             252:1    0    1M  0 part  
├─vda2             252:2    0 1022M  0 part  /boot
├─vda3             252:3    0    9G  0 part  
│ └─integrity-root 253:0    0  8,9G  0 crypt /
└─vda4             252:4    0    9G  0 part  
 └─integrity-home 253:1    0  8,9G  0 crypt /home

由於lsblk錯誤地將它們辨識為crypt設備,請檢查dmsetup table它們是否實際上是integrity設備:

integrity@ubuntu:~$ sudo dmsetup table
[sudo] password for integrity: 
integrity-root: 0 18598008 integrity 252:3 0 4 J 6 journal_sectors:130944 interleave_sectors:32768 buffer_sectors:128 journal_watermark:50 commit_time:10000 internal_hash:crc32c
integrity-home: 0 18595960 integrity 252:4 0 4 J 6 journal_sectors:130944 interleave_sectors:32768 buffer_sectors:128 journal_watermark:50 commit_time:10000 internal_hash:crc32c

到那時,你就完成了。享受具有獨立完整性的新 Linux 系統!

(無論如何,直到它破裂。使用風險自負,進行備份!!!)

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