TroutTrout

Sauvegarde du système

Le Security Hub vous permet de sauvegarder l'intégralité de la configuration système, en capturant tous les paramètres, règles et politiques dans une archive horodatée. Ces sauvegardes constituent un point de restauration fiable

3 min read · Last updated 2026-04-22

21 janvier 2026

Security Hub vous permet de sauvegarder l'intégralité de la configuration du système, en capturant tous les paramètres, règles et politiques dans une archive horodatée. Ces sauvegardes constituent un point de récupération fiable, vous permettant de restaurer le système dans un état stable et connu en cas de mauvaise configuration, de défaillance ou d'incident de sécurité. Grâce aux instantanés versionnés, vous pouvez rapidement revenir à une configuration précédente, minimisant ainsi les interruptions de service et maintenant la continuité opérationnelle.

Création d'une sauvegarde locale

Dans le menu des paramètres, l'onglet « Sauvegardes et redémarrage » crée simplement un fichier de sauvegarde local, qui constitue un point de récupération dans le temps, par exemple pour annuler une modification de configuration.

Création d'une sauvegarde locale
Création d'une sauvegarde locale

Écran de confirmation de sauvegarde

Création d'une sauvegarde distante

À des fins de reprise après sinistre, il peut être utile de stocker les sauvegardes en dehors de l'appareil. Access Gate propose une option HTTP simple à configurer et sécurisée pour ce faire :

  1. Dans « Sauvegardes et redémarrage », choisissez l'option « Configurer un dépôt distant »
  2. Saisissez l'adresse que le système utilisera pour enregistrer les sauvegardes, ainsi qu'un mot de passe de chiffrement

Le protocole serveur est très simple : il doit accepter une requête POST pour stocker une sauvegarde, et une requête GET pour en télécharger une.

À titre d'exemple, le code Python suivant illustre un serveur minimal :

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