对于我将很快实施的一些高度安全的堡垒虚拟机,我正在考虑/boot
在启动后卸载——当然还有其他措施。将仅用于更新内核。
- 对此进行测试,似乎没有出现任何问题;它会有我遗漏的副作用吗?
- 这些系统可能基于 Debian Linux(其他场景,在 Redhat 上)。两者都是系统化的。
/boot
重新启动后在 systemd 系统上卸载的正确方法是什么?为了测试我只是sudo umount /boot
. - 我正在争论自己是要使用 BIOS 还是 UEFI。由于它们将是虚拟机,因此这是一个选择问题。UEFI 似乎是更现代的更明智的选择。但我不确定安全利益(如果有的话)。相反,因为它更复杂,可能存在更多漏洞的机会。
- 如果是 UEFI,
efi
分区呢?它默认安装在里面/boot
,虽然我认为/efi
可以使用(我没有尝试过),将它们分开并更透明地处理,管理员方面。启动后也可以卸载/boot/efi
或/efi
卸载而没有副作用吗?
理论上既不
/boot/
也不/boot/efi
常用开机后。两者形成了 BIOS(或类似的)和操作系统之间的桥梁。它们通常不在运行时使用。它们已安装,以便您可以重新配置引导,以便您的操作系统可以更新/升级其引导顺序。也就是说,在 Debian 上,
apt
/dpkg
将触发对两者的更改。除了 dpkg(或 redhat 衍生产品上的 rpm)之外,任何东西都不太可能想要访问
/boot
文件树。从安全的角度来看,我会挑战卸载的智慧。它们都应该对除 root 以外的所有用户都是只读的。如果用户获得 root 访问权限,那么他们可以挂载它们。另一方面,阻止您的系统应用更新(包括安全补丁)可能会打开比关闭更多的漏洞。
相反,您是否考虑过使用等隔离堡垒访问
chroot
?Chroot 让那些登录的人只能访问一个子文件树,一个 pid 命名空间和用户命名空间可以防止某些东西逃逸(chroot
仅靠它是不够的)。最简单的方法可能是用在容器内运行 openssh 的 docker (或 podman )替换您的SSH 服务器。这会将任何 SSH 客户端留在 docker 容器中,而不是看不到主机系统。该容器内的文件系统可能非常小,例如一个alpine linux 容器,除了一个最小的命令行几乎什么都没有。
为清楚起见,请注意: chroot 不足以隔离进程。通过 root 访问,一个进程可以逃脱 chroot。然而,其他隔离(例如 pid 和用户命名空间以及删除功能)对于保护 chroot 监狱中的进程应该做很多事情......因此建议使用 docker。
副作用:我自己没有注意到。当然,除了必须在安装新内核之前安装它所带来的负担之外。(可以肯定,因为如果不是这样,安装将优雅而静默地将内核安装在根目录的 /boot 目录中……)
然而,在安全性方面的好处是值得商榷的。
继续进行的正确方法(无论 init 系统如何)几乎可以肯定是……不要在启动时挂载它……因为它实际上从来不需要;-P
检查 fstab 中的相关条目并简单地添加一个noauto参数,这可能看起来像:
LABEL=LTUX_BOOT /boot ext4 noauto,noatime 0 2
如果您确实想要安装它(以便稍后卸载),您可以从安装系统的x-systemd.idle-timeout功能中受益。
noauto,x-systemd.automount,x-systemd.idle-timeout=1s
在 fstab 的 /boot 条目中添加类似的东西会在 1 秒的中间时间后自动卸载其文件系统。现在我想起来了,你是从堡垒虚拟机的特定角度来问这个问题的。这些通常是无状态的,安装的很少。
如果您远程担心黑客可能使用的损害,
/boot
那么大部分损害将在 VM 重新启动时生效。如果你想要一个极端的观点,你实际上可以完全破坏你的引导分区和引导后。毕竟是虚拟机。要“重新启动”甚至应用安全更新,您只需启动新虚拟机并拆除旧虚拟机。然后,黑客“无能为力”来干扰 VM 的启动顺序。
正如我在另一个答案中所述,除了应用安全更新之外,没有真正的理由保留
/boot
和安装。/boot/efi
不,不是真的,除了某些工具实际上可能需要安装它,而您可能没有想到(例如,GRUB在更新时需要安装它,而不仅仅是内核更新)。
正如在其他地方指出的那样,首先不要安装。只需添加
noauto
到/etc/fstab
条目中的选项即可。如果您使用 UEFI,理论上您甚至可以避免需要引导加载程序,但是使用 Debian(以及除 Gentoo 之外的大多数其他 Linux 发行版)执行此操作非常复杂。
安全启动通常也需要 UEFI,这听起来像是您可能想要的,尽管在 VM 中正确执行此操作很棘手。
除此之外,一种或另一种方式并没有太多好处,因为您无法审核任何一种情况下涉及的代码(这意味着您无法正确推断出任何一种选择都比另一种更安全)。
与 for 相同的评论
/boot
。虽然它可以安装在任何地方,但约定表明这/boot/efi
是预期的安装点。原因有两个:
/boot
./boot
,因为它在大多数类 UNIX 系统上已经存在很长时间了。顺便说一句,相对于正确操作所涉及的整体困难,这实际上并没有显着改善安全性。
确保安全的正常方法
/boot
是确保除 root 用户之外的任何人都无法写入它,或者如果您感觉特别偏执,除 root 之外的任何人都无法读取或遍历它。这种方法意味着任何没有 EUID 为 0或CAP_DAC_OVERRIDE 能力的人都不能在 下修改任何内容/boot
,但值得注意的是,不需要任何特殊处理即可使更新正常工作。您的方法还意味着任何没有 EUID 0或CAP_DAC_OVERRIDE 功能的人(例如,具有此功能的人可以重写
/etc/fstab
以便/boot
在启动时挂载,然后找到许多创造性方法中的任何一种来强制重新启动系统,或者作为另一个示例,可以直接写入底层块设备)不能修改下的任何内容/boot
,但只有在没有任何合法修改下的任何内容时/boot
(因为合法修改需要/boot
安装)。它还需要特殊处理以确保内核更新、引导加载程序更新和一小部分其他类型的更新(例如第三方内核模块更新)正常工作。请注意,自动挂载在此处不起作用,因为如果您设置了自动挂载,则只需尝试访问目录即可挂载它。请注意,您的方法对专门的攻击者没有提供重要的保护,但您更有可能实际上会意外破坏某些东西(例如,但在没有安装它的情况下运行更新)。
/boot
通常由 bootloader使用,通常由 GRUB 使用。在典型用法中,/boot
将包含可能需要更新内核更新的任何引导加载程序配置文件,以及已安装内核版本的内核和 initramfs 文件。如果引导加载程序需要一些其他文件,也可以将它们放在/boot
.由于引导加载程序需要在 OS 内核出现之前运行,它不能依赖于 Linux 内核概念,例如“挂载文件系统”。相反,当引导加载程序访问文件系统时,它必须使用固件支持(UEFI 系统上的 EFI 系统分区)或引导加载程序自己的文件系统驱动程序来完成。此类引导加载程序级别的驱动程序通常被简化并仅提供读取访问权限,不使用高级缓存或任何其他提高性能的方法,因为它们的唯一工作是加载引导操作系统内核所需的少数文件。
您通常无法将引导加载程序的文件系统驱动程序的状态转移到内核的控制中,并且由于内核通常具有更多性能更高的文件系统驱动程序,您甚至都不想这样做。
一旦引导加载程序成功地将内核(在 Linux 的情况下,通常还有 initramfs 文件)加载到 RAM 内存并启动内核,
/boot
文件系统的工作就基本上完成了。Linux 内核和 initramfs 文件通常都不需要/boot
文件系统以外的任何东西。/boot
作为系统启动的一部分进行挂载的唯一原因是让它随时可用,以防安装内核更新。因此,
/boot
在绝大多数情况下,“启动后卸载”的最佳方式是简单地将其注释掉/etc/fstab
或添加一个noauto
安装选项,即首先不在启动时安装它。似乎有一组标准目录用于在内核更新时运行脚本:
/etc/kernel/preinst.d/
对于应该在安装新内核之前运行的脚本/etc/kernel/postinst.d/
安装新内核后应该运行的脚本/etc/kernel/prerm.d/
和/etc/kernel/postrm.d/
分别用于应该在删除已安装内核之前和之后运行的脚本。这些目录中的脚本将按文件名按通常的 US-ASCII 排序顺序执行。如果您放置一个脚本来挂载
/boot
as/etc/kernel/preinst.d/000-mountboot
和/etc/kernel/prerm.d/000-mountboot
另一个脚本以再次卸载它 as/etc/kernel/postinst.d/zzz-umountboot
and/etc/kernel/postrm.d/zzz-umountboot
,那么您应该获得您想要的功能,假设您的发行版的标准内核包被构建为在适当的阶段调用这些脚本。UEFI 的 ESP 分区(通常挂载为
/boot/efi
)完全相同,但用于系统固件而不是引导加载程序。一旦固件*.efi
从 ESP 分区成功加载了引导加载程序文件(以及引导加载程序可能在那里的任何补充文件),ESP 的主要工作就会完成,并且在引导加载程序更新或下一个引导周期之前不再需要它.但是,UEFI ESP 分区可以具有辅助功能:如果 UEFI 固件支持“固件更新胶囊”(即从正在运行的操作系统中调度系统固件更新的标准化方式),则需要将固件更新文件写入设置更新过程之前的 ESP。Linux 有使用这种机制的工具:参见 commands 的手册页
fwupdate
,fwupdmgr
和/或fwupdtool
. 如果此机制最终将取代特定于供应商的 UEFI/BIOS 更新工具,则必须安装 ESP 时至少有两个条件:目前,与内核更新的情况不同,似乎没有标准的钩子可以为这些事件添加自定义脚本。
在操作系统启动后卸载 /boot 当然是可能的。事实上,这是许多 Linux 发行版的标准做法。Gentoo gudie 肯定会假设它,而且我已经在我做过的每一次 Gentoo 安装中都这样做了(这是很多)。
它是否实现了你认为你会从中得到的东西是一个完全不同的问题。