Wie aktiviere ich Ubuntu (unter Verwendung der vollständigen Festplattenverschlüsselung), um LUKSsupend aufzurufen, bevor ich in den Energiesparmodus versetzt werde?

104

Diese Frage ist mit einer anderen von @Stefan verwandt, aber es ist kein Duplikat davon. Die Fragen sind etwas anders: Der Autor wollte nur wissen, ob dies implementiert wurde, und ich bitte um Hilfe, um genau zu wissen, wie dies (auf eine bestimmte Art und Weise) geschehen soll. Darüber hinaus erhielt die andere Frage keine nützlichen Antworten für Implementierer, mit Ausnahme einer neuen, die lediglich mit meinem Versuch in Verbindung gebracht wurde.

Nachdem ich das "Duplikat" -Problem erklärt habe ...

Ich arbeite unter Ubuntu 14.04 mit vollständiger Festplattenverschlüsselung (LVM zusätzlich zu LUKS) und möchte mich an luksSuspendder Suspend-Prozedur beteiligen (und später verwenden luksResume), damit ich den RAM-Speicher deaktivieren kann, ohne Schlüsselmaterial im Arbeitsspeicher zu belassen und das Root-Verzeichnis zu entsperren.

Ich habe bisher erfolglos versucht, ein Skript für Arch Linux zu portieren : Ich habe ehrlich gesagt keine Ahnung, was ich tue ...

Kann mir jemand helfen, dies zu portieren (oder so etwas von Grund auf neu zu erstellen)? Oder kann mich jemand auf die Dokumentation verweisen, wie man Dinge in die Suspend-Prozeduren einbindet und wie man die notwendigen Binärdateien und Skripte (wie Cryptsetup) verfügbar hält, selbst nachdem alle E / A-Vorgänge für Root (von luksSuspend) blockiert wurden ?

In Bezug auf, wie die notwendigen Binärdateien und Skripte für Lebenslauf, diese zur Verfügung zu halten , andere Blog - Post (auch für Arch) kopierte sie auf /boot; Ich möchte jedoch etwas mehr in den Zeilen verwenden, die Vianney in dem Skript verwendet hat, das ich zuvor erwähnt habe, da dieser Ansatz in dieser Hinsicht etwas eleganter erscheint.

Ich habe nicht viel erreicht, aber meine Entwicklung ist auf GitHub zu finden .

Jonas Malaco
quelle
Haben Sie versucht, einen manuellen Sperrbefehl hinzuzufügen, um Aktionen in den Ruhezustand zu versetzen / fortzusetzen? Zum Beispiel Hinzufügen udisksctl lock -b /dev/sdazu einem Skript im /etc/pm/sleep.d/Verzeichnis?
AliReza Mosajjal
Danke, ich werde mich darum kümmern ... Soweit ich weiß, ist dies allgemeiner als das LUKS, das cryptsetup luksSuspendich bisher nur verwendet habe, aber andererseits muss das Dateisystem entladen werden. Außerdem funktioniert es wahrscheinlich nicht in einem Gefängnis (da es mit dem udisksd-Daemon kommuniziert) und kann nicht zum erneuten Laden / Wiederaufnehmen des Dateisystems verwendet werden.
Jonas Malaco
Selbst wenn das Schlüsselmaterial entfernt wird, befinden sich während des Suspend-to-RAM-Vorgangs wahrscheinlich andere vertrauliche Informationen im Speicher. Was bringt es also, nur den luks-Schlüssel loszuwerden?
Pefu
@pefu Nun, erstens kann die Menge an vertraulichen Informationen auf der Festplatte viel größer sein als die Menge, die im RAM verbleibt. Darüber hinaus ist die Fähigkeit des Angreifers, Informationen im RAM zu identifizieren und / oder zu ändern, im Vergleich zum Zugriff auf das entschlüsselte Dateisystem eher eingeschränkt.
Jonas Malaco
@jonasmalacofilho: Nun: Ich betrachte meine privaten Schlüssel als das vertraulichste Material in meinem Laptop. Natürlich sind diese privaten Schlüssel auch durch eine Passphrase geschützt. Beim Start lade ich normalerweise diese Schlüssel und habe einen Agenten am Laufen, der natürlich eine entschlüsselte Kopie dieser Schlüssel irgendwo im RAM gespeichert hat. Wenn also mein Computer in die Hände eines erfahrenen Angreifers fällt, der in der Lage ist, die Sicherheit eines Bildschirmschoners zu umgehen und die Daten aus dem RAM zu retten, wäre ich fertig, selbst wenn ich den LUKS-Schlüssel im RAM zerstört hätte, bevor ich in den Suspend-Modus gewechselt wäre. Richtig?
Pefu

Antworten:

1

Entschuldigen Sie die offensichtliche Angabe, aber haben Sie versucht, ein Skript mit den Befehlen cryptsetup luksSuspend / luksResume zum hinzuzufügen /usr/lib/pm-utils/sleep.d? Wenn ja, was ist passiert?

Es erscheint mir logisch, die Dienste cryptdisks und cryptdisks_early im Ruhezustand / Wiederaufnahmemodus ebenfalls mit stop / start zu starten. Würde das Aufrufen von cryptdisks_stop und cryptdisks_start in einem Skript pm-utils/sleep.dden Trick machen? Ich nehme an, dies hätte das gleiche Ergebnis wie ein cryptsetup luksSuspenddirekter Anruf .

sibaz
quelle
Bisher bestand mein Ansatz darin, pm-suspend zu ändern. Es scheint jedoch immer noch einige Kernelmodule zu geben, die beim Versuch, (mit echo mem > /sys/power/state) anzuhalten, Zugriff auf die Root-Fs benötigen . Weitere Informationen finden Sie im verknüpften Repository .
Jonas Malaco
0

Die nächste Lösung, die ich finden konnte, ist das 2013 erstellte Proof-of-Concept-Skript suspend.sh von 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

Es wurde einiges getan, um dies hier auf Ubuntu 14.04 zu portieren . Dies ist auf keinen Fall eine perfekte Lösung, da noch einige Probleme offen sind und es den Anschein hat, dass seit dem 11. Juni 2014 kein Werk mehr veröffentlicht wurde. Es scheint jedoch ein guter Ausgangspunkt für die zukünftige Entwicklung zu sein.

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

Elder Geek
quelle