HowTo: Backup von Android Handy auf eigene Server

In meinen Bestrebungen alles auf eigenen Servern zu haben, habe ich nun auch das Backup meines Nexus 5 Smartphones erfolgreich dorthin ausgelagert. Dafuer habe ich auf dem Smartphone die folgenden drei Dinge gemacht:

  1. Rooten des Smartphones. Ich verweise an dieser Stelle einfach auf die Auto-Root Geschichten von chainfire. Die sind einfach und funktionieren. Man sollte ruhig die paar Euros in die Vollversion von SuperSU investieren, damit man die Rootrechte auch nach einem OTA Update behaelt.
  2. Titanium Backup gekauft und installiert. Ich habe einfach die Standard Zeitplaene uebernommen.
  3. FolderSync gekauft und installiert.

Anschliessend habe ich in FolderSync einen neuen SFTP-Account hinzugefuegt. Dabei habe ich Server-Adresse und Port sowie Benutzernamen und Passwort entsprechend eingegeben. Danach habe ich ein neues Ordnerpaar hinzugefuegt. Dafuer habe ich als Account den SFTP-Account ausgewaehlt und als lokalen Ordner /storage/sdcard0/TitaniumBackup. Die Synchronisations-Art ist „Zu Remote-Ordner“, und es ist eine taegliche, planmaessige Synchronisation.

Der SFTP-Account hat auf Serverseite als Shell /usr/lib/sftp-server und ist Mitglied der Gruppe sftp-allow:

chsh -s /usr/lib/sftp-server androidbackup
addgroup sftp-allow
adduser androidbackup sftp-allow

Die Gruppe sftp-allow ist in der /etc/ssh/sshd_config unter AllowGroups aufgefuehrt:

AllowGroups ssh-allow sftp-allow

Fuer Mitglieder der Gruppe sftp-allow ist in der /etc/ssh/sshd_config weiter folgendes konfiguriert:

Subsystem sftp internal-sftp
Match group sftp-allow
  ChrootDirectory /home/%u
  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp
  PasswordAuthentication yes

Auf dem Server habe ich noch das unten stehende Skript laufen, dass alte Backups loescht. Dieses habe ich bewusst so gewaehlt, so habe ich auf dem Smartphone immer das letzte komplette Backup, und auf dem Server kann ich aber den kompletten letzten Monat aufbewahren. Das Skript sieht wie folgt aus:

  • /etc/cron.daily/cleanupOldAndroidBackups
#!/bin/bash
 
KEEP_DAYS=30
BACKUPDIR=/home/android/Backups/
 
if [ "$(find ${BACKUPDIR} -type f -mtime +${KEEP_DAYS})" != "" ]; then
        echo "Cleaning up the following Android Backup files:"
        find ${BACKUPDIR} -type f -mtime +${KEEP_DAYS}
fi
 
find ${BACKUPDIR} -type f -mtime +${KEEP_DAYS} -delete

Das ganze hat seinen ersten Praxistest vor ein paar Tagen auch bestanden als ich ausversehen mein Smartphone zurueckgesetzt habe. Ich habe dann Foldersync und Titanium Backup installiert, Synchronisations-Art in Foldersync andersherum eingerichtet (Zu lokalem Ordner) und mit Titanium Backup alles wieder eingespielt. Hat zu meinem eigenen Erstaunen funktioniert!

HowTo: Backup von LUKS Headerdaten erzeugen / zurueckspielen

Heute morgen kam ich zur Arbeit und mein Rechner wollte das Passwort zum entschluesseln der mit LUKS verschluesselten Festplatten nicht mehr annehmen. Nach einer Stunde probieren aller erdenklichen Moeglichkeiten habe ich mich dann dazu entschieden den PC komplett neu aufzusetzen. Zum Glueck ist nur sehr wenig verloren.

Warum ich in der letzten Woche jeden Morgen das Passwort eingeben konnte und es heute morgen nicht mehr ging ist ein Raetsel. Vielleicht haette mir ein Backup der LUKS Headerdaten geholfen. Ich hatte aber keines, bis gerade eben.

Erzeugen:

cryptsetup luksHeaderBackup /dev/disk/by-uuid/XXXX --header-backup-file /tmp/backupname.luksheader

Wieder einspielen:

cryptsetup luksHeaderRestore /dev/disk/by-uuid/XXXX --header-backup-file /tmp/backupname.luksheader

Mehr Sicherheit fuer die eigenen Daten – verschluesseltes Backup

Dieses ist der siebte Teil einer Serie von Blogeintraegen, die sich als Reaktion auf die NSA Affaere um den Kontext Sicherheit fuer die eigenen Daten und Verschluesselung drehen.

Links zu den ersten sechs Artikeln befinden sich am Ende des Blogposts. Dieser siebte Teil behandelt das Thema Backup und zeigt eine Moeglichkeit wie man selbiges einfach konfiguriert und verschluesselt auf einem externen Speicher ablegen kann.

Natuerlich moechte ich von meinem Server ein Backup machen. Es waere aber dumm, wenn ich alle meine Daten die ich dort sammle und verschluesselt dorthin transportiere, anschliessend unverschluesselt auf einen Speicherplatz lege, den ich nicht selber ueberwache.
Bei mir ist es nun so, dass mir der Hostinganbieter (Hetzner) 100GB kostenlosen FTP Speicherplatz fuer Backups anbietet. Wenn ich den nutzen moechte muss ich also das Backup verschluesseln. Viele Jahre habe ich mit Backup Manager dort ein unverschluesseltes Backup abgelegt und war damit immer zufrieden. Das Projekt scheint inzwischen eingeschlafen zu sein, und durch meinen Arbeitskollegen bin ich auf duply hingewiesen worden. Ich moechte an dieser Stelle das Setup vorstellen, mit dem ich Full und Incremental Backups mit duply erzeuge und GPG verschluesselt auf dem Hetzner FTP Speicher ablege.

duply installieren

duply kann aus den Standardrepositories installiert werden:

aptitude install duply

Damit die Konfigurationsdateien unter /etc/duply/ und nicht unter ~/.duply/ liegen muss das Verzeichnis unter /etc angelegt werden:

mkdir /etc/duply

Als naechster Schritt wird ein neues Profil erzeugt. Ich habe dafuer den Hostname genommen:

duply create HOSTNAME

Die Konfigurationsdatei des Profils befindet sich nun unter /etc/duply/HOSTNAME/conf

GPG Key generieren und duply konfigurieren

Nun wird fuer die Verschluesselung des Backups ein GPG Key benoetigt. Mit dem folgenden Befehl wird ein neuer Key erzeugt. Ich habe alle voreingestellten Werte beibehalten:

gpg --gen-key

Wenn der Vorgang abgeschlossen ist wird etwas gesagt nach dem Motto: „Schluessel ABC123D4 ist als uneingeschraenkt vertrauenswuerdig gekennzeichnet“. Die Schluessel ID in diesem Fall merken und zusammen mit dem vergebenen Passwort in die /etc/duply/HOSTNAME/conf eintragen:

GPG_KEY='ABC123D4'
GPG_PW='B1-r6UF9s:Mb<%'

Der naechste wichtige Schritt ist in der Konfigurationsdatei anzugeben wo das Backup gespeichert werden soll. Dafuer gibt man – in diesem Fall den Hetzner FTP – wie folgt ein:

TARGET='ftp://u12345:abc123def456ghj7@u12345.your-backup.de/backup_HOSTNAME'

Ich habe bewusst einen Unterordner backup_HOSTNAME angegeben, damit ich auf den gleichen Speicher mehrere Hosts sichern kann und dabei nicht durcheinander gerate. Weiter habe ich die folgenden Optionen gesetzt, die ich hier inklusive Kommentare aus der Konfigurationsdatei aufliste::

# base directory to backup
SOURCE='/'
 
# Time frame for old backups to keep, Used for the "purge" command.  
# see duplicity man page, chapter TIME_FORMATS)
# defaults to 1M, if not set
MAX_AGE=3M
 
# Number of full backups to keep. Used for the "purge-full" command. 
# See duplicity man page, action "remove-all-but-n-full".
# defaults to 1, if not set 
MAX_FULL_BACKUPS=2
 
# verbosity of output (error 0, warning 1-2, notice 3-4, info 5-8, debug 9)
# default is 4, if not set
VERBOSITY=5
 
# activates duplicity --full-if-older-than option (since duplicity v0.4.4.RC3) 
# forces a full backup if last full backup reaches a specified age, for the 
# format of MAX_FULLBKP_AGE see duplicity man page, chapter TIME_FORMATS
# Uncomment the following two lines to enable this setting.
MAX_FULLBKP_AGE=1M
DUPL_PARAMS="$DUPL_PARAMS --full-if-older-than $MAX_FULLBKP_AGE "
 
# sets duplicity --volsize option (available since v0.4.3.RC7)
# set the size of backup chunks to VOLSIZE MB instead of the default 25MB.
# VOLSIZE must be number of MB's to set the volume size to.
# Uncomment the following two lines to enable this setting. 
VOLSIZE=256
DUPL_PARAMS="$DUPL_PARAMS --volsize $VOLSIZE "

Damit aber nicht das gesamte System gesichert wird wie oben unter SOURCE=’/‘ definiert, muss eine exclude Datei definiert werden. Diese liegt neben der conf Datei und sieht bei mir wie folgt aus:

/bin
/cdrom
/lib
/lib64
/media
/selinux
/sys
/usr
/boot
/dev
/lib32
/lost+found
/mnt
/sbin
/tmp
/var/archives
/var/cache
/proc

Damit habe ich alles fuer mich wichtige wie /etc, /home oder auch /var/www gesichert.

MySQL Dump vor Backup erstellen

duply bietet weiter die Moeglichkeit vor und nach dem Backup Kommandos auszufuehren. Dafuer muss neben der conf Datei eine oder auch die beiden Dateien pre und/oder post liegen. Dies sind Skripte die ausgefuehrt werden, es ist wichtig dass sie das auch sind (chmod ug+x pre). Ich erzeuge vor dem Backup damit einen Dump der Datenbanken auf dem Server. Das Skript sieht wie folgt aus:

#!/bin/bash
 
## create backup directory if not exist
if [ ! -d "/opt/backup" ]; then mkdir /opt/backup; fi
 
## delete old backup files older than 1 month
find /opt/backup -name "*.gz" -type f -mtime +31 -delete
 
## create dump of all databases
mysqldump --opt --routines --add-drop-database --default-character-set=utf8 --create-options --events --all-databases | gzip > /opt/backup/$(date -I)-all-databases.sql.gz

Das MySQL Zugangspasswort habe ich in der /root/.my.cnf abgespeichert:

[client]
password=B1-r6UF9s:Mb<%

Es befinden sich nun die folgenden drei Dateien unter /etc/duply/HOSTNAME/:

host:/etc/duply/HOSTNAME# ll
insgesamt 16
-rw------- 1 root root 4633  1. Sep 17:20 conf
-rw-r--r-- 1 root root  168  7. Aug 21:26 exclude
-rwxr-x--- 1 root root  415  1. Sep 17:30 pre
host:/etc/duply/HOSTNAME#

cron Eintrag anlegen

Damit jede Nacht das Backup ausgefuehrt und gegebenfalls alte Backupsets geloescht werden, habe ich die Datei /etc/cron.daily/duply_HOSTNAME erstellt:

#
# nightly duply backup of profile "HOSTNAME"
#

5 4 * * * root /usr/bin/duply HOSTNAME backup_verify_purge --force

weitere duply Befehle

Die folenden Befehle finde ich wichtig:

  • Status des Backups:
    duply HOSTNAME status
  • Datei aus dem Backup wiederherstellen:
    duply HOSTNAME fetch /path/to/my/file /tmp/restore
  • Datei von vor einer Woche aus dem Backup wiederherstellen:
    duply HOSTNAME fetch /path/to/my/file /tmp/restore 7D
  • Alle Dateien im Backup auflisten von vor zwei Wochen die passwd enthalten:
    duply HOSTNAME list 2W | grep passwd

Monitoring mit Nagios

Wenn man nun ueber eine Nagios Installation verfuegt, moechte ich an dieser Stelle noch auf zwei Checks hinweisen. Der erste ist check_duply um zu pruefen, ob das Backup auch wie gewuenscht durchgelaufen ist. Bei einer Pruefung ueber NRPE kann der Eintrag wie folgt aussehen:

command[check_backup]=sudo /usr/lib/nagios/plugins/check_duply -P HOSTNAME -w 36 -W 32 -c 48 -C 36

Die Parameter bedeuten:

  -w WARNINC   Number of hours allowed for incremental backup warning level
  -W WARNFULL  Number of days allowed for full backup warning level
  -c CRITINC   Number of hours allowed for incremental backup critical level
  -C CRITFULL  Number of days allowed for full backup critical level
  -P PROFILE   duply profile name

Der zweite Check ist check_ftpspace um zu ueberwachen, dass der FTP Speicher nicht volllaeuft. Wenn der Check ebenfalls ueber NRPE ausgefuehrt wird ist das hier ein beispielhafter Eintrag:

command[check_backupspace]=/usr/lib/nagios/plugins/check_ftpspace ftp://u12345.your-backup.de u12345 abc123def456ghj7 7000 15000 100000

Die Reihenfolge der Parameter setzt sich wie folgt zusammen:

HOSTNAME USER PASS WARN CRIT TOTAL

wobei die Werte fuer WARN CRIT und TOTAL jeweils MB sind.

Am Ende sei noch darauf hingewiesen, dass ich mir das nicht alles selber aus den Fingern gesaugt habe, sondern mich bei den folgenden Quellen bedient habe:

Vorherige Blogposts:

  • Der erste Teil war fuer mich das Aufraeumen, einen Ueberblick zu bekommen sowie Strukturen zu schaffen, auf denen ich aufbauen kann.
  • Der zweite Teil bestand darin einen Ort zu schaffen, in dem ich Keys und Passwoerter sicher aufbewahren und gleichzeitig alles in ein vernuenftiges Backup schieben kann.
  • Der dritte Teil bezog sich auf das erzeugen von Zertifikaten und Einrichten von verschluesselten Verbindungen zu Apache vHosts.
  • Der vierte Teil drehte sich um das Thema Komfort im Webbrowser und verwies in dem Kontext auf einen Artikel zum selbst gehosteten Firefox Sync Server.
  • Im fuenften Teil habe ich etwas zu meinen Ueberlegungen zu sicheren Zugangsdaten und Passwoertern geschrieben.
  • Im sechsten Teil dreht es sich darum, wie man sich auf seinen Servern mit SSH aber ohne Passwort sicher authentifizieren kann.