我目前尝试使用 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 相冲突,因此您不应将其用作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 引导。
最后它应该看起来像这样:
单击“立即安装”。
如果继续,下面列出的更改将写入磁盘。否则,您将能够手动进行进一步的更改。
警告:这将破坏您已删除的任何分区以及将要格式化的分区上的所有数据。
以下设备的分区表已更改:
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,这也是您必须确保的地方mdadm
,lvm
并且其他也已安装。
# 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 设备一样首先对其进行设置,您几乎不需要执行任何其他操作即可使其工作。