独立的 Kali Linux 2021.4 安装在 USB 驱动器上,完全加密
独立的 Kali Linux 2021.4 安装在 USB 驱动器上,完全加密
这些说明允许您在外部 USB 驱动器上创建完全加密的 Kali Linux 2021.4 独立安装。我的意思是安装
- 使用 luks 完全加密,包括启动和交换分区的加密,
- 在任何可以从 USB 驱动器启动的 64 位 Intel/AMD 机器上运行,无论是使用 EFI 启动还是传统启动,
- 不涉及任何“实时”系统,即从 U 盘启动的系统不需要到
chroot
RAM 盘;当前的 Kali 安装在外部驱动器上运行,就像在内部磁盘上一样;特别是,您可以使用 安装更多软件包apt-get install <something>
,可以编辑配置文件,所有这些更改都是永久性的,即使您下次在另一台机器上从该 USB 驱动器启动;您还可以编译自定义内核并将其安装在 USB 驱动器上。
例如,用例是定制的可引导 Kali 2021.4 安装,用作修复、取证或维护工具。如果您希望从特定机器的角度探测网络,通常需要重新配置一些交换机以提供端口镜像并将所有流量转移到可以探测它的网段。现在有一个替代方案。只需从您的 USB Kali 安装重新启动相关机器,将其连接到网络,您就可以使用通常的硬件和通常的 MAC 地址,但这次运行 Kali。
此外,如果您的主计算机运行 Windows 或其他版本的 Linux,并且您只是偶尔需要 Kali,那么您可以避免双启动设置。每当你需要 Kali 时,只需从 USB 驱动器启动,否则不要管现有的安装。
当然,只有在您确切知道自己在做什么时,您才可以使用后续说明。您可以轻松地使您工作的机器的硬盘无法读取,从而丢失所有数据。
大纲
创建这样的安装有点棘手,并且涉及相当多的手动干预:
- 首先,我们使用现有的 Linux 安装对 USB 驱动器进行分区,并且我们设置了多个分区,其中一些分区将被加密:
- 使用 luks 加密文件系统的
/boot
分区ext4
,版本 1。幸运的是,引导加载程序grub2
可以挂载 luks1 加密分区并从它们引导。 grub2
用于驻留的引导扇区。- 带有文件系统的 EFI 分区
vfat
。 - 一个
swap
分区,用 luks2 加密。 /
我们安装btrfs
文件系统的根 ( ) 分区。通过创建子卷可以实现任何更细粒度的结构。
- 使用 luks 加密文件系统的
- 我们还需要一个带有 Kali“裸机”安装程序的 USB 驱动器。这是一个 Debian 类型的安装程序。我们需要中断专家模式安装并从命令行进行干预,以便挂载目标 USB 驱动器的加密分区,然后在其上安装 Kali Linux 2021.4,在
/boot
包含密钥的分区上创建一个初始 RAM 磁盘,grub2
以便按顺序最终能够挂载加密分区,但我们不能grub2
在这个阶段安装引导加载程序。如果我们这样做了,这可能会更改我们正在执行安装的机器的 EFI 引导信息,并产生意外的双引导设置,因此我们会得到一个完整的安装,只是缺少任何引导加载程序。 - 然后我们需要一个带有救援系统的 USB 驱动器。我没有使用 Kali “裸机” 安装程序做到这一点,而是使用 “Xubuntu 20.04 LTS” live USB 介质。在它的帮助下,我们可以
grub2
在--removable
模式下安装。这可以防止grub2
修改我们正在使用的机器的 EFI 引导信息,而只会影响我们的目标 USB 驱动器。
准备
Kali Linux 2021.4 裸机安装程序
首先,我们获取Kali Linux 2021.4 Bare Metal Installer的 ISO 镜像。在我的例子中,ISO 映像文件被称为kali-linux-2021.4-installer-amd64.iso
. 我们在现有的 Linux 机器上工作。就我而言,这是一个 Ubuntu 20.04 LTS。
我们插入一个至少 4GB 的空白 USB 笔式驱动器,并将图像复制到该笔式驱动器上,如下所示。一旦我们插入 U 盘,我们需要找出它对应的块设备。通常这将是/dev/sdx
其中x
一个字母a
,b
等等。如果我们的 Linux 发行版自动挂载 USB 笔式驱动器df
,mount
或lsblk
将显示与之关联的设备文件。然后确保在继续之前卸载驱动器(例如sudo umount /dev/sdxn
,n
代表已自动安装的驱动器的所有分区的数量)。如果驱动器未自动安装,ls /dev
则在插入之前和之后应该显示设备文件名。
在我的 Xubuntu 20.04 LTS 机器上,第一个 USB 笔式驱动器与 关联/dev/sda
,因此为了将 ISO 映像复制到笔式驱动器,
$ sudo dd if=kali-linux-2021.4-installer-amd64.iso of=/dev/sda status=progress
(请注意,在类似 Ubuntu 的系统上root
,您可以通过调用以 root 权限发出命令,而不是在用户下工作sudo
)
Xubuntu 20.04 LTS 安装程序
我们还需要第二个 USB 笔式驱动器上的Xubuntu 20.04 LTS Live Installer的 ISO 映像。在我的例子中,ISO 映像文件被称为xubuntu-20.04-desktop-amd64.iso
. 以同样的方式,这将转到第二个 USB 笔式驱动器(至少 4GB 大小)。拔下第一个 USB 笔式驱动器并插入第二个。
$ sudo dd if=xubuntu-20.04-desktop-amd64.iso of=/dev/sda status=progress
对目标 USB 驱动器进行分区
最后,我们插入我们希望在其上执行 Kali Linux 2021.4 安装的 USB 驱动器。为此,我在 USB 3.1 gen 2 机箱中使用了 128GB NVMe M.2 SSD。断开第二个笔式驱动器并连接目标 USB 驱动器。与上述类似,找出/dev/sdx
目标 USB 驱动器对应的设备,并确保其分区均未挂载。在我的例子中,目标 USB 驱动器再次与/dev/sda
.
然后我们使用sudo gdisk /dev/sda
以创建以下分区。
/dev/sda1, 4.0 GiB, type 8301, Linux reserved, will become /boot
/dev/sda2, 2.0 MiB, type ef02, BIOS boot, will contain grub2
/dev/sda3, 128.0 MiB, type ef00, EFI system partition
/dev/sda4, 8.0 GiB, type 8200, Linux swap
/dev/sda5, <something big>, type 8300, Linux filesystem, will be the main partition
在这里,我为交换分配了 8GB,这对于我的目的来说已经足够了。请注意,如果此分区太小,您将无法休眠(挂起到磁盘)。如果你想将你的 Kali Linux USB 驱动器连接到不同的机器上,你可能应该忘记休眠,因为你的系统很可能无法在不同于你让它休眠的硬件上正确唤醒。
主分区可以任意大。/dev/sda5
如果您需要额外的分区,您可以按照我们在本说明中的处理方式来处理它们。
除了使用 之外gdisk
,我们还可以从命令行对目标 USB 驱动器进行重新分区:
$ sgdisk --zap-all /dev/sda
$ sgdisk --new=1:0:+4096M /dev/sda
$ sgdisk --new=2:0:+2M /dev/sda
$ sgdisk --new=3:0:+128M /dev/sda
$ sgdisk --new=4:0:+8192M /dev/sda
$ sgdisk --new=5:0:0 /dev/sda
$ sgdisk --typecode=1:8301 --typecode=2:ef02 --typecode=3:ef00 --typecode=4:8200 --typecode=5:8300 /dev/sda
$ sgdisk --change-name=1:/boot --change-name=2:GRUB --change-name=3:EFI-SP 00change-name=4:swap --change-name=5:rootfs /dev/sda
$ sgdisk --hybrid 1:2:3 /dev/sda
$ sgdisk --print /dev/sda
(注意:0
分区 5 的大小提示表示我们请求所有剩余的可用空间)
接下来,我们为分区 1,4 和 5 设置 luks 加密。请注意,引导加载程序grub2
只能挂载 luks,版本 1。
$ sudo cryptsetup luksFormat --type=luks1 /dev/sda1
$ sudo cryptsetup luksFormat /dev/sda4
$ sudo cryptsetup luksFormat /dev/sda5
由于解锁分区 4 和 5 的密钥将放置在/boot
分区的初始 RAM 磁盘中,因此我们可以为所有三个分区设置相同的密码。使用不同的短语不会增加安全性。我们现在解锁三个分区,
$ sudo cryptsetup open /dev/sda1 LUKS_BOOT
$ sudo cryptsetup open /dev/sda4 LUKS_SWAP
$ sudo cryptsetup open /dev/sda5 LUKS_ROOT
然后该命令ls /dev/mapper
显示与未锁定分区关联的三个设备。我们现在可以格式化分区 1、3、4 和 5,也就是在它们上面创建文件系统。
$ sudo mkfs.ext4 -L boot /dev/mapper/LUKS_BOOT
$ sudo mkfs.vfat -F 16 -n EFI-SP /dev/sda3
$ sudo mkswap -L swap /dev/mapper/LUKS_SWAP
$ sudo mkfs.btrfs -L root /dev/mapper/LUKS_ROOT
最后,我们删除映射的设备(我们的机器忘记了如何解密分区):
$ sudo cryptsetup close LUKS_BOOT
$ sudo cryptsetup close LUKS_SWAP
$ sudo cryptsetup close LUKS_ROOT
Kali Linux 2021.4的安装
设置安装程序
现在将计算机的 BIOS 设置为从 USB 驱动器启动。如果我们以 EFI 模式启动,我们最终会得到一个只能以 EFI 模式启动的 USB 驱动器。如果我们在 legacy BIOS 模式下启动,我们最终将生产一个在 legacy 和 EFI 模式下启动的 USB 驱动器。
使用 Kali 2021.4 安装程序插入 U 盘并启动机器。请注意,我们在安装过程中需要网络访问权限。
选择高级选项和图形专家安装。执行安装菜单的以下项目(但仅此而已):
- 选择语言
- 配置键盘
- 检测并安装安装介质
- 加载 debconf 预配置文件
- 从安装介质加载安装程序组件,选择
crypto-dm-modules
、fdisk-udeb
、mbr-udeb
、parted-udeb
、rescue-mode
。 - 检测网络硬件
- 配置网络,确保您在此阶段具有网络访问权限。
- 设置用户和密码,选择影子密码并设置能够通过
sudo
. - 配置时钟,请注意,当您选择ntp(网络时间协议)时,您的机器将在连接到网络后开始轮询,这可能不适合您的安装
不要执行检测磁盘。而是按 [Ctrl]+[Alt]+[F3] 然后按 [Enter] 以打开具有 root 权限的文本控制台。现在连接我们将安装 Kali Linux 2021.4 的目标 USB 驱动器。在连接之前和之后使用ls /dev
以发现它与哪些设备文件相关联。在我的情况下,我启动的 USB 笔式驱动器是/dev/sda
,目标 USB 驱动器变为/dev/sdb
.
我们解锁三个加密分区:
$ cryptsetup open /dev/sdb1 LUKS_BOOT
$ cryptsetup open /dev/sdb4 LUKS_SWAP
$ cryptsetup open /dev/sdb5 LUKS_ROOT
分区
现在按 [Ctrl]+[Alt]+[F5] 并继续以图形模式进行安装,如下所示。
- 检测磁盘
- 分区盘,说明书。
将光标放在下一行4.3 GB ...
,LUKS_BOOT
按[Enter],使用as Ext4
、format、mount at /boot
、options noatime
,选择Done setting up the partition。将光标放在下一行LUKS_ROOT
,按[Enter],使用as btrfs
、format、mount at /
、options noatime
,选择Done setting up the partition。该分区LUKS_SWAP
已被识别并标记为swap
。
选择Finish partitioning and write changes to disk。
然后我们按 [Ctrl]+[Alt]+[F3] 以再次进入根控制台。
调用df
显示两个非交换加密分区已分别挂载在/target
和/target/boot
。如果机器以 EFI 模式启动,也有/target/boot/efi
,但是错误的,指向第一个内部硬盘的 EFI 分区。它应该是目标 USB 驱动器上的 EFI 分区。请参阅下面的更多细节。
Btrfs 调整
debian 安装程序已在分区上创建子@rootfs
卷btrfs
。@
我们为默认子卷 、@home
、@root
和@snapshots
挂载顶级子卷,创建更多子卷,@var
并将其设置@
为默认值:
$ mkdir -p /mnt/point/
$ mount -o subvol=/ /dev/mapper/LUKS_ROOT /mnt/point
$ cd /mnt/point/
$ btrfs subvolume create @
$ btrfs subvolume create @home
$ btrfs subvolume create @root
$ btrfs subvolume create @snapshots
$ btrfs subvolume list .
$ btrfs subvolume set-default 257 . # where 257 is the subvolume ID that was displayed for @
$ cd /
$ umount /mnt/point
$ umount /target/boot/efi # only required when booted in EFI mode
$ umount /target/boot
$ umount /target
$ mount -o subvol=@ /dev/mapper/LUKS_ROOT /target
$ mkdir -p /target/boot
$ mkdir -p /target/etc
$ mkdir -p /target/media
$ mkdir -p /target/snapshots
$ mount /dev/mapper/LUKS_BOOT /target/boot
$ mount -o subvol=@rootfs /dev/mapper/LUKS_ROOT /mnt/point
$ cp /mnt/point/etc/fstab /target/etc/fstab
在这里,btrfs subvolume list
显示当前卷上的子卷 ID,我们使用@
在后续set-default
命令中分配的编号。
我们已经创建了子卷@
作为/
默认挂载的子卷,snapper
遵循命名约定。需要创建多少个子卷是个人喜好问题。我们去@home
,@root
和@snapshots
我们稍后将安装在/home
,/root
和/snapshots
。请注意,尽管有些人喜欢/var
单独的子卷,但这在下面不起作用。
文件系统表
umount /target/boot/efi
仅当安装介质以 EFI 模式启动时才需要。这里的重点是,即使我们是安装到U盘,目前挂载的EFI分区也是电脑内部硬盘的EFI分区。当我们安装引导加载程序时,这个错误的安装会导致严重的问题。
然后我们调用blkid -s PARTUUID -o value /dev/sdb3
以找出目标USB驱动器上EFI分区的UUID并将其写在纸上。为了适应文件系统表,我们调用nano /target/etc/fstab
如下。
首先,在 的行中/
,我们更改subvol=@rootfs
为subvol=@
。我们还添加了一行
PARTUUID=<whatever> /boot/efi vfat umask=0077 0 1
使用我们刚刚写下的 UUID。这允许安装定位和安装正确的 EFI 分区,而与任何设备编号无关。然后我们添加行以挂载btrfs
我们刚刚创建的子卷。我还添加了对使用 SSD 有用的挂载选项。就我而言,其他行如下所示。
/dev/mapper/LUKS_ROOT / btrfs defaults,noatime,ssd,compress=lzo,subvol=@ 0 0
/dev/mapper/LUKS_BOOT /boot ext4 defaults,noatime 0 1
/dev/mapper/LUKS_ROOT /home btrfs defaults,noatime,ssd,compress=lzo,subvol=@home 0 2
/dev/mapper/LUKS_ROOT /root btrfs defaults,noatime,ssd,compress=lzo,subvol=@root 0 3
/dev/mapper/LUKS_ROOT /snapshots btrfs defaults,noatime,ssd,compress=lzo,subvol=@snapshots 0 4
/dev/mapper/LUKS_SWAP none swap sw 0 0
(其中只有一行表示LUKS_BOOT
而不是LUKS_ROOT
)。在编辑器nano
中,我们按 [Ctrl]+[o] 保存文件,按 [Enter] 确认,然后按 [Ctrl]+[x] 退出编辑器。现在我们删除顶级子卷并将正确的 EFI 分区挂载到适当的位置:
$ umount /mnt/point
$ mkdir -p /target/boot/efi
$ mount /dev/sdb3 /target/boot/efi
$ mount -o subvol=@home /dev/mapper/LUKS_ROOT /target/home
$ mount -o subvol=@root /dev/mapper/LUKS_ROOT /target/root
如果您创建了更多可能受安装影响的 btrfs 子卷,请将它们也挂载到此处。
实际安装
同样,[Ctrl]+[Alt]+[F5] 将我们带到图形屏幕,我们继续安装,如下所示。
- 安装基础系统,选择内核linux-image-5.14.0-kali4-amd64,generic initrd。
- 配置包管理器。
- 选择并安装软件,我们保持默认。
但是,不要安装引导加载程序,而是
- 不使用引导加载程序继续
一些尝试在便携式驱动器上安装 Linux 的人报告说,安装仍然修改了他们正在使用的机器内部硬盘的引导扇区。我怀疑通过在/target/boot/efi
上面安装正确的分区,我们可以避免这种情况。尽管如此,我们不能使用安装grub2
程序将执行的安装,因为它缺少--removable
标志。因此,我们将引导加载程序的安装推迟到稍后阶段。
设置初始 RAM 磁盘
然后使用 [Ctrl]+[Alt]+[F3] 回到根控制台,以确保grub2
在最终安装时能够解密引导分区。
我们将 root 更改为新安装的系统,挂载所有分区和子卷,
$ for n in dev proc sys run etc/resolv.conf; do mount --bind /$n /target/$n; done
$ chroot /target
$ mount -a
如果mount -a
报告错误,这可能是由于我们在上面修改的文件系统表中的拼写错误。
/etc/resolv.conf
那里是为了不丢失安装程序在我们设置网络时获得的 DNS 信息。在目标系统上,我们安装所有工具以安装和更新grub2
以及将解密工具添加到初始 RAM 磁盘:
$ apt-get install grub-common grub-efi-amd64 os-prober
$ apt-get install cryptsetup-initramfs
下面,我们创建一个随机的 luks 密钥文件,它能够解锁三个加密分区,并在组成初始 RAM 磁盘之前设置一些配置文件。
$ echo "KEYFILE_PATTERN=/etc/luks/*.keyfile" >>/etc/cryptsetup-initramfs/conf-hook
$ echo "UMASK=0077" >>/etc/initramfs-tools/initramfs.conf
$ mkdir -p /etc/luks
$ dd if=/dev/urandom of=/etc/luks/boot_os.keyfile bs=4096 count=1
$ chmod u=rx,go-rwx /etc/luks
$ chmod u=r,go-rwx /etc/luks/boot_os.keyfile
$ cryptsetup luksAddKey /dev/sdb1 /etc/luks/boot_os.keyfile
$ cryptsetup luksAddKey /dev/sdb4 /etc/luks/boot_os.keyfile
$ cryptsetup luksAddKey /dev/sdb5 /etc/luks/boot_os.keyfile
$ echo "LUKS_BOOT UUID=$(blkid -s UUID -o value /dev/sdb1) /etc/luks/boot_os.keyfile luks,discard" >>/etc/crypttab
$ echo "LUKS_SWAP UUID=$(blkid -s UUID -o value /dev/sdb4) /etc/luks/boot_os.keyfile luks,discard" >>/etc/crypttab
$ echo "LUKS_ROOT UUID=$(blkid -s UUID -o value /dev/sdb5) /etc/luks/boot_os.keyfile luks,discard" >>/etc/crypttab
$ /usr/sbin/update-initramfs -u -k all
在启动过程中,grub2
会检测到有一个加密/boot
分区。它会要求输入密码(我们一开始就关联/boot
的那个)。然后该/boot
分区包含一个带有初始 RAM 磁盘的内核,其中包含我们刚刚创建的密钥文件,可用于解锁我们所有的加密分区。
在密码学上,最薄弱的环节是/boot
分区的密码保护。如果它被破坏,其他分区也会受到损害。请注意,这只是 luks1 版本。
完成安装
最后,我们按 [Ctrl]+[Alt]+[F5] 回到图形安装程序并
- 在系统时钟设置为 UTC的情况下完成安装。
最后,我们点击继续启动系统,但我们宁愿移除USB随身碟和USB安装目标并关闭计算机。
创建引导加载程序
请注意,为了生成 EFI 可启动 USB 驱动器,当我们下次启动计算机时,它必须处于 UEFI 模式。如果需要,请转至 BIOS/UEFI 设置并将其打开。
现在我们连接包含 Xubuntu 20.04.3 LTS live 安装介质的 U 盘并从它启动,选择Try Xubuntu 不安装以进入 live 系统。然后我们连接构成我们安装目标的 USB 驱动器。
确保 Xubuntu live 系统具有网络访问权限(这是由NetworkManager
图形界面中的 完成的)。打开终端并调用ls /sys/firmware/efi/efivars
以确认我们确实处于 EFI 模式。如果缺少此目录,我们将处于旧版 BIOS 引导模式。
再次使用ls /dev
anddf
来找出/dev/sdx
我们的安装目标与哪个设备相关联。我们知道 Xubuntu 实时映像安装在/media/cdrom
(所以不是它)并且我们的目标 USB 驱动器包含我们创建的 5 个分区。在下文中,我假设再次/dev/sdb
对应于安装目标。
注意,Xubuntu live 系统会尝试挂载三个 luks 分区。单击Cancel
三下以不这样做。
我们解锁加密分区并手动安装所需的分区,
$ sudo -i
$ cryptsetup open /dev/sdb1 LUKS_BOOT
$ cryptsetup open /dev/sdb5 LUKS_ROOT
$ cd /
$ mkdir -p /target
$ mount /dev/mapper/LUKS_ROOT /target
$ mount /dev/mapper/LUKS_BOOT /target/boot
$ mount /dev/sdb3 /target/boot/efi
然后我们将 root 更改为新的未完成安装并安装所有内容:
$ for n in dev dev/pts proc sys sys/firmware/efi/efivars run etc/resolv.conf; do mount --bind /$n /target/$n; done
$ chroot /target
$ mount -a
现在我们只需要nano /etc/default/grub
添加一行
GRUB_ENABLE_CRYPTODISK=y
按 [Ctrl]+[o] 和 [Enter] 保存文件并按 [Ctrl]+[x] 退出编辑器。然后我们grub2
以可移动模式安装,
$ grub-install --removable /dev/sdb
$ update-grub
想必有报错,就是承载Xubuntu live系统的分区没有grub驱动。我们可以放心地忽略这一点。我们按 [Ctrl]+[d] 退出chroot
会话,然后使用 Xubuntu 的图形界面关闭计算机。我们的 USB 驱动器上的安装完成。
用法
如何引导新的 Kali Linux 2021.4 USB 驱动器
当我们以旧版或 EFI 模式从 USB 驱动器启动时,grub2
要求输入密码(其中一个/boot
)分区,然后直接启动到我们新的 Kali Linux 2021.4。
然而,在一些较旧的 UEFI 机器上,我们被扔进了一个grub2
shell。不过,我们可以简单地键入exit
[Enter] 并进入密码短语的提示符。
Kali 和网络
Kali Linux 对网络连接非常保守,因此您的新安装可能需要进一步设置。如果您打算在不同的机器上启动 USB 驱动器,您可能会根据具体情况设置网络。
如果您希望将 WLAN 置于NetworkManager
图形界面中的控制之下,您需要在设置sudo nano /etc/NetworkManager/NetworkManager.conf
下[ifupdown]
设置managed=true
。我认为sudo systemctl restart NetworkManager
应该足够了,但不知何故我记得它只有在重新启动后才有效。
硬件限制
我不是所使用的 Debian 风格安装程序的专家,但似乎虽然它安装了包含所有模块的完整内核,但它仅将选定的固件驱动程序复制到目标安装。显然,安装程序会探测运行它的硬件,然后安装适用于该机器的固件。
我在一台带有集成英特尔显卡和声音的中国制造的无名英特尔酷睿 i5-10210U 笔记本电脑上进行了测试安装,我确实在那台机器上有工作声音。但是,当我在 Lenovo T14 AMD Gen 1(具有集成 Radeon 显卡和 Realtek ALC257 音频的 AMD Ryzen 5 Pro 4650U)上启动相同的安装时,声音不起作用。因此,您必须期望一些特定于硬件的手动配置是必要的。幸运的是,就我而言,以太网和 WLAN 在我迄今为止尝试过的任何硬件上都可以开箱即用。
最后,虽然安装允许 /suspend 到磁盘 / (/hibernate/),但当你在一个硬件上让系统进入睡眠 (/suspend/) 然后尝试唤醒它 (/resume /) 在不同的机器上。
自定义内核的编译
自定义内核的编译按照这些 Kali 指令中的说明进行,只需进行少量调整。
从到目前为止执行的安装开始,我们需要以下软件包:
$ sudo apt-get install build-essential libncurses5-dev fakeroot xz-utils libelf-dev libssl-dev dwarves
我们安装当前的内核源代码并在里面解压~/src
如下,
$ sudo apt-get install linux-source-5.15
$ mkdir -p ~/src/
$ cd ~/src/
$ tar -xzf /usr/src/linux-source-5.15.tar.xz
如果您有自定义内核配置文件,请将其复制到~/src/linux-source-5.15/.config
. 为了以运行内核的配置为出发点,我们从/boot
分区中获取配置,
$ cp /boot/config-5.14.0-kali4-amd64 ~/src/linux-source-5.15/.config
然后像往常一样配置内核
$ cd ~/src/linux-source-5.15/
$ make menuconfig
并编译如下。请注意,我们在这里构建 Debian 风格的内核包,它会自动处理所有补丁等。
$ make clean
$ make deb-pkg LOCALVERSION=-custom KDEB_PKGVERSION=$(make kernelversion)-1
$ ls ../*.deb
安装新创建的 Debian 内核包就足够了。它包括一个初始 RAM 磁盘,它能够解密 luks 加密分区并将所有内容放在/boot
分区上grub2
以供查找。内核的精确版本取决于您上次升级和解压缩源时 Kali 2021.4 的更新状态。上面的ls ../*.deb
命令显示了生成的 Debian 软件包的全名。
$ sudo dpkg -i ~/src/linux-image-5.15.5-custom_5.15.5-1_amd64.deb
无需重新安装grub2
或进行任何其他手动调整。加密的启动过程仍然有效。
密码学备注
- 对于任何能够检查您的 USB 驱动器的人来说,很明显有一个
grub2
引导分区、一个 EFI 分区以及三个 luks 加密分区。没有似是而非的否认。这是因为 luks 分区具有标准化的标头。 - 请注意,用于加密的完整 AES 密钥也存储在此标头中,仅受密码保护。因此,甚至不需要攻击 AES 密钥本身,而是 luks 标头中存在的数据允许对密码短语进行攻击。攻击者可能会将 luks 标头传输到他选择的数据中心并运行大规模并行字典攻击。这并不奇怪,因为 luks 加密仅使用一个因素,即知道密码。如果您想对此进行改进,您可能决定将 AES 密钥存储在另一种介质上,以获得第二个因素,即拥有 passphase 加密的 AES 密钥。但这将不再可由
grub2
. - 另请注意,
/boot
它足以攻击分区的密码,而这只是 luks1。 - 分区的加密
/boot
大大减少了恶意女仆攻击的攻击面。如果没有/boot
对/boot
. 这已经不可能了。 - 仍然可以
grub2
用一个替代程序替换引导加载程序,该程序首先要求您输入密码,然后有足够的权限访问网络(在您可能尝试从 USB 驱动器启动的任何机器上)以泄露您的密码给攻击者,并最终使用你的密码来启动你的 Kali 安装。你不会注意到这已经发生了。 - 还有另一个潜在的基于软件的邪恶女仆攻击。在您的酒店房间里找到您的 USB 驱动器的女仆可能会首先提取其内容的按位副本。然后她可能会尝试从它启动并注意密码提示的确切形式。然后,她可能会使用另一个引导加载程序覆盖您的 USB 驱动器,该引导加载程序会以完全相同的方式提示您输入密码,然后立即执行她的操作想要。因此,如果您下次插入 USB 驱动器并从它启动,您会将密码短语泄露给她的引导加载程序。如果她能够以某种方式泄露您的密码(通过 WLAN?),那么她不仅拥有您的驱动器的按位副本,而且还拥有您的密码。但是您会立即注意到这种情况已经发生,因为她不太可能模仿您的确切 Kali 安装。
- 您仍然需要信任运行 USB 驱动器的硬件。
致谢
没有当前的指示是不可能的
更新日期:2022 年 9 月 15 日
作者: voidyourwarranty