FTP-Backup-Lösung mit PHP

Dieser Beitrag ist eine Ergänzung bzw. Erweiterung des vorherigen Posts „FTP Backup Skript in PHP“.

Folgende Änderungen werde ich hier besprechen:

  • Erweiterung des Skripts
  • Sicherheit: Absicherung mit .htpasswd
  • Sicherheit: Absicherung mit .htaccess
  • Automatisierung mit All-Inkl Cronjobs

Erweiterung des Backup Skripts

Das neue Skript bietet nun neue Funktionalitäten:

  • Farbliche Hervorhebung
  • Verbesserungen des Backup Prozesses, zusätzliche Überprüfungen und Debug Infos bei Fehlern
  • Verbinden eines externen FTP Server und Kopieren aller neuen Backups
  • Angabe eines beliebigen Ports
  • Verbindung über FTPs (SSL FTP) Port 21 wird verwendet, unsicheres FTP nur noch als Fallback
  • detailliertere Informationen über die Backups in der Benachrichtigungsmail

Nun werden also von beliebig vielen Ordner des FTP-Root Backups erstellt, gegebenenfalls aufgeräumt wenn mehr Backups existieren als aufgehoben werden sollen und anschließend alle neuen Backups auf einen externen FTP Server kopiert. Für den Upload wird der passive FTP Modus verwendet, da dieser in den seltensten Fällen Probleme macht. Sollte der Wechsel zum passiven FTP fehlschlagen, wird dennoch aktives FTP probiert.
Alle nötigen Informationen werden in den Variablen in Zeile 16 bis 25 angegeben. Format und Hilfe steht jeweils dabei, eigentlich sollte da alles klar sein.

Die Erweiterungen machen aus dem Skript eine beispielhafte Backup-Lösung für FTP Inhalte. Auch hier am Beispiel von All-Inkl als Hoster. Wer die Lösung unabhängig von All-Inkl einsetzen möchte, wird das Archive_Tar PHP Modul und irgendeine Art von Cronjob-Funktionalität brauchen.

Screenshot

php-ftp-backup-neu

Code

Achtung: Update (09.06.2015): Dieses Skript ist Version 1.1, basierend auf dem grundlegenden Backup Skript aus diesem Artikel. In Version 1.2 (diesen Artikel) lassen sich nun auch MySQL Datenbanken mitsichern.

Update (02.06.2015): Anpassung der Variablennamen zur besseren Lesbarkeit, Fehlerkorrekturen, verbesserte FTP-URI-Verarbeitung, Portangabe möglich, Verbindung über FTPs (FTP über SSL über Port 21) möglich (mit Fallback zu unsicherem FTP wenn FTPs nicht funktioniert), erweiterte Informationen über die erfolgten Backups in der Benachrichtigungsmail, kleine Optimierungen
Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

Zufälliger Artikel:  Windows Dienste mit wmic service besser verwalten

Sicherheit: Absicherung mit .htpasswd

Das Verzeichnis, in dem die backup.php und die Backups liegen, sollte natürlich mit einer .htpasswd abgesichert werden. Mit einer eingerichteten .htpasswd Datei ist zuerst ein Login nötig, eh man auf bestimmte Bereiche des Webspaces zugreifen darf:
Das Bild zeigt eine Login Datenabfrage beim Aufruf der Backup URL
Die Datei .htpasswd enthält hierbei die Login Daten und in der .htaccess des Backup Unterordners wird festgelegt, dass eine .htpasswd diesen Ordner schützt. Die .htpasswd generiert ihr euch am besten mit diesem Generator und baut sie dann folgendermaßen in die .htaccess dieses Ordners ein:

Sicherheit: Absicherung mit .htaccess

Da wir schonmal bei .htaccess sind, erhöhen wir die Sicherheit mit ein paar weiteren grundlegenden Zeilen:

Dadurch werden Zugriffe auf bestimmte Dateitypen (auch die Backup Dateien), Verzeichnisse und Zugriffe mit sicherheitskritischen Merkmalen unterbunden. Alle diese nicht validen Zugriffe bekommen die index.htm serviert, welches einfach nur eine leere HTML Datei ist. Somit wird den Abfragenden auch kein detaillierter Grund gegeben, warum der Zugriff fehlschlug.

Automatisierung mit All-Inkl Cronjobs

Zu guter Letzt hilft diese Sicherungslösung natürlich nur, wenn sie automatisiert wird. Auch dies ist stark abhängig von eurem Hoster, System, dem Anwendungsbereich usw.
Im Falle von All-Inkl als Webhoster, könnt ihr die Cronjob Funktionalität im KAS (KAS -> Tools -> Cronjobs) benutzen:
Das Bild zeigt die Cronjob Einrichtungsoberfläche von All-Inkl

All-Inkl bietet sogar das Zusenden aller Skriptausgaben. Ihr erhaltet also zusätzlich zu dem kurzen E-Mail-Bericht, der im Skript generiert werden kann, noch eine weitere Mail mit allen Ausgaben. Diese sind dann zwar nicht mehr farbig, aber was solls:
Das Bild zeigt die Cronjob E-Mail mit den Skriptausgaben

Danke an Kenny für das wertvolle Feedback im letzten Artikel, das dazu beigetragen hat, dass ich diese Erweiterung nochmal gepostet habe. Meinst du, dass das jetzt eine Basic Backup Lösung sein könnte? Das einzige, was noch fehlt, ist das Backup Management auf dem externen FTP Server, damit der nicht überläuft. Aber das ist nun wirklich Aufgabe der Admins zu entscheiden und zu verwalten, wie lange Backups aufgehoben werden sollen.

6 Kommentare

  1. Ahoi. Hast du bei den .htaccess-Regeln geprüft, ob du die tatsächlich brauchst? Die von der Webseite kopierten sehen ziemlich individuell und crappy aus. Oder was fängst du beispielsweise in einem „proc/self/environ“ Ordner an?
  2. Aber den Aufruf habe ich doch mit der htpasswd gesichert, siehe Überschrift „Sicherheit: Absicherung mit .htpasswd“. Ich habe diesen Abschnitt nochmal etwas ausführlicher beschrieben und ein Bild eingebaut, dann sollte das besser auffallen 😉
    Also selbst wenn man die URL des Skripts hat – komplett – muss vorher ein Login erfolgen.
    Du musst mir mal nochmal grob verraten, wie man die URLs (egal ob vom Skript oder von den Backup Dateien) „potentiell herausfinden“ kann. Ich wähle ja extra schon Subdomain-Namen, die eben nicht einfach sind, also nur „backup.han…“. Da würde es mich schon nervös machen, wenn man die Subdomains und dann die enthaltenen Daten irgendwie rausfischen könnte. Und das dann sogar trotz vereinheitlichter Serverantwort mit einer leeren HTML Datei usw.

    Htaccess Regeln… ich weiß nicht welche Taktik man da verfolgen sollte. Ich kenne Zighundert Zeilen aus verschiedensten Quellen, die jede Art von „seltsamer Abfrage“ filtern. Auf Arbeit schützen wir auch unsere Auftritte durch einen ganzen Haufen solcher Filter. Es ist natürlich immer die Frage, ob man sie braucht. Ob jemals ein solcher Aufruf erfolgt. Aber ich finde halt auch, dass es nicht schadet, sie drin zu haben. Irgendwelche Experten werden sich schon was dabei gedacht haben die Filter so zu basteln. Sicher, weil Anfragen dieser Art existieren und benutzt werden.
    Sowas wie Base64 enkodierte Befehle oder JS Stuff kann ich mir schon gut vorstellen, dass da automatisierte Scanner immernoch das komplette Internet mit gewissen URLs befeuern auf der Suche nach Servern, die da irgendwie noch verwundbar sind.
    Und selbst wenn – gerade bei mir – nie jemand einen solchen Zugriff macht, stehen die Regeln halt einfach so da und stören keinen 😉

  3. bei mir geht seid einiger zeit nix mehr. er rödelt und rödelt wenn ich die url aufrufe aber nichts passiert.

    hat all inkl was geändert ????

  4. tja bei mir geht es einfach nichtder cornjob springt an hab die email sende funktion auch aktiviert aber es sichert 5 ftp backups ( ich habe 10 Seiten, fehlen also 5 ) und das wars dann weder die datenbanken noch die fehlenden seiten werden weiter gesichert . in der email ist dass so zu sehen
  5. 5 Backups werden also als Dateiform im Ziel-Backupordner abgelegt und es kommt trotzdem die Mail meines Skripts? Die wird ja erst am Ende des Skripts erstellt und verschickt. Ich hätte auf Skript Timeout gesetzt, aber dann würde die Mail nicht rausgehen. Kriegst du die cronjob Mail von All-Inkl oder die Skript Mail meines Skripts?
    Kannst du vielleicht mal den Mailinhalt hier posten oder an mich weiterleiten, damit ich mir das mal ansehen kann?

    Sind es immer dieselben Seiten, die nicht gehen? Hast du mal versucht nur 2, 3 von denen zu sichern, die sonst nicht gehen? Die Frage ist ja, ob es an der großen Anzahl der Projekte liegt, an der Größe einzelner Projekte. Einfach mal die große Sicherung aufsplitten, Reihenfolge der Sicherung ändern und gucken was passiert.

  6. Hallo billy,

    ich hoffe du hast das Verzeichnis, in dem das Backup-Script liegt zum Sichern ausgeschlossen, oder zumindest den Dateityp, den das Script erzeugt. Nicht das sich hier eine endlosschleife ergibt.

    Ansonsten schließe ich mich Hannes an, zeige die Mail und wir sehen weiter.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.