dm-integrity 独立映射器设备在重新启动后丢失

dm-integrity 独立映射器设备在重新启动后丢失

我目前尝试使用 dm-integrity 在独立模式下运行。为此,我在虚拟机虚拟机中安装了普通的 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吗?或者还有其他配置文件吗?

答案1

免责声明:无论如何,这都不是标准实现,也没有经过实践检验。它随时可能破裂。使用风险自负。做好备份!!!

所以除了我的理论答案,这是在全新 Ubuntu 20.04 桌面安装中独立 DM-Integrity 的示例实现。步骤 1-4 是设置和安装过程,步骤 5-8 是自定义 udev 规则和挂钩。

原料:

  • 使用 GPT 分区方案的驱动器(用于提供PARTLABEL,因为完整性缺乏 UUID)
  • 使用 DM-Integrity 的一个或多个分区,通过integrity-somename标签进行标识。
  • 自定义 udev 规则,为每个标记的分区设置 DM-Integrity
  • 自定义 initramfs 挂钩以包含integritysetup二进制文件以及用于早期设置的 udev 规则

分步实施:

1. 创建分区

这里的关键点是每个完整性分区都有一个分区标签,在本例中为 1integrity-root和 1 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 相冲突,因此您不应将其用作integrityVG 名称。

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并安装integritysetup

要使 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 特定)

udev 规则本身可能/如果 root本身不在 Integrity 上,则已经可以正常工作。标准初始化文件系统应该很好地安装一个非完整性 rootfs,此时整个系统将接管处理其他所有事情。

但是对于 Integrity 上的 rootfs 本身,我们需要初始化文件系统为我们设置它,否则它将无法挂载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 系统!

(无论如何,直到它损坏为止。使用风险自负,进行备份!!!)

答案2

不幸的是,目前情况相当复杂。独立的 DM-Integrity 根本没有被广泛采用,因此根本没有标准的方法来设置它。

您必须创建自己的 initramfs hook / systemd service / init 脚本来自行处理. 并且每次启动 Live CD/救援系统时,您还必须手动进行设置。

如果你想走那条路,你就必须考虑其他问题。例如,支持设备没有任何UUID,因此无法识别。您可以使用 PARTUUID 或 PARTLABEL 来解决这个问题,但这仍然比常规 UUID 可靠得多。

因此,尽管这并非不可能,但预计会出现各种需要以某种方式解决的问题。

除非您有非常充分的理由不这样做,否则目前使用 DM-Integrity 最实用的方法是使用启用了可选完整性支持的 LUKS 2 ( cryptsetup luksFormat --integrity ...)。

cryptsetup/LUKS 被广泛采用。它提供了识别支持设备所需的 UUID,并且几乎所有地方都已经支持早期启动阶段。因此,不需要像任何其他 LUKS 设备一样首先对其进行设置,您几乎不需要执行任何其他操作即可使其工作。

相关内容