Як я можу включити Ubuntu (використовуючи повне шифрування диска) для виклику LUKSsupend перед сном / призупиненням оперативної пам'яті?


104

Це питання пов'язане з іншим від @Stefan, але воно не є його дублікатом. Питання дещо різні: автор просто хотів дізнатися, чи це було здійснено, в той час як я прошу спеціально допомогти, як це зробити (певним чином). Крім того, на інше запитання не було корисних відповідей для виконавців, за винятком нещодавнього, який стосувався моєї спроби цього.

Пояснивши "дублікат" питання ...

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

Я намагався перенести сценарій для Arch Linux , поки що без успіху: я, чесно кажучи, не маю уявлення, що я роблю ...

Хтось може допомогти мені перенести це (або створити щось подібне з нуля)? Або, принаймні, хтось може вказати мені на документацію про те, як підключити речі до процедур призупинення та як зберегти необхідні бінарні файли та скрипти (наприклад, cryptsetup), навіть якщо всі IO для root були заблоковані (від luksSuspend)?

Щодо того, як зберегти необхідні бінарні файли та сценарії, доступні для резюме, цей інший пост у блозі (також для Arch) скопіював їх у /boot; Однак я хотів би використати щось більше у рядках, які використовував Віяні в сценарії, про який я згадував раніше, оскільки цей підхід у цьому аспекті трохи елегантніший.

Я не досяг багато чого, але мій розвиток можна знайти на GitHub .


Ви намагалися додати команду ручного блокування для сну / відновлення дій? наприклад додавання udisksctl lock -b /dev/sdaдо скрипту в /etc/pm/sleep.d/каталозі?
AliReza Mosajjal

Дякую, я перегляну це ... З того, що я вже можу сказати, це більш загальне, ніж ЛУКС, який cryptsetup luksSuspendя тільки використовував, але з іншого боку вимагає відключення файлової системи. Крім того, він, ймовірно, не буде працювати у в'язниці (оскільки він спілкується з демоном udisksd) і не може бути використаний для повторного відновлення / відновлення файлової системи.
Йонас Малако

Навіть якщо вилучаєте ключовий матеріал, можливо, є інша конфіденційна інформація в пам'яті під час призупинення оперативної пам'яті. Тож який сенс у тому, щоб позбутися лише ключа лукса?
пефу

@pefu Ну, по-перше, кількість конфіденційної інформації на диску може бути набагато більшою, ніж залишилася в оперативній пам'яті. Крім того, можливість зловмисника ідентифікувати та / або змінювати інформацію в оперативній пам'яті є досить обмеженою в порівнянні з наявністю доступу до розшифрованої файлової системи.
Йонас Малако

@jonasmalacofilho: Ну: я вважаю свої приватні ключі найбільш конфіденційним матеріалом у своєму ноутбуці. Звичайно, ці приватні ключі також захищені парольною фразою. Під час запуску я зазвичай завантажую ці ключі і маю запуск агента, який, звичайно, має розшифровану копію цих ключів, що зберігається десь в оперативній пам'яті. Тож якщо мій комп'ютер потрапить до рук витонченого зловмисника, який здатний обійти захист екрану і врятувати дані з оперативної пам’яті, я був би вкручений, навіть якби я знищив ключ LUKS в оперативній пам’яті перед тим, як зупинятися. Правильно?
пефу

Відповіді:


1

Вибачте, що констатується очевидний, але ви спробували додати скрипт, що містить команди cryptsetup luksSuspend / luksResume до /usr/lib/pm-utils/sleep.d? Якщо так, що сталося?

Мені буде здаватися логічним також викликати зупинку / запуск криптовалют та сервісів cryptdisks_early на сплячому режимі / резюме. Чи закликає cryptdisks_stop і cryptdisks_start в рамках сценарію pm-utils/sleep.dзробити трюк? Я припускаю, що це матиме такий самий результат, як і дзвінок cryptsetup luksSuspendбезпосередньо.


Поки мій підхід полягав у зміні вечора-зупинки. Однак, як і раніше, є деякі завантажені модулі ядра, які потребують доступу до кореневого файлу при спробі призупинити (з echo mem > /sys/power/state). Детальнішу інформацію див. У пов'язаному сховищі .
Йонас Малако

0

Найближче рішення, яке мені вдалося знайти, - це підтвердження сценарію концептуального suspend.sh 2013 року Мікко Раухала.

#!/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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.