ubuntuusers.de

EVMS-Snapshots mit Verschlüsselung

Archivierte Anleitung

Dieser Artikel wurde archiviert. Das bedeutet, dass er nicht mehr auf Richtigkeit überprüft oder anderweitig gepflegt wird. Der Inhalt wurde für keine aktuell unterstützte Ubuntu-Version getestet. Wenn du Gründe für eine Wiederherstellung siehst, melde dich bitte in der Diskussion zum Artikel. Bis dahin bleibt die Seite für weitere Änderungen gesperrt.

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Achtung!

In Gutsy gibt es einige Probleme mit EVMS

Dies ist eine Ideensammlung, die nicht für Anfänger gedacht ist. In ihr ist dokumentiert, wie es möglich ist, mit Hilfe von EVMS-Snapshots komplette Sicherungen des laufenden Systems anzufertigen, das zudem in allen wesentlichen Teilen verschlüsselt ist.

Überblick:

Der Aufwand für Systembackups ist auf einem Standardsystem höher als nötig: man muss in ein zweites System booten und von dort aus mehr oder weniger langwierig Partitionsimages anfertigen. Das braucht zumindest etwas Zeit. Zeit, die man oft nicht erübrigen will, wenn man gerade interessante, aber systemgefährliche Experimente vorhat.

Das in Ubuntu enthaltene Volume-Management-System EVMS beherrscht eine Schnappschuss-Funktion. Unter Verwendung einer weiteren Partition werden alle Änderungen abgefangen und können bei Bedarf leicht und schnell rückgängig gemacht werden. Die Schnappschuss-Partition kann dabei kleiner sein als das Original.

Das Speichern eines Schnappschusses benötigt nur wenige Sekunden, lediglich fürs vollständige Zurückspielen sind reboots in ein Rettungssystem nötig.

EVMS verwendet den device-mapper des Linux Kernels. Dieser beherrscht auch Verschlüsselung, was aber in EVMS noch nicht integriert ist. Dennoch lassen sich Verschlüsselung und evms kombinieren.

EVMS

Für EVMS werden benötigt:

Ein Kernel mit evms-Unterstützung (alle Ubuntu-Kernel sind geeignet)

EVMS-Software (ist in main): evms, evms-gui (unter X) oder evms-ncurses (Konsole), eventuell evms-cli, womit Scriptsteuerung möglich wird.

Root-Partition auf EVMS

Zur Nutzung der Schnappschuss-Funktion muss die betreffende Partition ein EVMS-Volume sein. Bei der Root-Partition erfordert das einen gewissen Aufwand.

Anlegen eines EVMS-Volumes

Freier Plattenplatz wird im Reiter Disks gelistet. Dort kann nach Rechtsklick auf ein Objekt eine Partition angelegt werden. Unbenutzte Partitionen stehen unter Available Objects. Hier muss nun ein EVMS-Volume erzeugt und passend benannt werden (z.B. "ubuntu-root"). Dieses wird dann unter Volumes angezeigt und kann mit make Filesystem (Kontextmenü) formatiert werden.

Übertragen des Systems auf das EVMS-Volume

Das formatierte EVMS-Volume erscheint in /dev/evms, z.B. als /dev/evms/ubuntu-root. Dieses Volume kann von der Ubuntu Live-CD aus gemountet werden, worauf sich das bestehende System mit cp -a übertragen lässt. Einträge für die Root-Partition in der fstab und /boot/grub/menu.lst anpassen.

initrd: Henne und Ei

Das System könnte nun gestartet werden, wenn der Kernel mit den neuen root=/dev/evms/ubuntu-root schon etwas anfangen könnte. Zur Nutzung der EVMS-Volumes muss aber erst die EVMS-Software gestartet werden, die sich auf ersterem befindet. Klassisches Problem, klassische Lösung: eine initrd. Es gibt fertige evms-initrds hier. Es kann wichtig sein, die zur evms-Engine passende Version zu verwenden. Leider wird bei Ubuntu schon eine initrd für die vielen Kernelmodule verwendet.

Ausweg 1: Die initrds kombinieren. ??

Ausweg 2: einen Kernel bauen, der für die Module keine initrd braucht. Dazu müssen Treiber für Festplatten (z.B. ide-disk), Dateisystem (ext3) und Chipsatz (via82xx) fest eingebaut werden. Ein passender Namenszusatz im Makefile des Kernels ist nützlich:

EXTRAVERSION = -evms

  • Wird auf die evms-initrd nun ein passender Link wie /boot/initrd.img-2.6.10-evms gesetzt, so wird bei der Installation des mit make-kpkg binary gebauten Kernels auch gleich ein passender Eintrag in der /boot/grub/menu.lst erzeugt.

Das System auf dem evms-Volume mit dem neuen Kernel sollte sich jetzt von der Grub-Konsole starten lassen:

root <Partition des evms-Volumes>
kernel /boot/vmlinuz-2.6.10-evms root=/dev/evms/root
initrd /boot/initrd.img-2.6.10-evms
boot 

Sobald das funktioniert, kann in der evmsgui eine weitere Partition für die Schnappschussfunktion vorbereitet werden.

Schnappschuss

Wenn eine leere Partition zur Verfügung steht, kann in evmsgui unter Available Objects ein Feature Objekt daraus erzeugt werden. Für das Snapshot-Feature müssen Name und Originalvolume angegeben werden.

Auf Basis des neuen Feature Objekts kann jetzt ein identisch benanntes EVMS-Volume erzeugt werden, das man dann mounten, fscken, oder mit dd sichern kann. So kann man im Prinzip die dauerhafte Sicherung eines funktionierenden Systems durchführen, während man es bereits zerschießt... Und wenn es einem gelingt, noch während der Sicherung einen Absturz zu provozieren, hat man immer noch den Schnappschuss, den man zurückspielen kann.

Der Schnappschuss lässt sich auf den aktuellen Stand setzen, wenn man im Kontextmenü des entsprechenden Feature Object die Option Reset wählt.

Aus einem Rettungssystem (z.B. Ubuntu-Live, oder ein Minimalsystem ohne X mit der ncurses-Oberfläche zu evms) kann der Schnappschuss mit der Option Roll back zurückgespielt werden. Das Zielvolume darf dabei nicht gemountet sein - deshalb das externe System. Dauert schlimmstenfalls ein paar Minuten...

Dauerhafte Backups

Mit einem Schnappschuss ist auch ein dauerhaftes Backup des laufenden Systems mit dd möglich.

Sicherung:

dd if=/dev/evms/snapshot-ubuntu-root | gzip -c > /mnt/backup/<Dateiname> 

Zurückspielen, aus dem Rettungssystem:

gunzip -c /mnt/backup/<Dateiname> | dd of=/dev/evms/ubuntu-root 

  • (Stimmt der Befehl so? Hab's schon eine Weile nicht mehr gebraucht - aber natürlich irgendwann mal erprobt.)

EVMS und Verschlüsselung

Mit Cryptsetup ist es möglich, Partitionen auf einfache Weise zu verschlüsseln. Dabei wird wie bei evms der device-mapper des Linux-Kernels verwendet. Dennoch kennt evms derzeit keine Verschlüsselung. Die geeignete Vorgehensweise ist daher: Unten steht das evms-Volume, darauf aufbauend kommt dann die Verschlüsselung. Gemountet wird dann das Gerät unter /dev/mapper. Zum Beispiel: /var soll auf dem zu verschlüsselnden Volume /dev/evms/ubuntu-var-encrypted liegen. Dann wird ein entsprechendes Volume wie gehabt angelegt. Danach wird ein passendes Crypto-Device mit

cryptsetup -y create ubuntu-var /dev/evms/ubuntu-var-encrypted 

  • erzeugt. Das Device /dev/mapper/ubuntu-var wird nun formatiert und gemountet. Auch ein Schnappschuss lässt sich so von var machen - aber nur auf verschlüsselter Ebene. Das bedeutet, dass die Sicherung mit dd sehr große Dateien erzeugt - gzip kann mit den verschlüsselten Daten nun mal nicht so viel anfangen. Man könnte aber zur Sicherung ein weiteres Cryptodevice anlegen:

cryptsetup create snapshot-ubuntu-var /dev/evms/snapshot-ubuntu-var 

. Das entschlüsselte Device /dev/mapper/snapshot-var lässt sich nun platzsparend sichern - wobei man natürlich die Sicherungsdatei oder den Sicherungsdatenträger verschlüsseln sollte. Nach dem Rücksetzen des Snapshots muss dieses Cryptodevice neu erzeugt werden.

ein Beispiel

  • / liegt auf einem EVMS-Volume, es existiert ein Snapshot.

  • der swap wird mit einem zufälligen Schlüssel verschlüsselt. Das erfordert Änderungen in /etc/init.d/mountall:

if [ $doswap = yes ]
then
        cryptsetup -c blowfish -s 128 -d /dev/urandom create swap0 /dev/hda5
        mkswap /dev/mapper/swap0
        swapon -a 2> /dev/null
fi

  • /tmp, /home und /var sind mit einem zufällig erzeugten 256-bit aes Schlüssel verschlüsselt. Dieser befindet sich auf einer Diskette, die selbst mit cryptsetup und einem sicheren Passwort verschlüsselt ist. Das /etc/init.d/cryptdisks ist so angepasst, dass vor dem Einrichten der "normalen" Crypto-Devices cryptsetup für /dev/fd0 ausgeführt und die verschlüsselte Diskette gemountet wird; nach der Einrichtung wird die Diskette ungemountet und das Cryptodevice entfernt.

modprobe floppy
        cryptsetup create cryptofloppy /dev/fd0
        mount /dev/mapper/cryptofloppy /mnt/cryptofloppy

  • und

 umount /dev/mapper/cryptofloppy
        cryptsetup remove cryptofloppy

  • Die /etc/crypttab sieht so aus:

# <target device> <source device> <key file> <options>
tmp     /dev/evms/tmp-encrypted         /mnt/cryptofloppy/key
var     /dev/evms/var-encrypted         /mnt/cryptofloppy/key
home    /dev/evms/home-encrypted        /mnt/cryptofloppy/key

In der fstab sieht das dann so aus:

/dev/evms/root       /               ext3    defaults,errors=remount-ro 0 1
/dev/mapper/tmp       /tmp            ext2    defaults        0       2
/dev/mapper/var       /var            ext3    defaults        0       2
/dev/mapper/home        /home           ext3    defaults        0       2
/dev/mapper/swap0       none            swap    sw              0       0

So muss beim Start des Systems nur ein Passwort angegeben werden - das für die Diskette. Mit drei verschlüsselten Partitionen ist das sonst immer etwas umständlich.

Von /var existiert natürlich auch ein Snapshot wie oben angegeben.

Zur Sicherung des Systems müssen / und /var berücksichtigt werden. Manuell ist das alles noch etwas umständlich. Vor Updates führe ich daher ein Script aus, das die Snapshots zurücksetzt und vom derzeitigen Stand eine Sicherung auf DVD-RAM schreibt. Verzeihung - dank des Snapshots während der Updates - DVD-RAM ist derzeit leider Sch...lahm. Das Script sieht etwa so aus (derzeit noch ohne jede Fehlerbehandlung):

#!/bin/bash

DATUM=$(date --iso-8601)

PLATZBEDARF=3575492 #ja, das ist ziemlich willkürlich

echo "mounte Backupdateisystem"
cryptsetup create dvd-ram-encrypted /dev/scd0
mount -t udf -o rw /dev/mapper/dvd-ram-encrypted /mnt/backup
FREIERPLATZ=$(df | grep /mnt/backup | awk '{print $4}')

if [ $FREIERPLATZ -lt $PLATZBEDARF ]; then
        echo "Zu wenig Plattenplatz auf /mnt/backup"
        exit 1
fi

echo "setze Snapshots zurück..."
sync
evms -f reset-root-snapshot.task
sync
evms -f reset-var-snapshot.task

echo "richte Cryptodevice fr den Zugriff auf snapshot-var-encrypted ein"
cryptsetup remove snapshot-var-decrypted    #aufraeumen
cryptsetup remove cryptofloppy
cryptsetup create cryptofloppy /dev/fd0
mount /dev/mapper/cryptofloppy /mnt/cryptofloppy
cryptsetup -d /mnt/cryptofloppy/key create snapshot-var-decrypted /dev/evms/snapshot-var-encrypted
umount /mnt/cryptofloppy
cryptsetup remove cryptofloppy

echo "pruefe Dateisysteme auf den Snapshots"
fsck.ext3 /dev/evms/snapshot-root
fsck.ext3 /dev/mapper/snapshot-var-decrypted

echo "Beginne Kopieren... root-Snapshot"
dd if=/dev/evms/snapshot-root | gzip -c > /mnt/backup/snapshot-root-$DATUM.img.gz
echo "fertig (root-Snapshot)"
echo "Beginne Kopieren... var-Snapshot"
dd if=/dev/mapper/snapshot-var-decrypted | gzip -c > /mnt/backup/snapshot-var-decrypted-$DATUM.img.gz
echo "fertig (var-Snapshot)"

cryptsetup remove snapshot-var-decrypted
umount /mnt/backup
cryptsetup remove dvd-ram-encrypted
echo "Das wars."

Die *.task Dateien sehen etwa so aus:

Task : reset, snapshot-root

Anregungen hierzu bitte an droebbel.


Diese Revision wurde am 22. Juli 2009 11:40 von oliverhorn erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Sicherheit, System