NetBSD 完整磁盘加密方案探讨:超越仅加密 /home 的局限
来源标题:Disk encryption on NetBSD – achieving secrecy
仅加密 /home 可能不足以保护系统敏感数据,崩溃转储、服务器日志和用户邮件等都可能泄露信息。文章探讨了 cgdroot 方案之外的折中方法,即在不大幅改动 NetBSD 标准安装和启动流程的前提下实现更全面的加密。
以下正文由 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 并想测试日志文件系统(Log File System),我将输入“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 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。