Auto-Backup to Amazon S3
Ich bin in letzter Zeit sehr kritisch geworden, was die Sicherheit meiner Backups angeht. Gerade auch, da ich mit meinem V-Server (auf dem unter Anderem auch diese Webseite gehostet wird) relativ viel experimentiere und ggfs. mal eine Konfiguration zerschieße. Noch dazu liebe ich das gute Gefühl das man hat, auf einem frischen, sauberen System zu arbeiten und bin entsprechend sehr "Reinstall-freudig". Dabei kann es teilweise sehr nervig sein, bestehende Konfigurationen, Dateien und sonstiges, was man sich so eingerichtet hat, immer manuell zu backupen. Was liegt also näher, als sich automatisch Backups seiner Dateien zu ziehen? Dazu hab ich mir vor kurzem ein kleines Skript geschrieben, welches ich jetzt auf meinem Git veröffentlicht habe.
Zu finden ist das ganze hier: github.com/devdavede/s3backup
Die Installation / Ausführung ist recht einfach.
Schritt 1: S3 Bucket erstellen
Ich gehe mal davon aus, dass du dir bereits einen Amazon Web Services Account eingerichtet hast. Wenn nicht kannst du das hier nachholen: aws.amazon.com
Danach gehst du in den Bereich S3, indem du oben in die Suche S3 eintippst, klickst auf Bucket erstellen und gibst einen Namen und eine Region für den Bucket ein.
Du solltest ACLS deaktivieren und den gesamten öffentlichen Zugriff ebenfalls deaktivieren (was passiert wenn du diesen Schritt übersiehst, kannst du hier nachlesen: rudrasarkar.medium.com - how-i-hacked-92k-users).
Versionierung habe ich bei mir deaktiviert (es liegt an dir, ob du eine Dateiversionierung möchtest. Ich habe mich dagegen entschieden weil ich immer nur die neuste Version meiner Dateien abrufen möchte) und die Verschlüsselung ebenfalls (auch hier liegt es an dir, ob du mit oder ohne Verschlüsselung arbeiten möchtest).
Im nächsten Schritt musst du einen Nutzernamen wählen und als Zugriffstyp wählst du Zugriffsschlüssel - Programmgesteuerter Zugriff.
Im Schritt Berechtigungen wählst du "Vorhandene Richtlinien direkt anfügen" und hier "AmazonS3FullAccess". Klicke auf Weiter: Tags, hier musst du nichts tun.
Gehe zum nächsten Schritt und kopiere dir hier die Werte unter Zugriffsschlüssel-ID und Geheimer Zugriffsschlüssel. Diese Schlüssel sind geheim und du solltest sie definitiv nicht weitergeben - jeder, der im Besitz dieser Schlüsselkombination ist, kann sonst auf deine Dateien zugreifen.
Voilá, Schritt eins ist erledigt. Du hast jetzt einen Amazon S3 Bucket, auf den du via API zugreifen kannst.
Schritt 2: Einrichten der Zugangsdaten
Es gibt jetzt zwei Möglichkeiten, dich gegenüber S3 zu authentifizieren.
Möglichkeit eins besteht darin, eine Credentials-Datei anzulegen. Hierzu erstellst du eine Datei unter ~/.aws/credentials mit folgendem Inhalt:
[default]
aws_access_key_id = <zugriffsschlüsselid>
aws_secret_access_key = <geheimerzugrifsschlüssel>
und eine Datei unter ~/.aws/config mit folgendem Inhalt:
[default]
region = <region>
(solltest du dir nicht gemerkt haben, in welcher Region du den Bucket erzeugt hast, kannst du dies über wie Webmanagementkonsole nachschauen)
Das war's auch schon, das Python-Skript kann sich jetzt gegenüber S3 mit diesen Daten authentifizieren.
Möglichkeit zwei besteht darin, die Zugangsdaten im Skript direkt einzutragen (siehe die Variablen aws_access_key_id, aws_secret_access_key und region_name). Dieses Vorgehen ist aber nicht zu empfehlen, da die Zugangsdaten in diesem Fall ungeschützt für jeden sichtbar sind, der Zugriff auf das Skript hat).
Schritt 3: Erstellen der my.cnf
Wenn du die Möglichkeit nutzen möchtest, deine Datenbank ebenfalls zu backupen, musst du die Zugangsdaten zur Datenbank hinterlegen. Am besten machst du das (wenn noch nicht geschehen) via my.cnf.
Tippe hierzu folgende Befehle in die Shell:
m=`which mysqld`
$m --verbose --help | grep -A 1 "Default options"
und du bekommst den Pfad (idR /etc/my.cnf) zu deiner my.cnf
Öffne diese nun und füge folgenden Teil ans Ende der Datei
[client]
user=<deinmysqlrootusername>
password=<deinmysqlrootpasswort>
That's it. Danach kann sich dein Nutzer ohne Angabe von Nutzername/Passwort in die MySQL-Shell einloggen.
Alternativ auch hier wieder: Du kannst die Zugangsdaten direkt im Skript eingeben. Die Nachteile davon hab ich ja bereits oben erwähnt :-)
Schritt 4: Konfigurieren des Skripts
Lade das Skript nun auf deinen Server hoch und bearbeite es ein bisschen. Folgende Variaben müssen bearbeitet werden:
- entities = Ein Array von Ordnern oder Dateien, die (inkl. Unterordner!) gebackupt werden sollen
- bucketname = Der Name deines S3 Buckets
- db_path = Der Pfad zur Datenbank, in welcher die Checksummen der Dateien gespeichert werden
- aws_access_key_id = Dein AWS Access Key. Auf None lassen, wenn du die config Datei aus Schritt 2 verwendest
- aws_secret_access_key = Dein AWS Secret Key. Auf None lassen, wenn du die config Datei aus Schritt 2 verwendest
- region_name = Der Name deiner Bucket-Region. Auf None lassen, wenn du die config Datei aus Schritt 2 verwendest
- backup_databases = True, wenn Backups aller Datenbanken erstellt werden sollen, ansonsten False
- mysql_username = Dein MySQL Nutzername. Auf None lassen, wenn du die config Datei aus Schritt 3 verwendest
- mysql_password = Dein MySQL Passwort. Auf None lassen, wenn du die config Datei aus Schritt 2 verwendest
- mysql_tmp_dump_file = Hierhin wird ein temporärer Datenbankdump erzeugt. Der Ordner muss beschreibbar sein.
- s3_mysql_dump_path = Der Pfad deines Datenbankdumps in deinem S3 Bucket
Schritt 5: Laden der Dependencies
Für den Upload zu S3 verwendet das Skript Boto
Außerdem wird TinyDB verwendet, um die Prüfsummen der Dateien in einer kleinen Datenbank zu speichern (der Pfad in der Variable db_path)
Um alle dependencies zu installieren, führe einfach folgenden Befehl in der Shell aus:
pip3 install -r requirements.txt
damit werden alle benötigten Pakete installiert.
Schritt 6: Run it!
Starte einen Testlauf durch eingeben des Befehls
python3 s3backup.py
und schaue, wenn das Skript fertig durchgelaufen ist, in deinen S3 Bucket. Hier solltest du jetzt in gleicher hierarhcie wie auf deinem Server eine 1:1 Kopie aller Dateien/Ordner/Unterordner sehen, welche in der Variable entities angegeben wurden.
Schritt 7 (Extra): Automatisieren via Cronjob
Das ganze lässt sich auch einfach via Cronjob automatisieren
Hierzu finden wir zuerst mal raus, wo sich unsere Python3 Installation befindet:
which python3
das spuckt uns sowas wie /usr/bin/python3 aus.
Danach geben wir
crontab -e
ein und hier folgendes
0 0 */5 * * <Pfad-zu-Python3> <Pfad-zum-backup-skript.py>
Mit Strg+X (schließen) und Y (Ja, speichern!) quittieren. Damit wird alle 5 Tage um 24:00 automatisch das Backup ausgeführt.