[[Vorlage(Archiviert)]] [[Vorlage(Fortgeschritten)]] {{{#!vorlage Warnung In Gutsy gibt es einige Probleme mit EVMS }}} [[Inhaltsverzeichnis(3)]] 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 [http://sourceforge.net/project/showfiles.php?group_id=25076 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: {{{#!vorlage Befehl root 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: {{{#!vorlage Befehl dd if=/dev/evms/snapshot-ubuntu-root | gzip -c > /mnt/backup/ }}} Zurückspielen, aus dem Rettungssystem: {{{#!vorlage Befehl gunzip -c /mnt/backup/ | 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 {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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: {{{ # 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 [user:droebbel:]. ---- # tag: System, Sicherheit