¿Cómo habilito Ubuntu (usando cifrado de disco completo) para llamar a LUKSsupend antes de suspender / suspender a RAM?

106

Esta pregunta está relacionada con otra de @Stefan, pero no es un duplicado de eso. Las preguntas son ligeramente diferentes: el autor simplemente quería saber si esto se había implementado, mientras yo pedía ayuda específicamente sobre cómo hacerlo (de una manera particular). Además, la otra pregunta no obtuvo respuestas útiles para los implementadores, excepto una reciente que simplemente se vinculó a mi intento de hacer esto.

Habiendo explicado el problema "duplicado" ...

Estoy en Ubuntu 14.04 usando cifrado de disco completo (LVM en la parte superior de LUKS) y me gustaría incorporar luksSuspend en el procedimiento de suspensión (y luego uso luksResume ) para poder suspender la RAM sin salir material clave en la memoria y la raíz desbloqueada.

Intenté portar un script para Arch Linux , hasta ahora sin éxito: sinceramente no tengo idea de lo que estoy haciendo ...

¿Alguien me puede ayudar a portar esto (o crear algo como esto desde cero)? O, al menos, ¿alguien puede indicarme documentación sobre cómo enganchar cosas en los procedimientos de suspensión y cómo mantener disponibles los binarios y scripts necesarios (como cryptsetup) incluso después de que se haya bloqueado todo el IO a raíz (por luksSuspend ) ?

Con respecto a cómo mantener disponibles los binarios y scripts necesarios para su reanudación, este otra publicación de blog (también para Arch) las copió a /boot ; Sin embargo, me gustaría utilizar algo más en las líneas que Vianney usó en el guión que mencioné antes, porque ese enfoque parece ser un poco más elegante en este aspecto.

No llegué demasiado, pero mi desarrollo se puede encontrar en GitHub .

    
pregunta Jonas Malaco 21.09.2013 - 06:42

2 respuestas

1

Perdón por decir lo obvio, pero ¿ha intentado agregar un script que contiene los comandos cryptsetup luksSuspend / luksResume al /usr/lib/pm-utils/sleep.d ? Si es así, ¿qué pasó?

Me parece lógico, para detener / iniciar los servicios de cryptdisks y cryptdisks_early en hibernación / reanudar también. Llamaría a cryptdisks_stop y cryptdisks_start dentro de un script en pm-utils/sleep.d ¿el truco? Supongo que esto tendría el mismo resultado que llamar cryptsetup luksSuspend directamente.

    
respondido por el sibaz 18.09.2015 - 12:32
0

La solución más cercana que he podido encontrar es esta prueba del concepto suspend.sh de 2013 por 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

Se ha trabajado un poco para llevar esto a Ubuntu 14.04 aquí. No es una solución perfecta ya que todavía hay algunos problemas abiertos y parece que no se ha publicado ningún trabajo desde el 11 de junio de 2014. Sin embargo, parece un buen punto de partida para el desarrollo futuro.

Fuente: enlace

    
respondido por el Elder Geek 15.01.2018 - 15:18

Lea otras preguntas en las etiquetas