Jak włączyć Ubuntu (przy użyciu pełnego szyfrowania dysku), aby wywoływać LUKSsupend przed uśpieniem / zawieszeniem w pamięci RAM?

104

To pytanie jest powiązane z innym pytaniem @Stefan, ale nie jest jego duplikatem. Pytania są nieco inne: autor chciał po prostu wiedzieć, czy zostało to zaimplementowane, a ja proszę o pomoc, w jaki sposób to zrobić (w określony sposób). Dodatkowo, drugie pytanie nie otrzymało użytecznych odpowiedzi dla implementatorów, z wyjątkiem ostatniego, które jedynie powiązane z moją próbą tego.

Po wyjaśnieniu problemu „duplikowania” ...

Jestem na Ubuntu 14.04, używając pełnego szyfrowania dysku (LVM na górze LUKS) i chciałbym włączyć luksSuspendsię do procedury zawieszenia (i późniejszego użycia luksResume), aby móc zawiesić się w pamięci RAM bez pozostawiania klucza w pamięci i odblokowaniu katalogu głównego.

Próbowałem przenieść skrypt dla Arch Linux , jak dotąd bez powodzenia: szczerze mówiąc, nie mam pojęcia, co robię ...

Czy ktoś może mi pomóc to przenieść (lub stworzyć coś takiego od zera)? A przynajmniej czy ktoś może wskazać mi dokumentację na temat tego, jak podpiąć się do procedur zawieszania i jak zachować niezbędne pliki binarne i skrypty (takie jak cryptsetup), nawet po zablokowaniu wszystkich operacji we / wy do rootowania luksSuspend?

Jeśli chodzi o zachowanie niezbędnych plików binarnych i skryptów dostępnych do wznowienia, ten inny post na blogu (również dla Arch) skopiował je /boot; Chciałbym jednak użyć czegoś więcej w liniach, których używał Vianney w skrypcie, o którym wspomniałem wcześniej, ponieważ podejście to wydaje się nieco bardziej eleganckie w tym aspekcie.

Nie osiągnąłem wiele, ale mój rozwój można znaleźć na GitHub .

Jonas Malaco
źródło
próbowałeś dodać ręczne polecenie blokady do hibernacji / wznów działania? na przykład dodawanie udisksctl lock -b /dev/sdado skryptu w /etc/pm/sleep.d/katalogu?
AliReza Mosajjal,
Dzięki, przyjrzę się temu ... Z tego, co już wiem, jest to bardziej ogólne niż LUKS cryptsetup luksSuspend, z którego korzystałem, ale z drugiej strony wymaga odmontowania systemu plików. Ponadto prawdopodobnie nie będzie działać w więzieniu (ponieważ komunikuje się z demonem udisksd) i nie można go użyć do ponownego zamontowania / wznowienia systemu plików.
Jonas Malaco,
Nawet po usunięciu kluczowego materiału w pamięci prawdopodobnie znajdują się inne poufne informacje podczas zawieszania pamięci RAM. Po co więc pozbywać się tylko klucza luks?
pefu
@pefu Cóż, po pierwsze, ilość poufnych informacji na dysku może być znacznie większa niż w pamięci RAM. Ponadto zdolność atakującego do identyfikowania i / lub zmiany informacji w pamięci RAM jest raczej ograniczona w porównaniu z dostępem do odszyfrowanego systemu plików.
Jonas Malaco
@jonasmalacofilho: Cóż: Uważam moje klucze prywatne za najbardziej poufny materiał w moim laptopie. Oczywiście te klucze prywatne są również chronione hasłem. Podczas uruchamiania zwykle ładuję te klucze i mam agenta, który oczywiście ma odszyfrowaną kopię tych kluczy zapisaną gdzieś w pamięci RAM. Więc jeśli mój komputer wpadnie w ręce wyrafinowanego atakującego, który jest w stanie ominąć wszelkie zabezpieczenia wygaszacza ekranu i uratować dane z pamięci RAM, zostałbym wkręcony, nawet gdybym zniszczył klucz LUKS w pamięci RAM przed zawieszeniem. Dobrze?
pefu

Odpowiedzi:

1

Przepraszamy za oczywiste, ale czy próbowałeś dodać skrypt zawierający polecenia cryptsetup luksSuspend / luksResume do /usr/lib/pm-utils/sleep.d? Jeśli tak, co się stało?

Logiczne wydaje mi się również wywoływanie stop / start usług kryptograficznych i cryptdisks_early w trybie hibernacji / wznowienia. Czy wywołanie cryptdisks_stop i cryptdisks_start w skrypcie załatwi sprawę pm-utils/sleep.d? Zakładam, że przyniosłoby to taki sam skutek jak cryptsetup luksSuspendbezpośrednie dzwonienie .

Sibaz
źródło
Do tej pory moim podejściem było zmienić zawieszenie pm. Jednak nadal wydaje się, że niektóre moduły jądra są załadowane i wymagają dostępu do root fs podczas próby zawieszenia (za pomocą echo mem > /sys/power/state). Zobacz połączone repozytorium, aby uzyskać więcej informacji.
Jonas Malaco,
0

Najbliższym rozwiązaniem, jakie udało mi się znaleźć, jest ten skrypt sprawdzania koncepcji 2013 suspend.sh autorstwa 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

Poczyniono już pewne prace nad przeniesieniem tego do Ubuntu 14.04 tutaj. Nie jest to bynajmniej idealne rozwiązanie, ponieważ wciąż istnieją pewne otwarte problemy i wydaje się, że od 11 czerwca 2014 r. Nie wydano żadnych prac. Wydaje się jednak, że jest to dobry punkt wyjścia do dalszego rozwoju.

Źródło: https://github.com/jonasmalacofilho/ubuntu-luks-suspend

Starszy Geek
źródło