Comment puis-je activer Ubuntu (à l'aide du chiffrement intégral du disque) pour appeler LUKSsupend avant de passer en mode veille / suspension dans la RAM?

104

Cette question est liée à une autre de @Stefan, mais ce n’est pas une copie. Les questions sont légèrement différentes: l'auteur voulait simplement savoir si cela avait été mis en œuvre, alors que je sollicitais une aide spécifique pour savoir comment procéder (de manière particulière). En outre, l’autre question n’a pas apporté de réponses utiles aux développeurs, à l’exception d’une question récente qui ne fait que relier ma tentative à cet égard.

Après avoir expliqué le problème de "duplication" ...

Je suis sur Ubuntu 14.04 et j'utilise le chiffrement intégral du disque (LVM au-dessus de LUKS) et j'aimerais incorporer luksSuspendla procédure de suspension (et son utilisation ultérieure luksResume) afin que je puisse suspendre en RAM sans laisser de matériel de clé en mémoire et la racine non verrouillée.

J'ai essayé de porter un script pour Arch Linux , sans succès jusqu'à présent: je n'ai honnêtement aucune idée de ce que je fais ...

Quelqu'un peut-il m'aider à porter ceci (ou à créer quelque chose comme ça à partir de zéro)? Ou, au moins, quelqu'un peut-il m'indiquer la documentation sur la manière d'intégrer des éléments dans les procédures de suspension et de conserver les fichiers binaires et les scripts nécessaires (tels que cryptsetup) même après le blocage de toutes les entrées-sorties d'e-root (par luksSuspend)?

En ce qui concerne la façon de garder les fichiers binaires et les scripts nécessaires à la reprise, cet autre article de blog (également pour Arch) les a copiés /boot; J'aimerais cependant utiliser quelque chose de plus dans les lignes que Vianney a utilisées dans le script que j'ai mentionné précédemment, car cette approche semble être un peu plus élégante à cet égard.

Je n'ai pas atteint beaucoup, mais mon développement peut être trouvé sur GitHub .

Jonas Malaco
la source
avez-vous essayé d'ajouter une commande de verrouillage manuel aux actions de mise en veille prolongée / de reprise? par exemple ajouter udisksctl lock -b /dev/sdaà un script dans le /etc/pm/sleep.d/répertoire?
AliReza Mosajjal
Merci, je vais y jeter un coup d'œil ... D'après ce que je peux déjà dire, ceci est plus général que le seul LUKS que cryptsetup luksSuspendj'utilise, mais nécessite en revanche le démontage du système de fichiers. En outre, il ne fonctionnera probablement pas dans une prison (puisqu'il communique avec le démon udisksd) et ne peut pas être utilisé pour remonter / reprendre le système de fichiers.
Jonas Malaco
Même si vous enlevez les clés, il y a probablement d'autres informations confidentielles en mémoire pendant la suspension dans RAM. Alors, à quoi sert-il de ne supprimer que la clé luks?
pefu
@pefu Eh bien, premièrement, la quantité d'informations confidentielles sur le disque peut être beaucoup plus grande que celle laissée dans la RAM. De plus, la capacité de l'attaquant à identifier et / ou modifier les informations sur la RAM est plutôt limitée par rapport à l'accès au système de fichiers déchiffré.
Jonas Malaco
@ jonasmalacofilho: Eh bien: je considère mes clés privées comme le contenu le plus confidentiel de mon ordinateur portable. Bien entendu, ces clés privées sont également protégées par une phrase secrète. Au démarrage, j'ai l'habitude de charger ces clés et de faire exécuter un agent qui possède bien sûr une copie déchiffrée de ces clés stockée quelque part dans la RAM. Donc, si mon ordinateur tombe entre les mains d'un attaquant sophistiqué qui est capable de contourner toute sécurité d'écran de veille et de récupérer les données de la RAM, je serais foutu même si j'avais détruit la clé LUKS dans la RAM avant de passer en suspension. Droite?
pefu

Réponses:

1

Désolé d’énoncer une évidence, mais avez-vous essayé d’ajouter un script contenant les commandes cryptsetup luksSuspend / luksResume à la commande /usr/lib/pm-utils/sleep.d? Si c'est le cas, que s'est-il passé?

Il me semblerait logique d'appeler également arrêter / démarrer les services cryptdisks et cryptdisks_early sur hibernate / resume. Est-ce qu'appeler cryptdisks_stop et cryptdisks_start dans un script pm-utils/sleep.dferait l'affaire? Je suppose que cela aurait le même résultat que d'appeler cryptsetup luksSuspenddirectement.

Sibaz
la source
Jusqu'ici, mon approche consistait à changer pm-suspend. Cependant, il semble toujours que certains modules du noyau chargés nécessitent un accès au fs racine lorsqu’on tente de suspendre (avec echo mem > /sys/power/state). Voir le référentiel lié pour plus de détails.
Jonas Malaco
0

La solution la plus proche que j'ai pu trouver est ce script de validation de concept susp.sh de Mikko Rauhala de 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

Certains travaux ont été faits pour porter ceci vers Ubuntu 14.04 ici. Ce n'est en aucun cas une solution parfaite, car il reste quelques problèmes en suspens et il semble qu'aucun travail n'ait été publié depuis le 11 juin 2014. Cependant, cela semble un bon point de départ pour un développement futur.

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

Elder Geek
la source