Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Ruhezustand mit encrypted Swap.
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Deutsche Dokumentation
View previous topic :: View next topic  
Author Message
Max Steel
Advocate
Advocate


Joined: 12 Feb 2007
Posts: 2270
Location: My own world! I and Gentoo!

PostPosted: Tue Jun 05, 2018 12:50 pm    Post subject: Ruhezustand mit encrypted Swap. Reply with quote

Hallo Leute,
hier heute mal einen Ansatz der garnicht neu ist und für mich funktioniert.
Quasi ein positiver Erfahrungsbericht.

Ziel ist es für Laptops den Datendiebstahl durch einfaches Laptop mitnehmen zu erschweren, sodass es sich für "${Angreifer}" kaum lohnt, dich stehen zu lassen. (FYI Ich bin kein wirklich paranoider Typ, sonst würde ich "mein Setup" ja wohl kaum vorstellen ;) )

An dieser Stelle hoffe ich dass jeder irgendwie die Partitionen resizen kann um etwas zusätzlichen Platz für eine eigene swap-Partition anzulegen, oder schon immer eine eigene swap dafür hatte, diese aber bislang nicht nutzen konnte.

Was brauchen wir:
  • Ein laufendes Gentoo Linux mit crypted Root.
  • ein wenig Platz auf der Platte für eine eigene Partition für swap (ich wählte die Größe etwas über dem eingebauten Arbeitsspeicher)


Also, wie gehts los.
Den ersten Rückschlag über den ich garnicht vorher nachdachte, das Standardsetup von dmcrypt sieht wohl vor, dass der Key für das cryptswap aus RNG-Daten automagisch generiert wird und es jeden Boot neu erzeugt wird. Ich habe cryptswap allerdings fest mit LUKS und 2 Keys formatiert. Einem keyfile, welches ich unter /etc/crypt legte, root-only lesbar natürlich generiert aus urandom (bytes=4096 count=1).
Code:
dd if=/dev/urandom of=/etc/crypt/cryptswap bytes=4096 count=1
cryptsetup luksFormat /dev/sda3 -d /etc/crypt/cryptswap


und zum zweiten ein zusätzliches Passwort, da man auch in der Wildnis den Rechner zuverlässig aus dem Ruhezustand holen können möchte.
Code:
cryptsetup luksAddKey /dev/sda3 -d /etc/crypt/cryptswap


in der /etc/conf.d/dmcrypt muss das natürlich auch entsprechend geändert werden, sonst wäre das alles hinfällig:

Code:
#/etc/conf.d/dmcrypt
target=cryptswap
source='/dev/sda3'
key='/etc/crypt/swap'


Nun zur initramfs, das Setup habe ich mit einer genkernel-initramfs ehrlich gesagt garnicht erst ausprobiert. Ich habe meine initramfs mittels usr/gen_init_cpio aus dem Kernel-paket erstellt.

Dieses Tool nach /usr/src/initramfs kopiert und um eine initramfs-list und einem init erweitert und wir sind ready-to-go.

Die Ergänzung innerhalb des init-scripts sieht einen dividing Path vor, der auf das Keyword resume in der cmdline des Kernel reagiert um dann nach resume_after_hibernate abzubiegen:

Code:
#/usr/src/initramfs/init
[...]
resume_from_hibernation() {
        /sbin/cryptsetup open /dev/sda3 cryptswap --allow-discards || rescue_shell
        echo "Resuming previous Session."
        echo /dev/dm-0 > /sys/power/resume
}

# temporarily mount proc and sys
mount -t proc none /proc
mount -t sysfs none /sys

# start for real here
KERNELCMDLINE="`cat /proc/cmdline`"

for i in ${KERNELCMDLINE}; do
        case ${i} in
                resume)
                        resume_from_hibernation
                        ;;
                *)
                        ;;
        esac
done
[...]


Die initramfs-list kann gerne mit dem gefüllt werden was man gerne so drin hat aber beachtet bitte dass die benötigten Libs alle vorhanden sind. dazu verwendete ich den kurzen Befehl:
Code:
for i in /bin/busybox /sbin/cryptsetup /sbin/lvm; do ldd ${i}; done | cut -d' ' -f1 | uniq


Das legte für mich den Schluss nahe dass ich folgende initramfs-list benötige (ich gehe hier von einem statischen dev-system aus. und brauche daher kein udev, mdev oder ähnliches. muss mich dafür um die nötigen nodes selbst kümmern)
Code:
#/usr/src/initramfs/initramfs-list
# directory structure
dir /bin        755 0 0
dir /usr        755 0 0
dir /bin        755 0 0
dir /sys        755 0 0
dir /var        755 0 0
dir /lib64      755 0 0
dir /proc       755 0 0
dir /mnt        755 0 0
dir /mnt/root   755 0 0
dir /etc        755 0 0
dir /root       755 0 0
dir /dev        755 0 0
dir /dev/mapper 755 0 0
slink /sbin     /bin    755 0 0
slink /lib      /lib64  755 0 0
slink /usr/lib  /lib64  755 0 0
slink /usr/lib64 /lib64 755 0 0

# we have a static /dev so we need all dev entries too
# e.g. /dev/console below
nod /dev/console        0600 0 0 c 5 1
nod /dev/null           0666 0 0 c 1 5
nod /dev/random         0666 0 0 c 1 8
nod /dev/urandom        0666 0 0 c 1 9

# dev/sda and partitions
nod /dev/sda            0660 0 0 b 8 0
nod /dev/sda1           0660 0 0 b 8 1
nod /dev/sda2           0660 0 0 b 8 2
nod /dev/sda3           0660 0 0 b 8 3
nod /dev/sda4           0660 0 0 b 8 4

# dev/sdb
nod /dev/sdb            0660 0 0 b 8 16
nod /dev/sdb1           0660 0 0 b 8 17

# dev/sdc
nod /dev/sdc            0660 0 0 b 8 32
nod /dev/sdc1           0660 0 0 b 8 33

# all the device-mapper nodes I need
nod /dev/dm-0           0660 0 0 b 253 0
nod /dev/dm-1           0660 0 0 b 253 1
nod /dev/dm-2           0660 0 0 b 253 2
nod /dev/dm-3           0660 0 0 b 253 3
nod /dev/dm-4           0660 0 0 b 253 4
nod /dev/dm-5           0660 0 0 b 253 5
nod /dev/dm-6           0660 0 0 b 253 6
nod /dev/dm-7           0660 0 0 b 253 7

slink /dev/stderr       /proc/self/fd/2 777 0 0
slink /dev/stdin        /proc/self/fd/0 777 0 0
slink /dev/stdout       /proc/self/fd/1 777 0 0

# busybox
file /bin/busybox       /bin/busybox    755 0 0

# for lvm on crypt
file /bin/cryptsetup    /sbin/cryptsetup 755 0 0
file /bin/lvm           /sbin/lvm       755 0 0

# libraries required

file    /lib64/ld-linux-x86-64.so.2     /lib64/ld-linux-x86-64.so.2     755 0 0
file    /lib64/libargon2.so.1           /usr/lib64/libargon2.so.1       755 0 0
file    /lib64/libblkid.so.1            /lib64/libblkid.so.1            755 0 0
file    /lib64/libcom_err.so.2          /lib64/libcom_err.so.2          755 0 0
file    /lib64/libcrypto.so.1.0.0       /usr/lib64/libcrypto.so.1.0.0   755 0 0
file    /lib64/libcryptsetup.so.12      /usr/lib64/libcryptsetup.so.12  755 0 0
file    /lib64/libc.so.6                /lib64/libc.so.6                755 0 0
file    /lib64/libdevmapper-event.so.1.02       /lib64/libdevmapper-event.so.1.02       755 0 0
file    /lib64/libdevmapper.so.1.02     /lib64/libdevmapper.so.1.02     755 0 0
file    /lib64/libdl.so.2               /lib64/libdl.so.2               755 0 0
file    /lib64/libe2p.so.2              /lib64/libe2p.so.2              755 0 0
file    /lib64/libext2fs.so.2           /lib64/libext2fs.so.2           755 0 0
file    /lib64/libjson-c.so.4           /usr/lib64/libjson-c.so.4       755 0 0
file    /lib64/libmount.so.1            /lib64/libmount.so.1            755 0 0
file    /lib64/libm.so.6                /lib64/libm.so.6                755 0 0
file    /lib64/libncurses.so.6          /lib64/libncurses.so.6          755 0 0
file    /lib64/libpopt.so.0             /usr/lib64/libpopt.so.0         755 0 0
file    /lib64/libpthread.so.0          /lib64/libpthread.so.0          755 0 0
file    /lib64/libreadline.so.7         /lib64/libreadline.so.7         755 0 0
file    /lib64/librt.so.1               /lib64/librt.so.1               755 0 0
file    /lib64/libudev.so.1             /lib64/libudev.so.1             755 0 0
file    /lib64/libuuid.so.1             /lib64/libuuid.so.1             755 0 0
file    /lib64/libz.so.1                /lib64/libz.so.1                755 0 0

file    /bin/fsck              /sbin/fsck                      755 0 0
file    /bin/fsck.ext4         /sbin/fsck.ext4                 755 0 0

# our init script
file    /init                   /usr/src/initramfs/init               755 0 0


generiert wird die initramfs dann mit deem einfachen Befehl:
Code:
./gen_init_cpio initramfs-list > /boot/initramfs


(FYI: Meine tools sind alle nicht static compiled. Also hier, gibts durchaus Raum für Verbesserungen um die extra-libs loszubekommen.)


Gut! schön! nun haben wir i.d.T alles vorhanden um manuell zu stoppen und zu starten. Ich wollte aber das grub automatisch auf einen Eintrag mit resume springt.

diesen ganzen grub-mkconfig rubbish hab ich nie ganz verstanden. Daher hab ich die grub.cfg schon immer händisch geschrieben und nutze auch hier 2 fast identische Einträge und das Tool grub-save-default.

Code:
#/etc/grub/grub.conf
set timeout="3"

load_env

set default="${saved_entry}"

function savedefault {
        set saved_entry="0"
        save_env saved_entry
}

menuentry 'Gentoo Linux' --class gnu-linux --id Gentoo-Linux {
        set root='(hd0,gpt2)'
        savedefault
        linux /vmlinuz root=/dev/system/root CONSOLE=tty1 init=/init
        initrd /initramfs
}

menuentry 'Gentoo Linux Resume from Suspend to Disk' --class gnu-linux --id Gentoo-Linux-resume {
        set root='(hd0,gpt2)'
        savedefault
        linux /vmlinuz root=/dev/system/root CONSOLE=tty1 init=/init resume
        initrd /initramfs
}


und dem elogind habe ich als hook folgendes Script mitgegeben:

Code:
#/lib64/elogind/system-sleep/01grub
#! /bin/bash
case $1/$2 in
  pre/hibernate)
    grub-set-default 1
    sync
    umount /boot/efi /boot
    ;;
  post/hibernate)
    mount /boot
    mount /boot/efi
    grub-set-default 0
    ;;
esac


(nicht vergessen dass das skript exec sein muss chmod +x /lib64/elogind/system-sleep/01grub)

Das waren meine 2 ct. ich habe zu dem ganzen nicht wirklich Quellen, aber 2 möchte ich nennen die mir persönlich bei der Sache halfen:


PS: Ergänzungen, Verbesserungen und Shitstorm in die Kommentare, die Freude darüber variiert.

PPS: Sorry für die krude Schreibweise... ich weiß nicht wirklich wie man sinnvoll eine Dokumentation schreibt und schrieb einfach wie ich dachte. Verbesserungen sind willkommen.

Edith: 15.12.22
pm-utils ist alt und keiner will das mehr, daher eine Änderung um stattdessen elogind zu unterstützen.
_________________
mfg
Steel
___________________

Heim-PC: AMD Ryzen 5950X, 64GB RAM, GTX 1080
Laptop: Intel Core i5-4300U, 16GB RAM, Intel Graphic
Arbeit-PC: Intel i5-1145G7, 16GB RAM, Intel Iris Xe Graphic (leider WSL2)
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Deutsche Dokumentation All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum