37.8Backups auf S3-Speicher
S3 steht für Simple Storage Service und ist ein Puzzlestück der Amazon Web Services (AWS). S3 ist ein vergleichsweise kostengünstiger Cloud-Dienst von Amazon zur Speicherung von Dateien. S3 ist vor allem als externer Backup-Speicher sehr beliebt, besonders wenn es darum geht, zusätzlich zu einem lokalen Backup auch ein geografisch vom Server getrenntes Backup durchzuführen. Das gibt Ihnen die Gewissheit, auf Ihre Daten selbst dann noch zugreifen zu können, wenn Ihre Hosting-Firma pleitegegangen ist oder deren Rechenzentrum durch eine Naturkatastrophe zerstört wurde.
Das Preismodell von Amazon S3 ist außergewöhnlich unübersichtlich. Sie bezahlen nicht nur für die gespeicherten Datenmengen an sich, sondern auch für Transfers, wobei zwischen GET- und PUT-Anforderungen unterschieden wird, also Down- und Uploads. Lassen Sie sich von der verwirrenden Darstellung des Preismodells aber nicht irritieren: Im Vergleich zu Diensten wie Dropbox ist S3 bei einer vernünftigen Nutzung ausgesprochen billig. Sie sollten aber bei der Programmierung von Backup-Scripts darauf achten, unnötige Transfers zu minimieren.
S3-Speicher einrichten
Sie können Amazon S3 mit Datenmengen bis zu 5 GByte für ein Jahr kostenlos testen. Sie müssen sich allerdings auch für den Test mit Name, Adresse, einer funktionierenden Telefonnummer und einer Kreditkarte anmelden. Die Kontoeinrichtung dauert nur wenige Minuten. Anschließend müssen Sie in der S3-Weboberfläche zumindest einen sogenannten »Bucket« (wörtlich »Eimer«) anlegen, gewissermaßen ein Grundverzeichnis innerhalb von S3. Der Bucket-Name muss innerhalb der gesamten S3-Cloud eindeutig sein. Es empfiehlt sich deswegen, den Firmen- oder Domainnamen miteinzubeziehen, z. B. meinefirma.erster.test oder info.kofler.backup.
Nach diesen ein wenig langwierigen Vorbereitungen können Sie nun endlich im Terminal loslegen. Dort brauchen Sie das Python-Kommando aws. Zu diesem kommen Sie, indem Sie zuerst das Python-Paketverwaltungswerkzeug pip installieren und damit dann das Paket aswcli:
Wenn Sie bei der Script-Programmierung Python 3 vorziehen, sieht die Vorgehensweise so aus:
Die Verbindung zu S3 erfolgt verschlüsselt. Bevor Sie im Terminal das Kommando aws für die weitere Nutzung konfigurieren können, müssen Sie sich auf der AWS-Seite Identity & Access Management (IAM) einen Benutzer und eine Gruppe einrichten. Die Gruppe verbinden Sie mit der Policy AmazonS3FullAccess und mit dem neuen Benutzer.
https://console.aws.amazon.com/iam
Im Terminal führen Sie nun aws configure aus und geben dabei die Access Key ID und den Secret Access Key an, den Sie beim Einrichten des Benutzers erhalten haben. aws speichert diese Daten und die weiteren Optionen in .aws/credentials und .aws/config.
Nicht ganz einfach ist die korrekte Angabe der Region. Beim Anlegen neuer Buckets können Sie wählen, wo diese physikalisch gespeichert werden sollen. Für S3-Kunden in Deutschland ist Frankfurt der beste Ort. In welcher Form erwartet S3 nun aber die Angabe der Region? Am besten ist es, die Region vorerst leer zu lassen. Anschließend ermitteln Sie mit aws s3api get-bucket-location die Region und wiederholen dann aws configure:
Das aws-Kommando
aws s3 ls liefert eine Liste aller eigenen Buckets:
Mit aws s3 cp laden Sie eine lokale Datei hoch. Die folgenden Zeilen erstellen zuerst ein komprimiertes Backup des /etc-Verzeichnisses und übertragen dieses dann in einen Bucket, der in der Form s3://bucketname angegeben wird. Natürlich ist auch ein Transfer in die umgekehrte Richtung möglich (drittes Kommando).
Ein wenig verwirrend ist der Umgang mit Verzeichnissen. Innerhalb eines S3-Buckets gibt es offiziell nämlich gar keine Verzeichnisse. Vielmehr befinden sich alle Dateien ohne eine hierarchische Ordnung direkt im Bucket. Daher fehlen Kommandos wie mkdir, rmdir oder cd.
Bucket-Dateien dürfen aber Namen in der Form von v1/v2/name haben. ls verarbeitet derartige Dateinamen so, als würde es sich dabei um Verzeichnisse handeln. Auch die S3-Weboberfläche zerlegt derartige Dateinamen in virtuelle Verzeichnisse.
Anstatt einzelne Dateien hochzuladen, können Sie mit aws s3 sync ganze Verzeichnisbäume synchronisieren:
Wenn Sie das Kommando zum ersten Mal ausführen, werden alle Dateien des lokalen Verzeichnisses hochgeladen. Wiederholen Sie das Kommando später, werden nur noch die Änderungen durchgeführt, wobei lokal gelöschte Dateien im S3-Bucket standardmäßig erhalten bleiben (es sei denn, Sie verwenden die Option --delete).
Neben ls, cp und sync gibt es nur fünf weitere Kommandos: mv verschiebt eine Datei, rm löscht eine Datei, mb erzeugt einen Bucket und rb löscht ihn wieder. Mit website können Sie schließlich aus einem Bucket eine statische Webseite machen. Das ist dann zweckmäßig, wenn Sie Dateien öffentlich zum Download anbieten möchten. Eine detaillierte Beschreibung der aws-s3-Kommandos mit all ihren Optionen finden Sie hier:
http://docs.aws.amazon.com/cli/latest/reference/s3/index.html
Verschlüsselung und Beispiel
Nach den Enthüllungen von Edward Snowden müssen Sie leider davon ausgehen, dass die NSA und andere Geheimdienste uneingeschränkten Zugriff auf Ihre Daten in der Cloud haben – ob das den Cloud-Betreibern nun passt oder nicht. Dass Ihre Daten beim Upload verschlüsselt übertragen werden, ist zwar an sich erfreulich, aber letzten Endes irrelevant. Wenn Sie Wert darauf legen, dass Ihre Dateien nur von Ihnen gelesen werden können, müssen Sie sie vor dem Upload verschlüsseln.
Ich gehe dabei oft so vor, dass ich auf einem Server zuerst ein lokales Backup-Verzeichnis erstelle. Dort führe ich die Backups durch, die mir zweckmäßig erscheinen, wobei ich bei dieser Gelegenheit bereits alle Backup-Dateien verschlüssele. In einem zweiten Schritt synchronisiere ich dann das lokale Backup-Verzeichnis in einen S3-Bucket, auf einen FTP-Server des Hosting-Providers etc.
Im folgenden Beispiel gehe ich davon aus, dass es das lokale Backup-Verzeichnis /local-backup gibt. Es ist zweckmäßig, dieses in einem eigenen Logical Volume mit einem eigenen Dateisystem einzurichten. Alle Backup-Scripts und Schlüssel befinden sich in /etc/myscripts. Zum Ver- und Entschlüsseln wird eine Pass Phrase aus einer Datei verwendet.
Zum Verschlüsseln verwende ich das Kommando gpg, das in die Scripts mycrypt und myuncrypt verpackt ist. Die Verschlüsselung erfolgt der Einfachheit halber symmetrisch.
Die hohe Kunst des Verschlüsselns
Das hier präsentierte Verschlüsselungskonzept ist einfach, aber sicherheitstechnisch alles andere als perfekt. Solange die Datei /etc/myscripts/key nicht in falsche Hände gerät, ist die so errichtete Hürde ein ausreichender Schutz vor Gelegenheits-Hackern – mehr nicht! Wenn Sie höhere Sicherheitsansprüche stellen, müssen Sie entsprechende Fachliteratur konsultieren.
Das täglich um 2:00 Uhr ausgeführte Cron-Script backup-cms erstellt ein Backup der MySQL-Datenbank cms, komprimiert und verschlüsselt dieses und speichert es in /local-backup/mysql unter dem Namen cms-nn.sql.gz.crypt. Dabei ist nn der Tag im Monat (1 bis 31). Damit gibt es immer individuelle tägliche Backups, die einen Monat zurückreichen.
Ein weiteres Cron-Script, das täglich um 3:00 Uhr ausgeführt wird, muss nun nur noch die Backup-Dateien in /local-backup in einen S3-Bucket synchronisieren:
Jetzt müssen Sie die Prozedur natürlich testen: Funktionieren die automatischen Backups? Sind Sie auch auf einem anderen Server in der Lage, die Backup-Datei aus dem S3-Speicher herunterzuladen, zu entschlüsseln, zu entkomprimieren und dann in einen MySQL-Server hochzuladen? Wichtig ist natürlich, dass Sie über sichere Kopien der S3-Zugangsdaten sowie der Schlüsseldatei /etc/myscripts/key verfügen!