AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 698017
Accepted
Krackout
Krackout
Asked: 2022-04-05 22:58:01 +0800 CST2022-04-05 22:58:01 +0800 CST 2022-04-05 22:58:01 +0800 CST

启动后卸载 /boot

  • 772

对于我将很快实施的一些高度安全的堡垒虚拟机,我正在考虑/boot在启动后卸载——当然还有其他措施。将仅用于更新内核。

  • 对此进行测试,似乎没有出现任何问题;它会有我遗漏的副作用吗?
  • 这些系统可能基于 Debian Linux(其他场景,在 Redhat 上)。两者都是系统化的。/boot重新启动后在 systemd 系统上卸载的正确方法是什么?为了测试我只是sudo umount /boot.
  • 我正在争论自己是要使用 BIOS 还是 UEFI。由于它们将是虚拟机,因此这是一个选择问题。UEFI 似乎是更现代的更明智的选择。但我不确定安全利益(如果有的话)。相反,因为它更复杂,可能存在更多漏洞的机会。
  • 如果是 UEFI,efi分区呢?它默认安装在里面/boot,虽然我认为/efi可以使用(我没有尝试过),将它们分开并更透明地处理,管理员方面。启动后也可以卸载/boot/efi或/efi卸载而没有副作用吗?
systemd boot
  • 6 6 个回答
  • 3193 Views

6 个回答

  • Voted
  1. Philip Couling
    2022-04-06T00:34:16+08:002022-04-06T00:34:16+08:00

    理论上既不/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。

    • 23
  2. MC68020
    2022-04-06T00:55:45+08:002022-04-06T00:55:45+08:00

    副作用:我自己没有注意到。当然,除了必须在安装新内核之前安装它所带来的负担之外。(可以肯定,因为如果不是这样,安装将优雅而静默地将内核安装在根目录的 /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 秒的中间时间后自动卸载其文件系统。

    • 16
  3. Philip Couling
    2022-04-06T05:58:47+08:002022-04-06T05:58:47+08:00

    现在我想起来了,你是从堡垒虚拟机的特定角度来问这个问题的。这些通常是无状态的,安装的很少。

    如果您远程担心黑客可能使用的损害,/boot那么大部分损害将在 VM 重新启动时生效。

    如果你想要一个极端的观点,你实际上可以完全破坏你的引导分区和引导后。毕竟是虚拟机。要“重新启动”甚至应用安全更新,您只需启动新虚拟机并拆除旧虚拟机。然后,黑客“无能为力”来干扰 VM 的启动顺序。

    正如我在另一个答案中所述,除了应用安全更新之外,没有真正的理由保留/boot和安装。/boot/efi

    • 8
  4. Best Answer
    Austin Hemmelgarn
    2022-04-06T09:25:35+08:002022-04-06T09:25:35+08:00

    对此进行测试,似乎没有出现任何问题;它会有我遗漏的副作用吗?

    不,不是真的,除了某些工具实际上可能需要安装它,而您可能没有想到(例如,GRUB在更新时需要安装它,而不仅仅是内核更新)。

    这些系统可能基于 Debian Linux(其他场景,在 Redhat 上)。两者都是系统化的。重新启动后在 systemd 系统上卸载 /boot 的正确方法是什么?为了测试,我只是 sudo umount /boot。

    正如在其他地方指出的那样,首先不要安装。只需添加noauto到/etc/fstab条目中的选项即可。

    我正在争论自己是要使用 BIOS 还是 UEFI。由于它们将是虚拟机,因此这是一个选择问题。UEFI 似乎是更现代的更明智的选择。但我不确定安全利益(如果有的话)。相反,因为它更复杂,可能存在更多漏洞的机会。

    如果您使用 UEFI,理论上您甚至可以避免需要引导加载程序,但是使用 Debian(以及除 Gentoo 之外的大多数其他 Linux 发行版)执行此操作非常复杂。

    安全启动通常也需要 UEFI,这听起来像是您可能想要的,尽管在 VM 中正确执行此操作很棘手。

    除此之外,一种或另一种方式并没有太多好处,因为您无法审核任何一种情况下涉及的代码(这意味着您无法正确推断出任何一种选择都比另一种更安全)。

    如果是 UEFI,那么 efi 分区呢?默认情况下它安装在 /boot 内,尽管我认为 /efi 可以使用(我没有尝试过),以将它们分开并更透明地处理,管理员方面。/boot/efi 或 /efi 可以在引导后卸载而没有副作用吗?

    与 for 相同的评论/boot。虽然它可以安装在任何地方,但约定表明这/boot/efi是预期的安装点。

    原因有两个:

    • 它使得为面向路径的强制访问控制系统(如 AppArmor)编写安全策略变得更加容易,因为它们可以对/boot.
    • 它使事情井井有条,可以说是应该在的地方。与引导系统有关的东西放在 下/boot,因为它在大多数类 UNIX 系统上已经存在很长时间了。

    顺便说一句,相对于正确操作所涉及的整体困难,这实际上并没有显着改善安全性。

    确保安全的正常方法/boot是确保除 root 用户之外的任何人都无法写入它,或者如果您感觉特别偏执,除 root 之外的任何人都无法读取或遍历它。这种方法意味着任何没有 EUID 为 0或CAP_DAC_OVERRIDE 能力的人都不能在 下修改任何内容/boot,但值得注意的是,不需要任何特殊处理即可使更新正常工作。

    您的方法还意味着任何没有 EUID 0或CAP_DAC_OVERRIDE 功能的人(例如,具有此功能的人可以重写/etc/fstab以便/boot在启动时挂载,然后找到许多创造性方法中的任何一种来强制重新启动系统,或者作为另一个示例,可以直接写入底层块设备)不能修改下的任何内容/boot,但只有在没有任何合法修改下的任何内容时/boot(因为合法修改需要/boot安装)。它还需要特殊处理以确保内核更新、引导加载程序更新和一小部分其他类型的更新(例如第三方内核模块更新)正常工作。请注意,自动挂载在此处不起作用,因为如果您设置了自动挂载,则只需尝试访问目录即可挂载它。

    请注意,您的方法对专门的攻击者没有提供重要的保护,但您更有可能实际上会意外破坏某些东西(例如,但在没有安装它的情况下运行更新)。

    • 6
  5. telcoM
    2022-04-06T09:27:01+08:002022-04-06T09:27:01+08:00

    /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 排序顺序执行。如果您放置一个脚本来挂载/bootas/etc/kernel/preinst.d/000-mountboot和/etc/kernel/prerm.d/000-mountboot另一个脚本以再次卸载它 as /etc/kernel/postinst.d/zzz-umountbootand /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 时至少有两个条件:

    • 安装引导加载程序更新时
    • 安装 UEFI 固件更新时

    目前,与内核更新的情况不同,似乎没有标准的钩子可以为这些事件添加自定义脚本。

    • 4
  6. Rob Pearce
    2022-04-07T05:55:12+08:002022-04-07T05:55:12+08:00

    在操作系统启动后卸载 /boot 当然是可能的。事实上,这是许多 Linux 发行版的标准做法。Gentoo gudie 肯定会假设它,而且我已经在我做过的每一次 Gentoo 安装中都这样做了(这是很多)。

    它是否实现了你认为你会从中得到的东西是一个完全不同的问题。

    • 3

相关问题

  • 系统完好,grub坏了

  • 使用 systemd 看门狗支持重新启动应用程序

  • “pacman -Syu”“可能”破坏了我的系统,因为未安装引导

  • 克隆的 SSD 无法启动并打印奇怪的线条

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve