====== Backup der Datenbank ======
Sämtliche Inhalte des Systems (auch hochgeladene Dokumente) werden in der Datenbank gespeichert, dh ein Backup der Datenbank reicht aus um sämtliche Inhalte wiederherzustellen.
Das Backup umfaßt dabei folgende Dateien:
Täglich für eine Woche:
''mysqldump_daily_{Wochentag}.sql.gz.enc''
Wochentag: 1-7, 1 = Montag
Monatlich am 1. für ein Jahr:
''mysqldump_monthly_{Monat}.sql.tar.gz''
Monat: 01 - 12
Jedes Jahr am 1. 1.:
''mysqldump_yearly_{Jahr}.sql.tar.gz''
Jahr: zB "2017"
Das Backup wird komprimiert mittels gzip und asymmetrisch verschlüsselt. Der Publickey zum Verschlüsseln liegt dabei am Server, der Privatekey wird sicher verwahrt und wird nur zum entschlüsseln eines Backups benötigt - er liegt nicht innerhalb der VM.
===== Cron =====
Das Backup wird über Cron gesteuert, die Crontab (für root) sieht dabei so aus:
0 4 * * * /opt/webserver/backup/backup.sh
0 4 1 * * /opt/webserver/backup/backup.sh month
0 4 1 1 * /opt/webserver/backup/backup.sh year
Die Backups erfolgen dabei immer um 4 Uhr früh (Täglich, am 1. des Monats und jedes Jahr am 1. 1.)
===== Skripte =====
Die Backupskripte liegen dabei in ''/op/webserver/backup'', das Dateilayout sieht folgendermaßen aus:
-rwx------ 1 root root 706 Mar 30 09:05 backup.sh
-rw------- 1 root root 57 Mar 30 07:54 mysqldump.cnf
-rw-r--r-- 1 root root 1285 Mar 30 08:08 mysqldump-secure.pub.pem
-rwxr--r-- 1 root root 856 Mar 30 09:26 restore.sh
==== backup.sh ====
Das Backupskript selbst. Akzeptiert folgende Aufrufe:
=== # ./backup.sh ===
Ohne Parameter wird ein tägliches Backup angelegt
=== # ./backup.sh month ===
Ein monatliches Backup wird erstellt
=== # ./backup.sh year ===
Ein jährliches Backup wird erstellt
#!/bin/bash
BACKUP_DIR=/srv/backup
DATABASE="datareporter"
# Remove backups older than 2 days
# They should already be synced to S3 bucket
find $BACKUP_DIR/*.enc -mtime +2 -exec rm {} \;
DOW=$(date +%u)
MONTH=$(date +%m)
YEAR=$(date +%Y)
DAILY_FILE="mysqldump_daily_$DOW.sql.gz.enc"
MONTHLY_FILE="mysqldump_monthly_$MONTH.sql.gz.enc"
YEARLY_FILE="mysqldump_yearly_$YEAR.sql.gz.enc"
# Remove backups older than 2 days
# They should already be synced to S3 bucket
find $BACKUP_DIR/*.enc -mtime +2 -exec rm {} \;
BACKUPFILE=$BACKUP_DIR/$DAILY_FILE
if [ "$1" == "month" ]; then
BACKUPFILE=$BACKUP_DIR/$MONTHLY_FILE
fi
if [ "$1" == "year" ]; then
BACKUPFILE=$BACKUP_DIR/$YEARLY_FILE
fi
echo "Backup to $BACKUPFILE"
mysqldump --defaults-extra-file=/opt/webserver/backup/mysqldump.cnf --single-transaction $DATABASE | \
gzip | \
openssl smime -encrypt -binary -text -aes256 -out $BACKUPFILE -outform DER /opt/webserver/backup/mysqldump-secure.pub.pem
==== mysqldump.cnf ====
Konfigurationsdatei für mysqldump um das Passwort für die Datenbank nicht in der Prozessliste anzuzeigen
[mysqldump]
host=localhost
user=root
password=******
==== mysqldump-secure.pub.pem ====
Öffentlicher Schlüssel mit dem die Backups verschlüsselt werden
==== restore.sh ====
Skript mit dem die Backups wieder entschlüsselt werden können. Dazu muss der private Schlüssel ins System kopiert werden (sollte aber nach dem Entschlüsseln sofort wieder entfernt werden). Alternativ kann die Entschlüsselung auf einem externen System erfolgen.
#!/bin/bash
KEYFILE=/opt/webserver/backup/mysqldump-secure.priv.pem
DESTINATIONFILE=/opt/webserver/backup/datenschutz.sql
echo "Checking for file $1"
if [ -e $1 ]; then
echo "Database backup file $1 found"
else
echo "File $1 not found, please check for file path..."
exit
fi
echo "Checking for private key in $KEYFILE"
if [ -e $KEYFILE ]; then
echo "Key found!"
else
echo "No private key found, please copy key to $KEYFILE"
exit
fi
if [ -e $DESTINATIONFILE ]; then
echo "$DESTINATIONFILE exists, removing..."
rm $DESTINATIONFILE
fi
echo "Restoring to $DESTINATIONFILE"
openssl smime -decrypt -in $1 -binary -inform DEM -inkey $KEYFILE | \
gunzip >$DESTINATIONFILE
if [ -e $DESTINATIONFILE ]; then
echo "Restore operation successful, backup restored to $DESTINATIONFILE"
fi
echo "** please delete your private key now: $KEYFILE"
===== AWS Backup auf S3 Bucket =====
Die erstellten und verschlüsselten Backups werden dann auf einen S3 Bucket synchronisiert. Der Bucket ist mit Versioning erstellt, so dass alle Objekte versioniert werden.
Konfiguration:
aws configure
Benutzer Key / Shared Secret eingeben
region: eu-central-1
Crontab für upload:
0 6 * * * /usr/bin/aws s3 sync /srv/backup s3://datenschutz.traunau.at/develop