NetBSD 磁盘加密实践:仅加密 /home 可能不够,需覆盖 /var、/etc 等分区
来源标题:Disk encryption on NetBSD – achieving secrecy
NetBSD 磁盘加密若只加密 /home,仍会暴露敏感数据:崩溃转储含内存快照,/var 日志和邮件通知可能泄露文件名,/etc 含系统配置。文章探讨在保持标准 NetBSD 安装与启动流程的前提下,对 /var 等分区加密的折中方案,而非改动启动流程的 cgdroot 方式。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
/var —— 日志文件、系统级数据库(例如邮件通知)、崩溃转储…… /root —— 与 root 用户账户相关的配置文件 /usr/pkg 和 /usr/local —— 安装第三方软件的位置 /etc —— 初始化脚本、基础系统的系统级配置 一种简单的做法可能是加密 /home。不过,对一些用户来说这可能还不够。虽然崩溃目录可以通过 sysctl 轻松更改,但崩溃转储包含系统内存的快照,其中可能含有敏感信息。如果系统上运行过任何服务器,日志文件也可能敏感。发送给用户的邮件(例如关于被中断的 vi 会话及相关备份)可能会泄露敏感的文件名。 一些用户选择 cgdroot 方案,它只使用一个小的未加密 ramdisk 来转向一个加密文件系统。然而,这会显著修改系统启动流程,并可能使某些救援选项更难使用。因此,值得一问的是:是否存在一种折中方案,仍然使用标准的 NetBSD 安装和启动过程?许多 BSD 系统为 /usr 和 /var 使用单独的文件系统分区,而这是 NetBSD 安装程序支持的标准配置。 /etc 是更难解决的问题,因为它包含启动系统所必需的文件。不过,在典型的桌面系统上,/etc 中的许多文件保持不变。/etc 中的密码通常仅以哈希形式存储,但 Wi-Fi 接入点和某些 VPN 配置除外(不过,很容易重新配置 wpa_supplicant_flags,使其使用 /etc 中默认配置文件之外的其他配置文件)。许多配置文件只在启动过程的较晚阶段、/usr 已经挂载之后才被加载,并且可以轻松替换为指向另一文件系统上文件的符号链接。 NetBSD 安装程序功能基础,但能快速完成任务。在此配置中,我们将把 NetBSD 安装到一个小的未加密根文件系统上。当你开始忽略 /usr、/var 和 /home 中可能出现的增长时,即使是包含开发工具的完整 NetBSD 安装也很小。4 GB 应该绰绰有余。 出于示例目的,我将使用一台 sparc64 虚拟机,但对于 amd64 等更主流的 CPU 架构,过程基本相同。 安装程序检测到我们已经有一个分区磁盘。我们将选择 "e: Delete everything" 选项,以便从一块全新的磁盘开始: 接下来,我们将选择 "Set sizes of NetBSD partitions"。这将允许我们拥有一个小的根分区,并预留一个大的加密分区: 在这里,我决定要一个 4096 MB(4 GB)的根文件系统,以及一个分配给 /var 的 11263 MB(11 GB)分区。稍后,我们将让 /usr 和 /var 共享一个磁盘分区,所以不必太担心这一点。选择 "Go on"。 在下一个屏幕上,我已将二级分区的类型改为 "cgd"(列在 "Other type" 下),这是 NetBSD 的加密设备驱动。我还将其挂载点设置为 "-",以便稍后重新配置: 我告诉安装程序我要进行完整安装(Full Installation),它照常完成,将所有内容安装到小的根分区中。 当我们重启并以 root 登录后,我们进入了一个新世界……我们 4 GB 的未加密根分区。 由于我使用的是 sparc64,磁盘被划分为 disklabel。wd0 是主驱动器,disklabel 命令显示 /dev/wd0d 是为我们的加密文件系统预留的分区:
disklabel wd0
size offset fstype [fsize bsize cpg/sgs]
a: 8389584 0 4.2BSD 0 0 0 # (Cyl. 0 - 8322) b: 2097152 8389584 swap # (Cyl. 8323 - 10403*) c: 33554432 0 unused 0 0 # (Cyl. 0 - 33288*) d: 23067072 10487232 cgd # (Cyl. 10404 - 33287) 我们可以直接为 cgd 创建参数文件:
cgdconfig -g -k argon2id -o /etc/cgd/wd0d adiantum 256
然后加载配置并设置我们的密码:
cgdconfig -V re-enter cgd0 /dev/wd0d
现在,cgd0 作为又一块磁盘出现在系统中,但对该磁盘的所有访问尝试都将由内核自动加密/解密。 下次我们输入密码时,我们希望能够验证密码是否正确。这是通过基于加密分区内容选择一种验证方法来实现的。为了灵活性,我们将在加密分区内再放入一个 disklabel。这将允许系统通过查找有效的 disklabel 轻松验证密码是否正确,同时也让我们在文件系统选择上具有灵活性。
disklabel -i cgd0
这会打开交互式编辑器。我们将输入 N 为我们的 disklabel 设置名称(输入类似 "cgdlabel" 的内容),然后输入 a 修改第一个子分区。 首先,它询问文件系统类型。输入 ? 显示类型列表: partition>a Filesystem type [unused]: ? Supported file system types: 由于我运行的是 -current 并想测试日志文件系统,我将输入 "4.4LFS"。更常见且经过充分测试的配置是 "4.2BSD"。 接下来是起始偏移量和分区大小: Start offset ('x' to start after partition 'x') [0c, 0s, 0M]: 0 Partition size ('$' for all remaining) [0c, 0s, 0M]: $ 由于 "a" 是目前唯一的子分区,默认起始值 0 没问题。"$" 将使用 cgd 上的所有可用空间。 最后,我们将保存新的 label 并退出 disklabel 编辑器: partition>W Label disk [n]?y Label written partition>Q 现在将 /etc/cgd/wd0d 中的 verify_method 改为 disklabel, 并在 /etc/cgd/cgd.conf 中添加一行,以便在启动时创建 cgd: cgd0 /dev/wd0d /etc/cgd/wd0d 现在我们可以将此隐藏分区作为 /dev/cgd0a 访问。但为了使其有用,我们需要在其上创建文件系统。同样,这里我使用的是日志文件系统:
newfs_lfs /dev/rcgd0a
更常见且经过充分测试的配置是 FFSv2ea:
newfs -O2ea /dev/rcgd0a
现在我们可以挂载并访问加密文件系统:
mkdir -p /encfs
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。