Вопрос Как включить Ubuntu (используя полное шифрование диска), чтобы вызвать LUKSsupend перед сном / приостановлением работы в ОЗУ?


Этот вопрос связан с Еще один by @Stefan, но это не дубликат. Вопросы немного разные: автор просто хотел узнать, было ли это реализовано, а я прошу о помощи, конкретно о том, как это сделать (определенным образом). Кроме того, другой вопрос не получил полезных ответов для исполнителей, кроме недавнего, что просто связано с моей попыткой этого.

Объяснив «дублирующийся» вопрос ...

Я на Ubuntu 14.04, используя полное шифрование диска (LVM поверх LUKS), и я хотел бы включить luksSuspend в процедуру приостановки (и позже использовать luksResume), чтобы я мог приостановить работу в ОЗУ, не оставив ключевой материал в памяти, а корень разблокирован.

Я попытался скрипт для Arch Linux, до сих пор без успеха: я честно понятия не имею, что я делаю ...

Может ли кто-нибудь помочь мне портировать это (или создать что-то подобное с нуля)? Или, по крайней мере, кто-нибудь может указать мне на документацию о том, как подключить контент к процедурам приостановки и как сохранить необходимые бинарные файлы и скрипты (например, cryptsetup), доступный даже после блокировки всех IO до root (по luksSuspend)?

Что касается того, как сохранить необходимые исполняемые файлы и сценарии для возобновления, это другое сообщение в блоге (также для Arch) скопировали их на /boot; Однако я хотел бы использовать что-то большее в строках, которые использовал Vianney в сценарии, о котором я упоминал ранее, потому что этот подход выглядит немного более изящным в этом аспекте.

Я не достиг многого, но мое развитие можно найти на GitHub,


106
2017-09-21 04:42


происхождения


вы пытались добавить ручную команду блокировки для спящего режима / возобновления действий? например, добавление udisksctl lock -b /dev/sda к сценарию в /etc/pm/sleep.d/ каталог? - AliReza Mosajjal
Спасибо, я посмотрю ... Из того, что я уже могу сказать, это более общий, чем LUKS cryptsetup luksSuspendЯ использовал, но, с другой стороны, необходимо размонтировать файловую систему. Кроме того, он, вероятно, не будет работать в тюрьме (поскольку он общается с демоном udisksd) и не может использоваться для повторной установки / возобновления файловой системы. - Jonas Malaco
Даже если вы удаляете ключевой материал, возможно, есть другая конфиденциальная информация в памяти во время приостановки в ОЗУ. Итак, в чем смысл избавления от ключа luks? - pefu
@pefu Ну, во-первых, количество конфиденциальной информации на диске может быть намного больше, чем осталось в ОЗУ. Кроме того, способность злоумышленника идентифицировать и / или изменять информацию в ОЗУ довольно ограничена по сравнению с доступом к расшифрованной файловой системе. - Jonas Malaco
@jonasmalacofilho: Ну, я считаю, что мои личные ключи являются самым конфиденциальным материалом на моем ноутбуке. Конечно, эти секретные ключи также защищены парольной фразой. При запуске я обычно загружаю эти ключи и запускаю агент, который, конечно же, имеет расшифрованную копию этих ключей, хранящихся где-то в ОЗУ. Поэтому, если мой компьютер попадает в руки сложного злоумышленника, который может обойти любую защиту экрана и спасти данные из ОЗУ, я был бы ввернут, даже если бы я уничтожил ключ LUKS в ОЗУ, прежде чем вступать в приостановку. Правильно? - pefu


ответы:


Извините за это, но вы попробовали добавить скрипт, содержащий команды cryptsetup luksSuspend / luksResume, к /usr/lib/pm-utils/sleep.d? Если так, что случилось?

Для меня было бы логичным, чтобы вызвать stop / start cryptdisks и cryptdisks_early services в hibernate / resume тоже. Вызов cryptdisks_stop и cryptdisks_start внутри скрипта в pm-utils/sleep.d Покажи фокус? Я предполагаю, что это будет иметь тот же результат, что и вызов cryptsetup luksSuspend непосредственно.


1
2017-09-18 10:32



До сих пор мой подход заключался в том, чтобы сменить pm-suspend. Тем не менее, по-прежнему, по-видимому, загружаются модули ядра, которые требуют доступа к корневому fs при попытке приостановить (с echo mem > /sys/power/state). См. связанный репозиторий Больше подробностей. - Jonas Malaco


Самое близкое решение, которое я смог найти, - это доказательство 2013 года сценария suspend.sh от Mikko Rauhala.

#!/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 Вот. Это отнюдь не идеальное решение, поскольку есть еще некоторые открытые вопросы и похоже, что с 11 июня 2014 года не было выпущено никакой работы. Однако это кажется хорошей отправной точкой для будущего развития.

Источник:https://github.com/jonasmalacofilho/ubuntu-luks-suspend 


0
2018-01-15 14:18