Server-backup mit duplicity auf Amazon S3

Das Backup für PCs und Laptops macht Backuppc sehr fein, aber für die Root-Server braucht es eine andere Lösung.

Duplicity macht gpg-verschlüsselte Backups und unterstützt die unterschiedlichsten Endpunkte wie ftp, rsync, scp, ssh, webdav[s] und auch Amazon S3. Hier mein Mini-Bash-Skript mit dem ich meine Server dorthin sichere:

#!/bin/bash

BDIRS="/etc /home /"
LOGDIR='/var/log/duplicity'
BAC="s3+http://ihr_bucket_name.s3.amazonaws.com"
# symmetrische verschluesselung fuer gpg
export PASSPHRASE='einelangeschwierigepassphrase'
export AWS_SECRET_ACCESS_KEY="amazon_aws_secret_access_key"
export AWS_ACCESS_KEY_ID="amazon_aws_access_key"
##### end of config ##########

BCLIENT=$(hostname);
for FULL_DIR in $BDIRS
do
  DIR=$(basename $FULL_DIR)
  if [ $DIR == "/" ]
  then
    DIR="root"
  fi
  EXCLUDELIST="/usr/local/etc/duplicity-exclude-$DIR.conf"
  if [ -f $EXCLUDELIST ]; then
    EXCLUDE="--exclude-filelist $EXCLUDELIST"
  else
    EXCLUDE=''
  fi
  duplicity remove-older-than 60D -v3 --force $BAC/$BCLIENT_$DIR >> $LOGDIR/$DIR.log
  duplicity --full-if-older-than 30D -v3 $EXCLUDE $FULL_DIR $BAC/$BCLIENT-$DIR 
    >> $LOGDIR/$DIR.log
done

export PASSPHRASE=""
export AWS_SECRET_ACCESS_KEY=""
export AWS_ACCESS_KEY_ID=""

exit 0

Das Skript entstand in Anlehnung an ein Backup-Skript von Hetzner, wobei ich es noch weiter vereinfacht und auf S3 umgestellt habe. Backups werden 60 Tage aufbewahrt, wobei alle 30 Tage ein volles Backup gemacht wird. In den Zeilen 3 bis 9 sind die entsprechenden Anpassungen zu machen. Aufgerufen wird das Skript jede Nacht von cron:

root@yourhost:/root $ cat /etc/cron.d/duplicity 
# /etc/cron.d/duplicity: crontab fragment for backup
# backup at 4 in the morning
55 3 * * * root /usr/local/sbin/backup.sh >/dev/null 2>&1
root@yourhost:/root $

E-Mails von /var/mail nach ~/Maildir

Eigentlich speichere ich meine E-Mails in $HOME/Maildir im Maildir Format. Durch eine Fehlkonfiguration im MTA kann es aber passieren, dass die E-Mails in /var/mail/ landen. Um diesen Fehler für alle Benutzer am System nachträglich zu korrigieren reicht der Einzeiler:

for i in /var/mail/* ; do formail -s procmail -d ${i##*/} < $i ; done

Dazu muss natürlich das procmail Paket installiert sein und die entsprechenden procmail-Regeln entweder im Benutzerverzeichnis als ~/.procmailrc oder in /etc/procmailrc liegen. Hier ein Beispiel:

DEFAULT=$HOME/Maildir/
ORGMAIL=$HOME/Maildir/
LOGFILE=/var/log/procmail.log
VERBOSE=off
DROPPRIVS

Server-Migration

Es hat sich so ergeben, dass ich circa alle zwei Jahre meine Server auf neue Hardware verlege. Bei den gemieteten root-servern kommen dabei immer neue IP-Adressen ins Spiel. Da das Update der DNS-Einträge ein wenig zeitversetzt geschieht und das den Zeitpunkt der Umstellung nicht ganz genau planen lässt, ist es günstig alle Anfragen von der alten IP-Adresse auf die neue umzuleiten. Mit iptables ist das sehr einfach, hier das Skript, das nicht nur Webanfragen, sondern auch Mailserver (SMTP und IMAP/POP) umleitet. Das Skript muss am alten Server ausgeführt werden, wobei 10.0.0.1 hier die IP-Adresse des neuen Servers ist.

echo 1 > /proc/sys/net/ipv4/ip_forward
# http/https
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 10.0.0.1
# imap/imaps
iptables -t nat -A PREROUTING -p tcp --dport 143 -j DNAT --to-destination 10.0.0.1
iptables -t nat -A PREROUTING -p tcp --dport 995 -j DNAT --to-destination 10.0.0.1
# SMTP
iptables -t nat -A PREROUTING -p tcp --dport 25 -j DNAT --to-destination 10.0.0.1
# POP3/POP3s
iptables -t nat -A PREROUTING -p tcp --dport 110 -j DNAT --to-destination 10.0.0.1
iptables -t nat -A PREROUTING -p tcp --dport 995 -j DNAT --to-destination 10.0.0.1
iptables -t nat -A POSTROUTING -j MASQUERADE

Zum Anzeigen der NAT-Tabellen eignet sich dieses Kommando (credits):

iptables -nvL -t nat

Damit kann man die Servermigration mit einem Schalter umlegen.

Update:
Da dieser tolle Trick so gut funktioniert, besteht die Gefahr, dass man nicht alle DNS-Einträge auf die neue IP korrigiert hat. Nachdem der Server vom Provider Netz genommen wurde kamen die ersten Beschwerden … Deshalb das nächste mal vorher die Server-Abschaltung selbst testen.

Ubuntu legt die Apache Logfiles als gzippte Dateien in /var/log/apache2 ab. Um von alten Logdateien nachträglich eine Statistik zu erstellen kann folgendes Kommando nützlich sein:

for i in `ls -tr /var/log/apache2/ssl_meinhost.com*access*gz` ; 
do  
  gunzip -c $i > /tmp/ssl_log.txt; /usr/lib/cgi-bin/awstats.pl 
    -config=ssl.meinhost.com -LogFile=/tmp/ssl_log.txt ;
done

ssl_meinhost.com bzw. ssl.meinhost.com sind natürlich auf die entsprechenden Logfiles bzw. awstats-Konfiguration anzupassen.

Links:

Backuppc zum Sichern von Desktops

Dazu gibt es schon viele Anleitungen, aber ein Problem bei meinem Linux-Desktop ließ mich nicht los:

Remote[1]: rsync: readlink_stat("/home/bernd/.gvfs") failed: Permission denied (13)

Der dritte Eintrag im Thread http://ubuntuforums.org/showthread.php?t=767311 half schließlich: Mit --one-file-system wird rsync angewiesen, das gemountete fuse-Filesystem unter ~/.gvfs nicht zu sichern.

Die entsprechende Config-Zeile in /etc/backuppc/hostname.pl sieht dann bei mir folgendermaßen aus:

$Conf{RsyncClientCmd} = '$sshPath -q -x -l backuppc --one-file-system $host sudo $rsyncPath $argList+';
$Conf{RsyncClientRestoreCmd} = '$sshPath -q -x -l backuppc $host sudo $rsyncPath $argList+';
$Conf{RsyncArgsExtra} = [
  '--one-file-system'
];

Zur Erklärung der RsyncClient -Zeilen: Ich verwende rsync über ssh als Methode, wobei der User backuppc am host sudo-Rechte für das rsync-Kommando braucht.

Auch die Exclude-Syntax von Backuppc (die in meinem Fall auf rsync zurückgreift), bedurfte einiger Anläufe. Ein Auszug

$Conf{RsyncShareName} = [
  '/etc',
  '/home/bernd'
];
$Conf{BackupFilesExclude} = {
  '*' => [
    'VirtualBox VMs/',
    '.VirtualBox/HardDisks/',
    '.VirtualBox/Machines/',
    'local/mobile_atlas_creator/atlases/'
  ]
};

Mit diesen Einstellungen werden die VirtualBox-Ordner und der mobile_atlas-Ordner in meinem Standardverzeichnis von der Sicherung ausgeschlossen.

Links