Luks Linux-Backup
Backup auf Basis von btrfs
Cryptocontainer + Snapshots als incrementelle Backups
[wpfilebase tag=file id=1 /]
Ich beschränke mich hier auf die Installation unter Debian/Ubuntu. Bei anderen Distributionen ist der entsprechende Paketmanager zu verwenden. Vorraussetzung:
apt-get install btrfs-tools cryptsetup hashalot uuidgen
( Beachtet, dass der Pfad zum btrfs binary in Ubuntu 14.04 /sbin/btrfs und 16.04 /bin/btrfs unterschiedlich ist. Bitte dann im Script anpassen. )
Deises Script ist nun modifiziert, so dass es den Pfad zu Binary automatisch setzt.
## SETTING LOCATION OF BTRFS if [ -x /sbin/btrfs ]; then ## UBUNTU 14.04 BTRFS="/sbin/btrfs" else ## UBUNTU 16.04 BTRFS="/bin/btrfs" fi
NEU PLATTE ANSCHLIESSEN
dmesg |tail -10 [ 5262.314455] usb-storage 4-1.2:1.0: USB Mass Storage device detected [ 5262.314773] scsi host7: usb-storage 4-1.2:1.0 [ 5263.314261] scsi 7:0:0:0: Direct-Access SAMSUNG HM100JC YN10 PQ: 0 ANSI: 0 CCS [ 5263.315046] sd 7:0:0:0: Attached scsi generic sg2 type 0 [ 5263.315591] sd 7:0:0:0: [sdb] 195371568 512-byte logical blocks: (100 GB/93.1 GiB) [ 5263.316206] sd 7:0:0:0: [sdb] Write Protect is off [ 5263.316213] sd 7:0:0:0: [sdb] Mode Sense: 00 14 00 00 [ 5263.316917] sd 7:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA [ 5263.412267] sdb: sdb1 [ 5263.415103] sd 7:0:0:0: [sdb] Attached SCSI disk
man kann nur erkenn dass eine neue Platte (sdb) mit einer Partition im System vorhanden ist. Ein Backup sollte gut gesichert werden und vor unbefugten Zugriff abgeschottet sein. Hierfür bieten sich Boarmittel wie cryptsetup an, welches eingangs installiert wurde. Um nun einen Cryptocontainer zu erzeugen, muss die Platte (sdb), respektive die Partition 1 (sdb1) mit cryptsetup (luks) formatiert werden.
## MIT ZUFALLSZAHLEN FÜLLEN (DAUER EXTREM LANGE) dd if=/dev/urandom bs=2M of=/dev/sdb1 ## MIT NULLEN FÜLLEN (DAUER NICHT SEHR LANGE, REDUZIERT DIE SICHERHEIT) ## dd if=/dev/Zero bs=2M of=/dev/sdb1
cryptsetup luksFormat /dev/sdb1
WARNING! ======== Hiermit überschreiben Sie Daten auf /dev/sdb1 unwiderruflich. Are you sure? (Type uppercase yes): YES Passsatz eingeben: Verify passphrase:
Nun wird ein Passwort angegeben dass man sich tunlichst merken sollte. Es stellt das Masterpasswort des Containers dar. Allerdings man auch Keys wieder entfernen. ( man cryptsetup )
Es muss nun ein Verzeichnis namens /opt/key/ erzeugt werden. Wir möchten ja beim Backup nicht immer ein Passwort angeben, schon gar nicht wenn es automatisch über cron gestartet wir. Ergo benötigt man einen Keyfile und der wandert nach /opt/keys/luks.key
/opt/keys/luks.key
PASSKEY ERZEUGEN
mkdir -p /opt/key uuidgen > /opt/key/luks.key
Der Key wird nun dem Container zugewiesen
cryptsetup luksAddKey /dev/sdb1 /opt/key/luks.key Geben Sie irgendeinen Passsatz ein:
Der hier geforderte Passatz ist das initial gesetzte Masterpasswort
DAS LAUFWERK ENTSCHLÜSSELN UND EINEM DEVICE ZUWEISEN
cryptsetup luksOpen /dev/sdb1 unlock Geben Sie den Passsatz für /dev/sdb ein:
Und wieder das Masterpasswort eingeben
Das erzeugte Device heisst nun
/dev/mapper/unlock
ll /dev/mapper/unlock lrwxrwxrwx 1 root root 7 Feb 2 11:48 /dev/mapper/unlock -> ../dm-0
ERZEUGNEN DES btrfs FILESYSTEM
mkfs.btrfs /dev/mapper/unlock WARNING! - Btrfs v3.12 IS EXPERIMENTAL WARNING! - see http://btrfs.wiki.kernel.org before using Turning ON incompat feature 'extref': increased hardlink limit per file to 65536 fs created label (null) on /dev/mapper/unlock nodesize 16384 leafsize 16384 sectorsize 4096 size 15.14GiB Btrfs v3.12
Mit der Erstellung des Cryptocontainers und des Filesystems wurden IDs zur Identifikation der Volumes gesetzt.
AUSLESEN DER ID
blkid | egrep -i "btrfs|unlock|luks" /dev/mapper/unlock: UUID="8450fc0a-b368-4754-8631-2e8916e219f6" UUID_SUB="491bd681-7f9a-47b4-a99c-f4b1135686a2" TYPE="btrfs" /dev/sdb: UUID="c6e1c3ba-e454-4e8e-9bd5-4d8797bded68" TYPE="crypto_LUKS"
Das erstellen des Containers ist abgeschlossen.
Anpassung der Config innerhalb der Backuprutine
CONTAINER UNMOUNTEN
umount /dev/mapper/unlock cryptsetup luksClose /dev/mapper/unlock
ERSTELLEN DES SCRIPTVERZEICHNIS
mkdir -p /opt/local/backup
ENTPACKEN DES TARBALLS backup.tar.bz2
cd /Dein/Download/Verzeichnis/ tar xvfj backup.tar.bz2 cd local/backup ll ## OUTPUT insgesamt 36 drwxr-xr-x 6 backup backup 4096 Jan 31 19:11 ./ drwxr-xr-x 5 root root 4096 Jan 27 11:06 ../ -rwxr--r-- 1 backup backup 5481 Jan 31 19:11 backup.sh* drwxr-xr-x 2 backup backup 4096 Jan 13 15:34 bin/ drwxr-xr-x 2 backup backup 4096 Jan 31 19:19 config/ drwxr-xr-x 2 backup backup 4096 Jan 13 16:03 include/ drwxr-xr-x 2 backup backup 4096 Jan 6 2014 ssh-keys/ -rwxr--r-- 1 backup backup 3319 Jan 26 22:21 unlock.sh*
ERZEUGEN DES BACKUPKEY
Das ist nötig, da das Backup nicht als clientbackup konzipiert wurde sondern als serverseitiges.
Es steht dem Nutzer also frei es auch als Serverseitiges backup (zentral) für mehrere Maschinen zu verwenden.
ssh-key OHNE PASSWORT ERZEUGEN
ssh-keygen -f ssh-keys/backup_rsa Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in ssh-keys/backup_rsa. Your public key has been saved in ssh-keys/backup_rsa.pub. The key fingerprint is: 62:50:fa:00:5a:42:cd:3a:55:79:77:d7:d3:cc:f2:fd root@bb8 The key's randomart image is: +--[ RSA 2048]----+ |o.= ..o .o.| | + = + . . . ..o+| |. o + . . . . oo| +-----------------+
PUBLICKKEY FÜR ROOT BEREITSTELLEN
cat ssh-keys/backup_rsa.pub >> /root/.ssh/authorized_keys
ANPASSEN DER BACKUPCONFIG
<strong>cd config</strong> ll insgesamt 16 drwxr-xr-x 2 backup backup 4096 Jan 31 19:19 ./ drwxr-xr-x 6 backup backup 4096 Feb 2 12:15 ../ -rw-r----- 1 backup backup 645 Jan 27 11:05 backup.conf -rw-r--r-- 1 backup backup 196 Jan 31 19:19 hosts.cfg -rw-r----- 1 backup backup 645 Jan 27 11:05 unlock.conf
hosts.cfg EDITIEREN
################################## ## 4LORDS BACKUP PARAMETER ################################## root;bb8;4lords.intra;22;/etc /home /data /var /usr /lib* /boot /dev /root /sbin /opt/local/backup ## JEDE WEITERE ZEILE IST EIN NEUER ZU SICHERNDER HOST ## ## bb8 = Hostname der zu backupenden Box ## 4lords.intra = Die Domäne in der sich bb8 befindet ## 22 = der ssh-port ## /etc /home ... = die zu sichernden Verzeichnisse ( WICHTIG :: durch Leerzeichen trennen!!! )
unlock.conf EDITIEREN
#!/bin/bash UNLOCKED_MOUNTPOINT="/opt/local/usb" # the mountpoint the file ist temporarely mounted in BACKUP_DEVICE_BY_UUID="c6e1c3ba-e454-4e8e-9bd5-4d8797bded68" # ENCRYPTED DEVICE KEY_FILE="/opt/key/luks.key" # the name of your passwordfile (should later stored on an usb-stick) FILESYSTEM="auto" # the filesystem which is created in imagefile # +---------------------------- DO NOT EDIT BELOW ----------------------------------+ # ## ALARM LENGTH="2000" HIGH="13" ## DEFAULT BACKUP DECLARATIONS FILESYSTEM="auto" UNLOCKED_DEVICE="/dev/mapper/${SOURCE_DEVICE_BY_UUID}"
backup.conf EDITIEREN
KEEP_BACKUPS="30"
Die blkid c6e1c3ba-e454-4e8e-9bd5-4d8797bded68 haben wir oben bereits durch ausführen des Befehls blkid gefunden. Sie muss in SOURCE_DEVICE_BY_UUID gesetzt werden.
Inhalt des entpacketen Tarballs vollständig nach /opt/local/backup kopieren
rsync -av /Dein/Download/verzeichnis/backup /opt/local/
Abschliesend soll evtl. das Backup manuell über einen Desktostarter gestartet werden. Hierfür ist ein Eintrag in /etc/sudoers notwendig
DeinUserName = jener, mit dem Du auf dem Host arbeitest
/etc/sudoers EDITIEREN
## DIESE ZEILE HINZUFÜGEN DeinUserName ALL = NOPASSWD: /opt/local/backup/*
Für Deinen Windowmanager einen Desktopstarter erzeugen und den Befehl
sudo /opt/local/backup/backup.sh --umount
hinterlegen
Sobald die Backupplatte am Notebook hängt, kann nun durch Klick auf den Starter das Backup beginnen. Das Backup erstell für jeden Tag an dem es ausgeführt wird ein Backup mit folgender Struktur:
ll /opt/local/usb
insgesamt 20 drwxr-xr-x 1 root root 40 Jan 27 10:20 ./ drwxr-x---+ 3 root root 4096 Feb 2 12:43 ../ drwxr-xr-x 1 root root 6 Jan 27 10:12 4lords.intra/ drwxr-xr-x 1 root root 8 Jan 31 19:20 snapshot/
ll 4lords.intra/bb8/
insgesamt 0 drwxr-xr-x 1 root root 86 Jan 31 19:18 ./ drwxr-xr-x 1 root root 6 Jan 27 10:12 ../ drwxr-xr-x 1 root root 364 Jan 26 22:10 boot/ drwxr-xr-x 1 root root 6 Jan 26 21:49 data/ drwxr-xr-x 1 root root 2312 Jan 31 19:18 dev/ drwxr-xr-x 1 root root 4636 Jan 31 19:18 etc/ drwxr-xr-x 1 root root 6 Jan 26 19:56 home/ drwxr-xr-x 1 root root 954 Jan 26 21:46 lib/ drwxr-xr-x 1 root root 40 Nov 28 15:22 lib64/ drwxr-xr-x 1 root root 10 Jan 31 19:18 opt/ drwx------ 1 root root 234 Jan 31 19:19 root/ drwxr-xr-x 1 root root 5294 Jan 26 22:10 sbin/ drwxr-xr-x 1 root root 70 Nov 28 15:19 usr/ drwxr-xr-x 1 root root 90 Nov 28 15:57 var/
ll snapshot/
insgesamt 64 drwxr-xr-x 1 root root 8 Jan 31 19:20 ./ drwxr-xr-x 1 root root 40 Jan 27 10:20 ../ .... drwxr-xr-x 1 root root 40 Jan 27 10:20 2016-01-31_15-12 drwxr-xr-x 1 root root 40 Jan 27 10:20 2016-02-01_15-45 drwxr-xr-x 1 root root 40 Jan 27 10:20 2016-02-02_15-24
ll snapshot/2016-02-01_15-45/4lords.intra/bb8/insgesamt 0
drwxr-xr-x 1 root root 86 Jan 31 19:18 ./ drwxr-xr-x 1 root root 6 Jan 27 10:12 ../ drwxr-xr-x 1 root root 364 Jan 26 22:10 boot/ drwxr-xr-x 1 root root 6 Jan 26 21:49 data/ drwxr-xr-x 1 root root 2312 Jan 31 19:18 dev/ drwxr-xr-x 1 root root 4636 Jan 31 19:18 etc/ drwxr-xr-x 1 root root 6 Jan 26 19:56 home/ drwxr-xr-x 1 root root 954 Jan 26 21:46 lib/ drwxr-xr-x 1 root root 40 Nov 28 15:22 lib64/ drwxr-xr-x 1 root root 10 Jan 31 19:18 opt/ drwx------ 1 root root 234 Jan 31 19:19 root/ drwxr-xr-x 1 root root 5294 Jan 26 22:10 sbin/ drwxr-xr-x 1 root root 70 Nov 28 15:19 usr/ drwxr-xr-x 1 root root 90 Nov 28 15:57 var/
Die Snapshots belegen nur die Differenz zumdavor erstellenBackup. Sind aber ansonsten vollständige Backups. Man kann aus diesen den vollständigen Stand des Tages z.B. 2016-02-01_15-45 zurückspielen.
Have Fun :o)
USAGE
./backup --help USAGE: /opt/local/backup/backup.sh /opt/local/backup/backup.sh --umount --dedupe
Author: Matthias Schweizer
Der Autor übernimmt keinerlei Gewähr für die Aktualität, Richtigkeit und Vollständigkeit der bereitgestellten Informationen auf unserer Website. Haftungsansprüche gegen den Autor, welche sich auf Schäden materieller oder ideeller Art beziehen, die durch die Nutzung oder Nichtnutzung der dargebotenen Informationen bzw. durch die Nutzung fehlerhafter und unvollständiger Informationen verursacht wurden, sind grundsätzlich ausgeschlossen, sofern seitens des Autors kein nachweislich vorsätzliches oder grob fahrlässiges Verschulden vorliegt. Alle Angebote sind freibleibend und unverbindlich. Der Autor behält es sich ausdrücklich vor, Teile der Seiten oder das gesamte Angebot ohne gesonderte Ankündigung zu verändern, zu ergänzen, zu löschen oder die Veröffentlichung zeitweise oder endgültig einzustellen.