TroutTrout

System-Backup

So sichern und stellen Sie Ihre Access Gate-Konfiguration wieder her.

2 min read · Last updated 2026-04-22

Security Hub ermöglicht es Ihnen, die gesamte Systemkonfiguration zu sichern und alle Einstellungen, Regeln und Richtlinien in einem zeitgestempelten Archiv zu erfassen. Diese Backups dienen als zuverlässiger Wiederherstellungspunkt und ermöglichen es Ihnen, das System bei Fehlkonfigurationen, Ausfällen oder Sicherheitsvorfällen in einen bekannten, stabilen Zustand zurückzuversetzen. Mit versionierten Snapshots können Sie schnell auf eine frühere Konfiguration zurückrollen, Ausfallzeiten minimieren und die Betriebskontinuität aufrechterhalten.

Lokales Backup erstellen

Im Einstellungsmenü erstellt die Registerkarte „Backups & Neustart" eine lokale Backup-Datei als Wiederherstellungspunkt zu einem bestimmten Zeitpunkt – beispielsweise um eine Konfigurationsänderung rückgängig zu machen.

Lokales Backup erstellen
Lokales Backup erstellen

Backup-Bestätigungsbildschirm

Remote-Backup erstellen

Für die Notfallwiederherstellung kann es sinnvoll sein, Backups außerhalb des Geräts zu speichern. Access Gate bietet hierfür eine einfach einzurichtende, aber sichere HTTP-Option:

  1. Wählen Sie unter „Backups und Neustart" die Option „Remote-Repository einrichten".
  2. Geben Sie die Adresse ein, unter der das System Backups speichern soll, sowie ein Verschlüsselungspasswort.

Das Serverprotokoll ist sehr einfach aufgebaut und muss eine POST-Anfrage zum Speichern eines Backups sowie eine GET-Anfrage zum Herunterladen akzeptieren.

Als Beispiel zeigt der folgende Python-Code einen minimalen Server:

from http.server import BaseHTTPRequestHandler, HTTPServer
import os
import urllib.parse
import shutil
import subprocess
import sys

class Handler(BaseHTTPRequestHandler):

    def read_body(self):
        length = self.headers.get("Content-Length")
        transfer_encoding = self.headers.get("Transfer-Encoding", "").lower()

        if length is not None:
            return self.rfile.read(int(length))

        elif "chunked" in transfer_encoding:
            body = b""
            while True:
                line = self.rfile.readline().strip()
                if not line:
                    break
                chunk_size = int(line, 16)
                if chunk_size == 0:
                    break
                chunk = self.rfile.read(chunk_size)
                body += chunk
                self.rfile.readline()
            return body

        else:
            return self.rfile.read()

    def do_POST(self):
        path = urllib.parse.unquote(self.path)
        parts = path.split("/", 1)

        if len(parts) != 2 or not parts[1]:
            self.send_response(400)
            self.end_headers()
            print("Missing filename in URL. Use /<filename>")
            return

        filename = parts[1]
        safe_filename = os.path.basename(filename)

        data = self.read_body()
        with open(safe_filename, "wb") as f:
            f.write(data)
        self.send_response(200)
        self.end_headers()
        print("Uploaded file ", len(data), "bytes")

    def do_GET(self):
        path = urllib.parse.unquote(self.path)
        parts = path.split("/", 1)
        if len(parts) != 2 or not parts[1]:
            self.send_response(400)
            self.end_headers()
            print("Missing filename in URL. Use /<filename>")
            return

        filename = parts[1]
        safe_filename = os.path.basename(filename)

        if safe_filename == "list":
            result = subprocess.run(
              ["sha1sum backup_*"],
               capture_output=True,
               text=True,
               shell=True
            )
            self.send_response(200)
            self.send_header("Content-type", "text/plain")
            self.end_headers()
            copy = result.stdout
            self.wfile.write(result.stdout.encode("utf-8"))
            print(copy)

        else:          
            f = open(safe_filename, 'rb')
            self.send_response(200)
            self.send_header("Content-type", "application/x-binary")
            fs = os.fstat(f.fileno())
            self.send_header("Content-Length", str(fs[6]))
            self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
            self.end_headers()
            shutil.copyfileobj(f, self.wfile)
            f.close()
            print("Downloaded file ", str(fs[6]), "bytes")

        return

if __name__ == "__main__":
    serverAddr = sys.argv[1]
    serverPort = sys.argv[2]
    print("Listening on http://",serverAddr,":",serverPort)
    HTTPServer((serverAddr, int(serverPort)), Handler).serve_forever()