Back to blog
Dec 2021·5 min read

Auto-Backup to Amazon S3

#amazon#amazon-web-services#amazonwebservices#aws#backup#boto#boto3#python#s3#s3client#sicherheitskopie

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.

NewerC# DelegatesOlderUdemy Autoenroll Skript für Tampermonkey