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

104

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

Habiendo explicado el problema del "duplicado" ...

Estoy en Ubuntu 14.04 usando el cifrado de disco completo (LVM sobre LUKS) y me gustaría incorporarlo luksSuspendal procedimiento de suspensión (y luego usarlo luksResume) para poder suspenderlo en la RAM sin dejar material clave en la memoria y la raíz desbloqueada.

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

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

En cuanto a cómo mantener los binarios y scripts necesarios disponibles para reanudar, esta otra publicación de blog (también para Arch) los copió /boot; Sin embargo, me gustaría usar 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 he alcanzado mucho, pero mi desarrollo se puede encontrar en GitHub .

Jonas Malaco
fuente
¿Has intentado agregar el comando de bloqueo manual para hibernar / reanudar acciones? por ejemplo, agregar udisksctl lock -b /dev/sdaa un script en el /etc/pm/sleep.d/directorio?
AliReza Mosajjal
Gracias, lo investigaré ... Por lo que ya puedo decir, esto es más general que el LUKS que solo cryptsetup luksSuspendhe estado usando, pero por otro lado requiere desmontar el sistema de archivos. Además, probablemente no funcionará en una cárcel (ya que se comunica con el demonio udisksd) y no podría usarse para volver a montar / reanudar el sistema de archivos.
Jonas Malaco
Incluso si elimina el material clave, probablemente haya otra información confidencial en la memoria durante la suspensión a la RAM. Entonces, ¿qué sentido tiene deshacerse de la clave de Lucas?
pefu
@pefu Bueno, primero, la cantidad de información confidencial en el disco puede ser mucho mayor que la que queda en la RAM. Además, la capacidad del atacante para identificar y / o cambiar información en la RAM es bastante limitada en comparación con tener acceso al sistema de archivos descifrado.
Jonas Malaco
@jonasmalacofilho: Bueno: considero mis claves privadas como el material más confidencial de mi computadora portátil. Por supuesto, estas claves privadas también están protegidas por una frase de contraseña. En el inicio, generalmente cargo estas claves y tengo un agente ejecutándose que, por supuesto, tiene una copia descifrada de estas claves almacenadas en algún lugar de la RAM. Entonces, si mi computadora cae en manos de un atacante sofisticado que puede eludir cualquier seguridad de protector de pantalla y rescatar los datos de la RAM, me atornillaría incluso si hubiera destruido la clave LUKS en la RAM antes de suspenderla. ¿Derecho?
pefu

Respuestas:

1

Lamento 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 llamar a detener / iniciar los servicios cryptdisks y cryptdisks_early en hibernate / resume también. ¿Llamar a cryptdisks_stop y cryptdisks_start dentro de un script en pm-utils/sleep.dhacer el truco? Supongo que esto tendría el mismo resultado que llamar cryptsetup luksSuspenddirectamente.

sibaz
fuente
Hasta ahora, mi enfoque era cambiar pm-suspend. Sin embargo, todavía parece haber algunos módulos del núcleo cargados que requieren acceso a la raíz fs cuando se intenta suspender (con echo mem > /sys/power/state). Vea el repositorio vinculado para más detalles.
Jonas Malaco
0

La solución más cercana que he podido encontrar es esta prueba de concepto 2013 suspend.sh script de 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 realizado algún trabajo para portar esto a Ubuntu 14.04 aquí. Esta no es una solución perfecta, ya que todavía hay algunos problemas abiertos y parece que no se ha lanzado ningún trabajo desde el 11 de junio de 2014. Sin embargo, parece un buen punto de partida para el desarrollo futuro.

Fuente: https://github.com/jonasmalacofilho/ubuntu-luks-suspend

Elder Geek
fuente