在暂停到 RAM 之前擦除加密 (LUKS) 密钥?

信息安全 linux 卢克斯
2021-09-03 08:47:03

我最近一直想知道在我将设备(通常是笔记本电脑)挂起到 S3 模式之前,是否有办法从 RAM 中擦除我的 LUKS 密钥。我对适用于我的/分区的解决方案感兴趣。以我想象的方式,我希望我的系统在我恢复它时再次要求我输入密码。

如果不存在这样的解决方案,我想知道基于 VM 的解决方案是否可行。在挂起之前,VM 也将被挂起(以某种其他方式暂停),调试器将查找 LUKS 私钥,将其保存到某个安全位置,从 RAM 中擦除所有出现的位置,并在电源恢复时,使用解密密钥用户的密码并将其恢复到所有保存的偏移量。GPG/SSH/比特币密钥也可以做到这一点。这会是一种安全的方法吗?如果不是,为什么?

2个回答

该解决方案称为“休眠”或挂起到磁盘。

根据设计,暂停到 RAM 会立即唤醒,并且更多地是作为一种省电模式而不是“关闭”版本。

软件可以收到有关挂起到内存即将发生的通知,并且诸如密码安全程序之类的东西应该——而且通常会——自动清除它们的密钥。你可以很容易地改变例如 SSH 客户端来做同样的事情,如果他们还没有的话。

但是,磁盘加密程序不一定会这样做,因为在恢复过程中可能需要访问在这些磁盘上打开的文件。

非系统分区

对于分区其他比系统分区,你可以使用下面的systemd单元:

[Unit]
Description=Wipe Keys before <target>
After=<target>

[Service]
Type=oneshot
ExecStart=/path/to/wipe

[Install]
WantedBy=<target>

<target>是您所需模式的对应目标。systemd-suspend.service联机帮助suspend.targethibernate.targethybrid-sleep.target

wipe脚本:

dmsetup suspend "$name"
dmsetup message "$name" 0 key wipe

或者如果你使用 LUKS

cryptsetup luksSuspend <name>

恢复系统后,您需要发出:

dmsetup message "$name" 0 key set  "$key"
dmsetup resume  "$name"

或者

cryptsetup luksResume <name>

虚拟机

如果将整个虚拟机放在主机的加密磁盘上,可以使用相同的方法,但需要通过“保存系统状态”停止来宾,并确保此状态也保存在加密磁盘上. Wou 会在您的wipe脚本中添加类似以下命令的内容:

VBoxManage controlvm "$vboxname" savestate

并恢复

VBoxManage controlvm "$vboxname" resume

请记住,未能真正阻止来宾不会暴露您的加密密钥。它只会让来宾的 RAM 在您的 RAM 或交换中未加密。

全系统加密

有一个休眠解决方案(将 RAM 保存到驱动器),具有整个系统加密。基本上你还必须加密你的交换。请参见此处此处挂起到 RAM 时这对您没有帮助。