ubuntuusers.de

Nested/recursive system decryption with LVM and LUKS

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Yalman

Anmeldungsdatum:
21. Juli 2012

Beiträge: 18

Hallo @all,

Problem: Verschachtelte bzw. Kettenentschluesselung mit systemd und ggf. einem initramfs

System: BananaPro SoC mit u-boot Bootloader, custom Kernel 4.9 mit Debian

Randbedingungen: USB-Stick zum entschluesseln sowie die Systemdisk mit folgenden Strukturen:

usbstick -> lvm -> lv_A1 -> luks_A1 -> keyfile_for_B1
                -> lv_A2 -> ...
                ...

system   -> ext4-boot_B -> keyfile_for_A1
         -> lvm -> lv_B1 -> luks_B1 -> root_fs
                -> lv_B2 -> ...
                ...

Im Prinzip will ich eine Kette von entschluesselungs-Routinen starten. Schluessel fuer B1(root_fs) liegt in A1(usbstick_part), deren Schluessel wiederum liegt in der unverschluesselten Boot-Partition von B(system-boot-part).

Mit den entsprechenden Eintraegen in der crypttab und der fstab habe ich es nicht hin bekommen. Der Versuch ein eigenes Script in die initramfs einzufuegen ist auch gescheitert. Ich habe fast! das ganze Internet durchsucht und selber Probiert aber es nicht geschafft. Vielleicht koennt ihr mir helfen. Im voraus schonmal einen grossen Dank.

Moderiert von redknight:

In passende Spezialforum verschoben.

Bearbeitet von redknight:

HowTo aus dem Titel entfernt, um den Eindruck einer Anleitung zu vermeiden.

Benno-007

Anmeldungsdatum:
28. August 2007

Beiträge: 29240

Wohnort: Germany

Die Anleitung findest du in LUKS, aber ein Hinderniss könnte dabei das LVM vor B1 sein - das müsste ja irgendwie vor dem Ableiten des Keys gestartet sein, ggf. werden, danach anschließend Zugriff auf die Platte oder Ableitungsregel starten (udev? systemd?). In der Richtung meine allgemeinen Überlegungen.

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7782

Die Bootpartition wird normalerweise(tm) ja gar nicht gemountet oder erst wenn / schon gemountet ist.

Du verlangst von deinem System also, daß zuerst /boot woanders hin gemountet wird um ans Keyfile zu kommen und dann wieder weg damit...

Es würde mich nicht wundern wenn das von den Standardscripten nicht mehr abgedeckt wird.

Wenn das Keyfile auf der Bootpartition nicht irgendwie besonders geschützt ist (also unverschlüsselt)... vielleicht hast du irgendwo noch ein Sektor frei so daß du dort eine Partition anlegen und diese Partition direkt als Key verwenden könntest. Dann würde der Mount entfallen und das könnte dann eventuell auch wieder mit den Standardscripten klappen. Ausprobiert habe ich das jetzt aber mal nicht.

Man kann sich so ein Initramfs auch einfach komplett selbst stricken: https://wiki.gentoo.org/wiki/Custom_Initramfs

Aber vielleicht sollte man sich vorher überlegen ob diese Komplexität wirklich notwendig ist / einen praktischen Nutzen hat.

Yalman

(Themenstarter)

Anmeldungsdatum:
21. Juli 2012

Beiträge: 18

Danke fuer die Tipps. Ich habe es nun zum laufen gebracht. Weiss aber nicht ob es norm konform ist. Fehler bitte melden. Folgend ein kleines Pseudo-Script welches die Vorgaenge zeigt.

1
2
3
4
5
6
7
cp keyfile_A1 /root                             # Schluessel fuer den USB-Keystore
cp keyscript.sh /root                           # der Entschluesselungsprozess
cp copy_keyfile.sh /etc/initramfs-tools/hooks/  # kopiert key und keyscript in die initramfs
cp crypttap.shadow /etc                         # verhindert eine doppelte Ausfuehrung von crypttab. Die crypttab kann leer bleiben.
sed -e 's/\/crypttab/\/crypttab.shadow/g' /usr/share/initramfs-tools/hooks/cryptroot > /etc/initramfs-tools/hooks/cryptroot   # workaround um, bei erstellung der initramfs, die benoetigten crytpt module und binaries in die initramfs zu kopieren, bei ausfuehrung der initramfs zu aktivieren und das keyscript ueberhaupt starten zu koennen.
update-initramfs -ut
mkimage ...-T ramdisk  initrd                   # u-boot

Ansonsten hier noch das keyscript:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/bin/sh

PREREQ="lvm2 cryptroot"
prereqs() {
        echo "$PREREQ"
}

case $1 in
        prereqs)
                prereqs
                exit 0
                ;;
esac

. /scripts/functions
# Begin real processing below this line

UUID_PATH='/dev/disk/by-uuid'
BANANAPRO_SYSTEM='uuid ey'           # aka luks_B1 uuid
DECRYPTED_SYSTEM='nochmal uuid'      # aka luks_B1 rootfs uuid
KEYSTORE_BANANAPRO='echt jetzt?'     # aka luks_A1 uuid
DECRYPTED_BANANAPRO_KEYSTORE='komm mach windows'     # aka luks_A1 fs uuid

while [ ! -h ${UUID_PATH}/${DECRYPTED_SYSTEM} ] ; do
        if [ -h ${UUID_PATH}/${KEYSTORE_BANANAPRO} ] && \
           [ ! -h ${UUID_PATH}/${DECRYPTED_BANANAPRO_KEYSTORE} ] && \
           [ ! -h ${UUID_PATH}/${DECRYPTED_SYSTEM} ]; then
                echo 'OPEN KEY'
                cryptsetup -d /root/keyfile_A1 open ${UUID_PATH}/${KEYSTORE_BANANAPRO} luks_A1_open
                mkdir -p /mnt
                mount -r ${UUID_PATH}/${DECRYPTED_BANANAPRO_KEYSTORE} /mnt
        fi

        if [ -h ${UUID_PATH}/${BANANAPRO_SYSTEM} ] && \
           [ ! -h ${UUID_PATH}/${DECRYPTED_SYSTEM} ] && \
           [ -h ${UUID_PATH}/${DECRYPTED_BANANAPRO_KEYSTORE} ]; then
                echo 'OPEN SYSTEM'
                cryptsetup -d /mnt/keyfile_B1  open ${UUID_PATH}/${BANANAPRO_SYSTEM} luks_B1_open
                umount -f /mnt
                cryptsetup close ${UUID_PATH}/${DECRYPTED_BANANAPRO_KEYSTORE}
                dmsetup remove /dev/usbstick_VG_name/*
        fi
        if [ -h ${UUID_PATH}/${DECRYPTED_SYSTEM} ]; then
                echo 255 | tee /sys/devices/platform/leds/leds/bananapro\:green\:usr/brightness > /sys/devices/platform/leds/leds/bananapro\:blue\:usr/brightness       fi
        sleep 1
done
exit 0

das Kopier-Hook

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sh
PREREQ=""
prereqs()
{
        echo "$PREREQ"
}

case $1 in
        prereqs)
                prereqs
                exit 0
                ;;
esac

. /usr/share/initramfs-tools/hook-functions
# Begin real processing below this line

copy_exec '/root/keyscript.sh'
copy_exec '/root/keyfile_B1'

exit 0

die crypttab.shadow (der Inhalt ist fast egal. Eine Zeile muesste reichen. Hauptsache das keyscript startet)

1
2
luks_A1_open UUID=LUKS_A1_UUID /root/keyfile_A1 luks,keyscript=/root/keyscript.sh
luks_B1_open UUID=luks_B1_uuid /dev/disk/by-uuid/LUKS_A1_FS_UUID:/keyfile_B1 luks,keyscript=/root/keyscript.sh

ich hoffe der ein oder andere kann was damit anfangen. Geht die Skripte nochmal durch da ich spezifische Zeichenketten ersetzt habe. Schade das systemd noch nicht die noetige Dynamik erreicht um auch quere Konstellationen einfach zu booten. Als naechstes muesste noch die boot Partition verifiziert werden. Stichwort: UEFI/Secure boot(?custom). Ich denke ich werde dies(inkl. Keystore) mit einem USBArmory relisieren da dieser auch noch viele andere Sicherheitsfunktionen bietet. Gruesse

Yalman

(Themenstarter)

Anmeldungsdatum:
21. Juli 2012

Beiträge: 18

Die Idee war das in meinem Keystore nicht alle Schluessel unverschluesselt rumliegen. Es soll nur das System auf den Schluessel/LogicalVolume im USB-Stick zugreifen koennen, welchen er benoetigt, um seine eigene root Partition zu entschluesseln. Ich nenne es mal ZickZack entschluesselung ☺.

PS: die LED aktivierung im keyscript kann hinter die Schleife gelegt werden.

Antworten |