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.

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:
- En "Backups and Reboot", seleccione la opción "Setup remote repository"
- 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()