对内核进行签名/校验和以防止/检测操纵

对内核进行签名/校验和以防止/检测操纵

我的所有分区都已加密(//home),但/boot分区必须保持未加密状态并可供操作。我正在考虑在启动时对内核进行哈希处理,并根据存储值(在编译时生成,保存在我的加密驱动器上)检查结果,以查看自上次启动以来是否有人以某种方式操纵了内核(甚至可能是物理上的)。写这样的脚本有问题吗?已经有程序可以做到这一点吗?

答案1

您正在寻找的内容 - 验证计算机上运行的操作系统是否是您信任的操作系统 - 称为可信启动。 (这是有时被称为可信启动的几种事物之一)。您提出的方法无法实现此目标。

不提供加密数据的完整性或者真实性。换句话说,它不能阻止攻击者修改磁盘内容并用恶意操作系统替换它。这个恶意操作系统可以很容易地被编程为显示您期望加载的内核的校验和。

最简单的攻击路径是中间人攻击者在某种虚拟机下运行您的正常操作系统。虚拟机层将您的输入传输到所需的操作系统并将输出传回。但它还会在侧面记录您的击键(mmmm、密码),从操作系统内存中窥探私钥等等。

为了避免这种形式的攻击,您需要有一个信任根:您出于某种原因而信任的系统组件,而不是因为系统的其他组件这么说。换句话说,你必须从某个地方开始。从您拥有的硬件开始是一个好的开始;您可以将操作系统保存在您看不见的 USB 密钥上,然后仅将其插入您有足够信心的硬件中(硬件可能存在恶意软件!)。请注意,如果您愿意信任计算机,您也可能会信任其硬盘。

有一种技术解决方案可以弥合信任小芯片和信任整个台式机或笔记本电脑之间的差距。有些电脑有一个TPM(可信平台模块)其中可以验证是否只能启动已知的操作系统。值得信赖的 Grub支持 TPM,因此通过 TPM 加上 Trusted Grub,您可以确保您正在运行的内核是您已批准的内核。

请注意,采用 TPM 可能对您有利,也可能对您不利。这一切都取决于谁拥有钥匙。如果您拥有 TPM 的私钥,那么您可以准确控制计算机上运行的内容。如果只有制造商拥有私钥,那么这就是将通用平台变成锁定设备的一种方法。

答案2

启动的内核驻留在内存中。您可以编写一个脚本来定位它/dev/mem,并在知道其大小的情况下计算并验证其校验和。

您还可以对整个硬盘进行加密,无需/boot分区并且(几乎)无法修改内核。如何?我能想到的两种方法:

  • 将内核放在 CD 上,计算机将从该 CD 上启动。这并不难;有些人几年前报告使用过这样的设置 - 请参阅第二篇文章在此论坛主题中

  • 如果你的主板是由 coreboot 支持并且有足够的空间容纳最小内核,您可以在 BIOS 芯片上安装启用加密的内核。(我还没有机会进行测试,但我认为这没有理由行不通。)

编辑:请注意,所有这些都只是迈向“值得信赖”或者“已验证”靴子(吉尔斯正确地指出了这一点)。完整的机制还应该考虑引导加载程序阶段发生的情况以及如何识别底层硬件。看一下Google Chromium 操作系统是如何做到这一点的

相关内容