如何使Ubuntu(使用全盘加密)在睡眠/挂起到RAM之前调用LUKSsupend?


104

此问题与@Stefan的另一个问题有关,但不是重复的问题。问题略有不同:作者只是想知道是否已实施,而我正在寻求有关如何执行此操作的帮助(以特定方式)。另外,另一个问题对实施者没有有用的答案,除了最近的一个问题只是与我的尝试有关。

在解释了“重复”问题之后...

我在使用全盘加密(在LUKS之上为LVM)的Ubuntu 14.04上,并且我希望将其合并luksSuspend到挂起过程中(并在以后使用luksResume),这样我就可以挂起到RAM而不用将关键材料留在内存中并且无需锁定根。

到目前为止,我一直尝试为Arch Linux移植脚本,但没有成功:老实说,我不知道自己在做什么...

谁能帮我移植(或从头开始创建类似的东西)?或者,至少,有人能指出我有关如何将内容挂接到挂起过程以及如何确保必要的二进制文件和脚本(例如cryptsetup)可用的文档,即使已阻止所有IO根(通过luksSuspend)。

关于如何保持必要的二进制文件和脚本可用于简历,该另一篇博客文章(也适用于Arch)将其复制到/boot;但是,我想在Vianney之前提到的脚本中使用更多的内容,因为这种方法在这方面似乎更优雅。

我还没有达到什么目标,但是我的开发可以在GitHub找到


您是否尝试过添加手动锁定命令以休眠/恢复操作?例如添加udisksctl lock -b /dev/sda/etc/pm/sleep.d/目录中的脚本?
AliReza Mosajjal

谢谢,我将进行调查...据我所知,这比cryptsetup luksSuspend我一直使用的LUKS更通用,但另一方面,它需要卸载文件系统。另外,它可能无法在监狱中工作(因为它与udisksd守护程序通信),因此不能用于重新挂载/恢复文件系统。
乔纳斯·马拉科

即使删除密钥材料,在挂起到RAM的过程中,内存中可能还会存在其他机密信息。那么,仅消除luks键有什么意义呢?
pefu

@pefu好吧,首先,磁盘上的机密信息量可能比RAM中剩余的机密信息大得多。另外,与访问解密文件系统相比,攻击者识别和/或更改RAM信息的能力相当有限。
乔纳斯·马拉科

@jonasmalacofilho:嗯:我认为我的私钥是笔记本电脑中最机密的材料。当然,这些私钥也受到密码短语的保护。在启动时,我通常会加载这些密钥并运行一个代理,该代理当然会将这些密钥的解密副本存储在RAM中的某个位置。因此,如果我的计算机落入了能够绕过任何屏幕保护程序安全性并从RAM抢救数据的复杂攻击者手中,即使我在进入挂起状态之前销毁了RAM中的LUKS密钥,也将被搞砸。对?
pefu

Answers:


1

抱歉,很明显,但是您是否尝试过将包含cryptsetup luksSuspend / luksResume命令的脚本添加到/usr/lib/pm-utils/sleep.d?如果是这样,怎么了?

在我看来,也可以在休眠/恢复上调用停止/启动cryptdisks和cryptdisks_early服务。会在脚本中调用cryptdisks_stop和cryptdisks_start pm-utils/sleep.d吗?我认为这与cryptsetup luksSuspend直接调用具有相同的结果。


到目前为止,我的方法是更改​​pm暂停。但是,似乎仍然加载了一些内核模块,这些内核模块在尝试挂起(带有echo mem > /sys/power/state)时需要访问根fs 。有关更多详细信息,请参见链接的存储库
乔纳斯·马拉科

0

我能够找到的最接近的解决方案是Mikko Rauhala撰写的2013年概念证明suspend.sh脚本。

#!/bin/sh

# A proof of concept script for forgetting LUKS passwords on suspend
# and reasking them on resume.

# The basic idea is to copy all of the files necessary for luksResume
# onto a RAM disk so that we can be sure they'll be available without
# touching the disk at all. Then switch to a text VT to run the resume
# (easier to make sure it'll come up than to do the same with X).

# The suspend itself has to be done from the ramdisk too to make sure it
# won't hang. This is also a reason why this couldn't be reliably done as a
# self-contained /etc/pm/sleep.d script, so to make the concept clear
# (and because I'm lazy) I did just a minimal standalone proof of concept
# instead. Integrating the functionality into the usual pm tools would be
# encouraged. (Though suspend_pmu would apparently need perl on the ramdisk...)

# (C) 2013 Mikko Rauhala 2013, modifiable and distributable under
# CC0, GPLv2 or later, MIT X11 license or 2-clause BSD. Regardless
# of what you pick, there is NO WARRANTY of any kind.

RAMDEV=/dev/ram0
ROOT=/run/cryptosuspend

PATH=/sbin:/bin:/usr/sbin:/usr/bin

# Cleanup not strictly necessary every time but good for development.
# Doing it before rather than after a suspend for debugging purposes

for a in "$ROOT"/dev/pts "$ROOT"/proc "$ROOT"/sys "$ROOT" ; do
    umount "$a" > /dev/null 2>&1
done

if mount | grep -q "$ROOT" ; then
    echo "Cleanup unsuccessful, cryptosuspend root premounted." 1>&2
    exit 2
fi

if grep -q mem /sys/power/state; then
    METHOD=mem
elif grep -q standby /sys/power/state; then
    METHOD=standby
else
    echo "No mem or standby states available, aborting" 1>&2
    exit 1
fi

if ! mount | grep -q "$RAMDEV" ; then
    mkfs -t ext2 -q "$RAMDEV" 8192
    mkdir -p "$ROOT"
    mount "$RAMDEV" "$ROOT"
    mkdir "$ROOT"/sbin "$ROOT"/bin "$ROOT"/dev "$ROOT"/tmp "$ROOT"/proc "$ROOT"/sys
    cp "$(which cryptsetup)" "$ROOT"/sbin
    for a in $(ldd "$(which cryptsetup)" | grep "/" | cut -d / -f 2- | cut -d " " -f 1) ; do
        mkdir -p "$ROOT""$(dirname /$a)"
        cp "/$a" "$ROOT"/"$a"
    done
    cp "$(which busybox)" "$ROOT"/bin/
    ln -s busybox "$ROOT"/bin/sh
    ln -s busybox "$ROOT"/bin/sync
    cp -a /dev "$ROOT"
    mount -t proc proc "$ROOT"/proc
    mount -t sysfs sysfs "$ROOT"/sys
    mount -t devpts devpts "$ROOT"/dev/pts
fi

CRYPTDEVS="$(dmsetup --target crypt status | cut -d : -f 1)"

echo '#!/bin/sh' > "$ROOT"/bin/cryptosuspend
echo "sync" >> "$ROOT"/bin/cryptosuspend
echo "for a in $CRYPTDEVS ; do" >> "$ROOT"/bin/cryptosuspend
echo "  cryptsetup luksSuspend \$a" >> "$ROOT"/bin/cryptosuspend
echo "done" >> "$ROOT"/bin/cryptosuspend
echo "echo -n \"$METHOD\" > /sys/power/state" >> "$ROOT"/bin/cryptosuspend
echo "for a in $CRYPTDEVS ; do" >> "$ROOT"/bin/cryptosuspend
echo '  while ! cryptsetup luksResume'" \$a ; do" >> "$ROOT"/bin/cryptosuspend
echo "    true" >> "$ROOT"/bin/cryptosuspend
echo "  done" >> "$ROOT"/bin/cryptosuspend
echo "done" >> "$ROOT"/bin/cryptosuspend
chmod a+rx "$ROOT"/bin/cryptosuspend

sync
exec openvt -s chroot "$ROOT" /bin/cryptosuspend

为了将其移植到Ubuntu 14.04,已经做了一些工作这绝对不是一个完美的解决方案,因为仍然存在一些未解决的问题,而且自2014年6月11日以来似乎还没有发布任何作品。但是,这似乎是未来开发的良好起点。

资料来源:https : //github.com/jonasmalacofilho/ubuntu-luks-suspend

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.