Stündliches Datenbankbackup lokal und per E-Mail/FTPS für WordPress/Gambio mit AES-Verschlüsselung

Stündliches Datenbankbackup lokal und per E-Mail/FTPS für WordPress/Gambio mit AES-Verschlüsselung

Ich habe mir mal wieder etwas Zeit genommen und an einem Script für stündliche MySQL/MariaDB-Datenbankbackups gearbeitet. Das Script basiert auf der Programmiersprache PHP und kann daher für sogut wie alle Webanwendungen (natürlich auch den JTL-Shop) verwendet werden. Zusätzlich wurde das Script bereits für WordPress und Gambio optimiert.

Update:

Mit dem PHP-Script können jetzt auch optional die Dateien gesichert werden.

Weiter unten findet sich ein Shellscript für sehr große Datenbanken (bei dem Backups die älter als 3 Tage sind gelöscht werden).

Die Daten der Datenbank werden nach dem Backup per zip komprimiert und mit AES 256 Bit verschlüsselt. Als Verschlüsselungspasswort wird das Datenbankpasswort verwendet – daher ist es sinnvoll sich dieses Passwort auch separat zu notieren.

Die Verschlüsselung erfolgt um die Übertragungssicherheit und den Datenschutz zu erhöhen.

Dieser Artikel enthält geschützte Bereiche welche mit einem Passwort für Bestandskunden freigeschaltet werden können.

1. Installation

Für die Installation sind mehrere kleine Schritte notwendig (das Beispiel geht von WordPress aus):

1. Anlegen eines „backups“ Ordners mit den Dateirechten „777“ auf dem Webserver und ggf. FTPS-Backupspeicher

2. Anlegen einer „.htaccess“ Datei auf dem Webserver innerhalb des „backups“ Ordners mit dem Inhalt:

Deny from all

3. Anlegen einer Datei „backup_lautenbacherio.php“ mit dem Inhalt des Scripts (siehe weiter unten)

4. Anlegen eines Cronjobs welcher die URL des PHP-Scripts im gewünschten zeitlichen Abstand (z. B. jede Stunde oder alle 6 Stunden [Crontab: 1 */6 * * *]) ausführt

5. ggf. PHP-Ausführungszeiten anpassen

Solltet Ihr Probleme bei der Installation bzw. Einrichtung eines stündlichen Datenbankbackups haben könnt Ihr mich gerne mit meinem Kontaktformular kontaktieren. Ich helfe Euch zu günstigen Stundensätzen.

2. PHP-Script

Im oberen Bereich des Scripts können die Datenbankzugangsdaten eingetragen werden. Sollte es sich um eine WordPress-Installation handeln ist das Script im root-Verzeichnis abzulegen und es kann einfach bei der Variable WordPress eine 1 eingetragen werden. Die Zugangsdaten werden dann aus der wp-config.php ausgelesen.

Ansonsten ist es auch noch möglich mit 1 oder 0 einzustellen, ob das Backup per E-Mail versendet oder per FTPS-hochgeladen werden soll. Letztendlich kann auch eingestellt werden, dass die lokalen Backups nach Abschluss des Vorgangs gelöscht werden.

Sollen die Backups per E-Mail versendet bzw. per FTPS hochgeladen werden, so sollte natürlich auch der passende E-Mail-Absender und Empfänger sowie ggf. die FTPS-Zugangsdaten eingetragen werden.

Geschützter Bereich

Dieser Inhalt ist passwortgeschützt. Bitte gebe dein Passwort ein um den Inhalt freizuschalten.

Hier findet Ihr die Lite-Version des PHP-Scripts welches (nur) Datenbankbackups erlaubt die per E-Mail versendet werden:

<?php
//Datenbankzugangsdaten
$dbhost = 'localhost';
$dbuser = 'user';
$dbpassword = 'passwort'; //wird auch zur AES-Verschlüsselung verwendet
$dbname = 'datenbankname';
//Datenbankzugangsdaten aus WordPress übernehmen - 1 ja 0 nein?
$wordpress = 0;
//Datenbankzugangsdaten aus Gambio übernehmen - 1 ja 0 nein?
$gambio = 0;
//Dateien sichern
$filebackup = 0; //NICHT ENTHALTEN IN DER ÖFFENTLICHEN VERSION
//Mail oder FTP-Backup ein- oder ausschalten mit 1 bzw. 0
$mailbackup = 0; //kein filebackup per E-Mail
$ftpbackup = 0; //datenbank - FILEBACKUP NICHT ENTHALTEN IN DIESER VERSION
//Lokale Backups nach Abschluss löschen?
$deletefiles = 0;
//E-Mail-Daten:
$absender = '[email protected]';
$empfanger = '[email protected]';
//Remote-FTP-Zugangsdaten:
$host = 'ftp.example.com';
$port = '21';
$user = 'user';
$pass = 'password';

//Wordpress-Datenbank Zugangsdaten auslesen
if ($wordpress==1){
include 'wp-config.php';
$dbname = DB_NAME;
$dbuser = DB_USER;
$dbpassword = DB_PASSWORD;
$dbhost = DB_HOST;	
}

//Gambio-Datenbank Zugangsdaten auslesen
if ($gambio==1){
include './includes/configure.php';
$dbname = DB_DATABASE;
$dbuser = DB_SERVER_USERNAME;
$dbpassword = DB_SERVER_PASSWORD;
$dbhost = DB_SERVER;	
}


//Nicht bearbeiten
$dumpfile = "backups/" . $dbname . "_" . date("Y-m-d_H-i-s") . ".sql";
$dumpfilezip = "backups/" . $dbname . "_" . date("Y-m-d_H-i-s") . ".zip";
echo base64_decode('cG93ZXJlZCBieSB3d3cubGF1dGVuYmFjaGVyLmlv') . '</br>';
echo 'Start Backup';
echo '</br>';
exec("mysqldump --user=$dbuser --password=$dbpassword --host=$dbhost $dbname > $dumpfile");

$zip = new ZipArchive();
if ($zip->open($dumpfilezip, ZipArchive::CREATE) === TRUE) {
    $zip->setPassword($dbpassword);
    $zip->addFile($dumpfile);
    $zip->setEncryptionName($dumpfile, ZipArchive::EM_AES_256);
    $zip->close();
    echo 'AES encrypted</br>';
} else {
    echo 'Error</br>';
}
unlink($dumpfile);

echo 'Backup completed </br> ';

function mail_att($to, $from, $subject, $message, $file) {
 $mime_boundary = "-----=" . md5(uniqid(rand(), 1));
 
 $header = "From: ".$from."\r\n";
 $header.= "MIME-Version: 1.0\r\n";
 $header.= "Content-Type: multipart/mixed;\r\n";
 $header.= " boundary=\"".$mime_boundary."\"\r\n";
 $content = "This is a multi-part message in MIME format.\r\n\r\n";
 $content.= "--".$mime_boundary."\r\n";
 $content.= "Content-Type: text/plain charset=\"iso-8859-1\"\r\n";
 $content.= "Content-Transfer-Encoding: 7bit\r\n\r\n";
 $content.= $message."\r\n"; 
 $name = basename($file);
 $data = chunk_split(base64_encode(file_get_contents($file)));
 $len = filesize($file);
 $content.= "--".$mime_boundary."\r\n";
 $content.= "Content-Disposition: attachment;\r\n";
 $content.= "\tfilename=\"$name\";\r\n";
 $content.= "Content-Length: .$len;\r\n";
 $content.= "Content-Type: application/x-gzip; name=\"".$file."\"\r\n";
 $content.= "Content-Transfer-Encoding: base64\r\n\r\n";
 $content.= $data."\r\n"; 
 return mail($to, $subject, $content, $header);
}  

if ($mailbackup == 1) {
mail_att($empfanger, $absender, "Backup ".$dumpfilezip, "Backup wurde erfolgreich erstellt und befindet sich im Anhang", $dumpfilezip);
}


if ($deletefiles==1){
unlink($dumpfilezip);	
	 echo 'Deleted DB Backup</br>';
}	
?>

3. Shellscript für sehr große Datenbanken

Zunächst müssen wir einen passenden Datenbankbenutzer für die Backups anlegen.

Anschließend bereiten wir den möglichst reibungslosen Datentransfer per scp vor indem wir das StrictHostKeyChecking für den Zielserver deaktivieren.

nano /etc/ssh/ssh_config
Host backup.example.com
StrictHostKeyChecking no

Anschließend bereiten wir alles für das Shellscript vor. Im Einzelnen benötigen wir noch die Tools 7zip, sshpass und lftp.

apt-get install -y p7zip-full
apt-get -y install sshpass
apt-get -y install lftp
touch /root/backup.sh
chmod 777 /root/backup.sh
mkdir /root/db/

Nachdem das nachfolgende Shellscript hinterlegt wurde fügen wir mit

crontab -e

einen neuen Cronjob hinzu

1 * * * * /root/backup.sh > /dev/null 2>&1

In das Shellscript selbst fügen wir mit

nano /root/backup.sh

den folgenden Inhalt ein:

Geschützter Bereich

Dieser Inhalt ist passwortgeschützt. Bitte gebe dein Passwort ein um den Inhalt freizuschalten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.