TroutTrout

Copia de Seguridad del Sistema

Cómo hacer copias de seguridad y restaurar la configuración de tu Access Gate.

3 min read · Last updated 2026-04-22

21 de enero de 2026

Security Hub permite realizar una copia de seguridad de toda la configuración del sistema, capturando todos los ajustes, reglas y políticas en un archivo con marca de tiempo. Estas copias de seguridad constituyen un punto de recuperación fiable que permite restaurar el sistema a un estado conocido y estable en caso de configuración incorrecta, fallos o incidentes de seguridad. Con instantáneas versionadas, es posible revertir rápidamente a una configuración anterior, minimizando el tiempo de inactividad y manteniendo la continuidad operativa.

Creación de una copia de seguridad local

En el menú de configuración, la pestaña "Backups & Reboot" crea un archivo de copia de seguridad local que representa un punto en el tiempo para la recuperación, por ejemplo, para revertir un cambio de configuración.

Creación de una copia de seguridad local
Creación de una copia de seguridad local

Pantalla de confirmación de copia de seguridad

Creación de una copia de seguridad remota

Para fines de recuperación ante desastres, puede ser útil guardar las copias de seguridad fuera del dispositivo. Access Gate ofrece una opción HTTP sencilla de configurar y segura para hacerlo:

  1. En "Backups and Reboot", seleccione la opción "Setup remote repository"
  2. Introduzca la dirección que el sistema utilizará para guardar las copias de seguridad y una contraseña de cifrado

El protocolo del servidor es muy sencillo: debe aceptar una solicitud POST para almacenar una copia de seguridad y una solicitud GET para descargarla.

A modo de ejemplo, el siguiente código Python muestra un servidor mínimo:

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()