Howto: Backupmailbox – ein Kochrezept

Das Problem: ein Backup von wenigen aber wichtigen kleinen Dateien von einem Server machen, aber irgendwie keine Zeit den eigentlichen Backup-Client einzurichten. Sowieso ist in diesem Fall der Backup-Client auf dem Server eigentlich ein bisschen wie mit Kanonen auf Spatzen zu schiessen. Backup muss aber dennoch gemacht werden.

Die Loesung: die Backupmailbox. Auf dem Mailserver wird eine Backup-Aliasmailadresse eingerichtet. Backups gehen dann per Mail an diese Adresse, ein Skript extrahiert die Anhaenge und legt sie im Dateisystem in einer Ordnerstruktur ab. Diese Ordner werden dann ueber den Backupclient – der auf dem Mailserver sowieso laeuft – mit ins regulaere Backup geschoben. Die Anhaenge werden in Unterordner gespeichert, die dem Namen der EMailadresse entsprechen um sie besser auseinanderzuhalten. Dabei wird das @ gegen einen . ersetzt. Weiter werden nur Emails bearbeitet, die als Betreff ein definiertes Zufallspasswort haben.

Die Umsetzung: Man benoetigt einen Email-Alias, ein Skript, zwei Ordner im Dateisystem, ein Zufallspasswort und 15min Zeit eines Systemadministrators.

Zuerst lege man in der /etc/aliases einen neuen Backup-Alias an:

backupalias: "| /path/to/attatchExtract.sh"

und uebernehme diesen mit dem Kommando newaliases. Danach lege man unter dem definierten Pfad das folgende Skript ab:

#!/bin/bash
 
## base path where attachments and logfile should be stored without trailing slash
BASEPATH=/var/local/backup/
 
 
## The subject needs to match this string, otherwise the mail is dropped without action
SECRETSUBJECT="12345"
 
 
## uniq filename for temp file
FILENAME=$(date +%s)
echo "Filename = $FILENAME" >> $BASEPATH/logfile
 
 
## safe email to tmp file
/bin/cat > /tmp/$FILENAME
 
 
## extract sender from email
SENDER=$(grep "From:" /tmp/$FILENAME | sed 's/.*< *//;s/ *>.*//' | tr "@" ".")
echo "Sender = $SENDER" >> $BASEPATH/logfile
 
 
## extract subject from email
SUBJECT=$(grep "Subject:" /tmp/$FILENAME | sed '/^Subject: */!d; s///; q')
echo "Subject = $SUBJECT" >> $BASEPATH/logfile
 
 
## only do something if secret subject is matched
if [ "$SUBJECT" == "$SECRETSUBJECT" ]; then
 
 
  ## create folder for email address if doesn't exist
  if [ ! -d "$BASEPATH/$SENDER" ] ; then
    echo "Directory $BASEPATH/$SENDER does not exist, creating it" >> $BASEPATH/logfile
    mkdir -p $BASEPATH/$SENDER
  fi
 
 
  ## extract files from email and safe to correcet folder
  /usr/bin/uudeview -i -a -p $BASEPATH/$SENDER/ /tmp/$FILENAME >> $BASEPATH/logfile
  echo >> /$BASEPATH/logfile
 
 
## otherwise just do nothing
else
  echo "Subject didn't match secret Subject. Doing nothing..." >> $BASEPATH/logfile
fi
 
 
## delete tmp file
/bin/rm /tmp/$FILENAME

In dem Skript passe man nun das Zufallspasswort gegen ein eigenes an (makepasswd –chars 40) und aktualisiere den BASEPATH. Zuletzt noch das Skript mit chmod 755 ausfuehrbar machen und das Ergebnis aus dem Mailclient seiner Wahl testen.

Sollte es zu Problemen kommen, dass keine Logdatei und Anhaenge abgelegt werden liegt dieses meistens an fehlenden Rechten.

Eigene Debian-Pakete und Repository erstellen

Sobald als man Admin mehrere Server zu administrieren hat, kommt man in den Genuss ein- und das dasselbe auf viele Servern immer wieder machen zu muessen. Heute moechte ich mich dem Thema widmen auf vielen Servern z.B. eine neue Version des Backupskriptes einzuspielen. Dafuer brauche ich zwei Dinge

  1. ein Debian Paket mit meinem Skript
  2. ein Debian Repository ueber das das Paket verteilt wird

Der hier im folgenden vorgestellte Weg ist sehr simpel und rudimentaer gehalten und behandelt explizit Dinge wie SecureApt nicht.

Erstellen eines eigenen Debian-Paketes

Zum Erstellen des eigenen Debian Paketes benoetige ich nun zwei Dinge. Einmal mein Backupskript pregoBackup.sh und einmal eine control-Datei, die Informationen ueber das Debian Paket enthaelt. Die control Datei koennte z.B. wie folgt aussehen:

Package: pregoBackup
Version: 0.5
Section: server
Priority: optional
Architecture: all
Essential: no
Installed-size: 1024
Maintainer: prego presto
Description: pregos Backup Skript zum Sichern des Servers

Das ganze vorgehen jetzt in Worte zu fassen waere sehr umstaendlich. Deswegen in kurz: die control Datei liegt in dem Unterordner ./DEBIAN und neben das DEBIAN Verzeichnis packe ich das Skript an die Stelle, wo ich es im Dateisystem liegen haben moechte:

cd /tmp
mkdir pregoBackup
cd pregoBackup
mkdir ./DEBIAN
mkdir -p ./root/skripte
cp control ./DEBIAN
cp pregoBackup.sh ./root/skripte

Als naechstes wird das Debian-Paket erstellt:

cd /tmp
dpkg-deb --build pregoBackup

Danach sollten wir die Datei /tmp/pregoBackup.deb haben. Was darin enthalten ist koennen wir uns mit:

dpkg-deb --contents pregoBackup.deb

anzeigen lassen, und wer moechte kann es auch spasseshalber mal mit

dpkg -i pregoBackup.deb
aptitude show pregoBackup
aptitude purge pregoBackup

installieren, angucken und deinstallieren.

Anlegen eines Debian Repositories

An zweiter Stelle lege ich nun ein Repository an. Dafuer erstelle ich zuerst eine Verzeichnisstruktur dafuer:

mkdir -p /srv/myrepository/{binary,source}

Anschliessend lege ich einen simplen Apache vhost an mit einer Zugangsbeschraenkung fuer das Repository auf mein lokales Netz:

    ServerAdmin webmaster@example.net
    ServerName myrepository.example.net
    DocumentRoot /srv/myrepository/
 
                AllowOverride None
                Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order Deny,Allow
                Deny from all
                Allow from 192.168.0.0/255.255.0.0

Nun kann ich mein frisch erstelltes Debian-Paket in die Repository Dateisystemstruktur kopieren:

cp /tmp/pregoBackup.deb /srv/myrepository/binary/

Zu guter letzt muss noch der Repository Index erstellt werden. Dafuer muss das Paket dpkg-dev vorhanden sein:

aptitude install dpkg-dev
cd /srv/myrepository
dpkg-scanpackages binary /dev/null | gzip -9c > binary/Packages.gz
dpkg-scansources source /dev/null | gzip -9c > source/Sources.gz

Wenn das alles fertig ist, brauche ich nur noch auf meinem Server die entsprechenden Zeilen in die /etc/apt/sources.conf eintragen, die Liste der verfuegbaren Pakete von den apt-Quellen erneuern und dann kann das Paket installiert werden.

## my personal repository
deb http://myrepository.example.net binary/
deb-src http://myrepository.example.net source/
aptitude update
aptitude install pregoBackup

Safe and Restore Partitiontable

Hat schon mal jemand darueber nachgedacht ein Backup seiner Partitionstabellen zu machen? Anders: Schonmal ne defekte Partitionstabelle gehabt, mit testdisk zwar alles wieder herstellen koennen, aber Dich gefragt wie man da ein bisschen mehr vorsorgen kann?

sfdisk ist Dein Freund.

Save Partition Table:

sfdisk -d /dev/sda > sda_ptbackup

Restore Partition Table:

sfdisk /dev/sda < sda_ptbackup

Voila..

LDAP-Backup erstellen

Ich bin ein Freund vom Plain text. Damit laesst sich IMHO immer noch am besten Arbeiten. Man kann es in alle denkbaren Formate umwandeln, umbiegen, exportieren, was auch immer, und ist deswegen was Backups angeht das Ziel meiner Wahl. Natuerlich habe ich bei dem LDAP-Server das /var/lib/ldap/ im Backuppath mit drin, aber es geht nichts ueber eine Textdatei in der die Werte nochmal als Plain text drinstehen; gleiches gilt uebrigens fuer MySQL-Datenbanken…

Die Backupdatei erstelle ich mit slapcat. Wichtig dabei ist zu beachten, dass die slap* Tools ganz anders arbeiten als die entsprechenden ldap* Gegenstuecke. Beispiel slapadd und ldapadd. Die ldap* Tools sind LDAP-Clients die ueber das LDAP-Protokoll auf die Datenbank zugreifen. Die slap* Befehle aber greifen direkt auf die lokalen Datenbankdateien zu, die Berkley DB = *.bdb Dateien in /var/lib/ldap/. Da die slap* Befehle direkt darauf zugreifen koennen Sie natuerlich nur auf dem Rechner ausgefuehrt werden auf dem der LDAP-Server laeuft, und es ist wichtig, dass der LDAP-Daemon nicht laeuft. Entsprechend ist auch das Backup-Skript was fuer den LDAP laeuft, einmal taeglich per Cron aufgerufen:

#!/bin/bash
 
SLAPCAT=/usr/sbin/slapcat
GZIP=/bin/gzip
BACKUPDIR=/root/ldapbackup/
 
 
# Daemon stoppen
/etc/init.d/slapd stop > /dev/null 2>&1
if [ $? != "0" ]; then
  logger -t "LDAP-Backup:" "Fehler beim Stoppen des slapd Daemons."
  exit 1
fi
 
 
# Backup in Textdatei erzeugen
$SLAPCAT > $BACKUPDIR/$(date +%Y%m%d)-ldapbackup.ldif
if [ $? != "0" ]; then
  logger -t "LDAP-Backup:" "Fehler beim Schreiben der Backupdatei mit slapcat."
  exit 1
fi
 
 
# Textdatei komprimieren
$GZIP $BACKUPDIR/$(date +%Y%m%d)-ldapbackup.ldif
if [ $? != "0" ]; then
  logger -t "LDAP-Backup:" "Fehler beim Komprimieren der erstellten Backupdatei."
  exit 1
fi
 
 
# Daemon starten und wenn es ueberall keine Probleme gab dann Erfolgsmeldung in syslog
/etc/init.d/slapd start > /dev/null 2>&1
if [ $? != "0" ]; then
  logger -t "LDAP-Backup:" "Fehler beim Starten des slapd Daemons."
  exit 1
else
  logger -t "LDAP-Backup:" "Das Backup der LDAP-Datenbank wurde erfolgreich durchgefuehrt."
fi