Automatisiertes Backup einer FortiGate

Wer kenn das nicht, Konfiguration einer Firewall schnell mal geändert, getestet ob alles funktioniert und dann vergessen die aktuelle Konfiguration zu sichern.

"Zu sichern" heißt in einem solchen Fall die Konfiguration des Gerätes / der Firewall / der FortiGate nicht nur auf dem Gerät an selbst zu speichern sondern diese auch außerhalb des Gerätes abzulegen, falls man mal in die Verlegenheit kommt schnell ein Ersatzgerät zum laufen bringen zu müssen oder auf einen älteren Konfiguratinsstand zurück zu springen (ja ich weiß, FortiGates bringen die Revisionen mit ;-)). Und außerdem, alles was man mehr als dreimal händisch machen muss kann man auch automatisieren.

Das Ganze habe ich auch schon mal für den Ubiquiti Unifi CloudKey gemacht: Backup der Konfiguration eines UniFi CloudKeys. Also warum nicht auch für eine FortiGate.

Vorbereiten der FortiGate

Über den CLI-Befehl show full-confugration kann die aktuelle Konfiguration einer FortiGate angezeigt werden, allerdings nur \"seitenweise\". Das muss zunächst abgestellt werden und anschließend brauchen wir einen SSH-Key des Backupbenutzers auf der FortiGate. In der Vorbereitenden Konfiguration wird zwischen FortiGates mit und ohne VirtualDomains unterschieden. Also schnell das CLI über die Weboberfläche öffnen oder via SSH auf der FortiGate einloggen.

FortiGates mit VirtualDomains

config global
    config system console
        set output standard
    end
end

config global
    config system admin
        edit admin
            set ssh-public-key1 "ssh-rsa ..."
        end
    end
end

FortiGates ohne VirtualDomains

config system console
    set output standard
end

config system admin
     edit admin
        set ssh-public-key1 "ssh-rsa ..."
       end
    end
end

Ein Skript zum Sichern

Das Shellskript zum sichern der Konfiguration der FortiGate sieht wie folgt aus:

#!/bin/sh

set_config () {
  if [ -r /etc/fgt-backup.cfg ]; then
    # Check if configuration is found in /etc.
    #If yes set configvar
    BACKUPCFG=/etc/fgt-backup.cfg
  elif [ -r ~/.fgt-backup.cfg ]; then
    # If config is found in the backupuser home directory
    # set it into the configvar
    BACKUPCFG=~/.fgt-backup.cfg
  else
    echo "No configuration file is found, please create one" \
    | /usr/bin/logger -s -i -t "FortiGate-Backup"
  exit 1
  fi
}

run_backup () {
  TIMESTAMP=$( date +%Y%m%d%H%M%S)
  for DEVICE in $TRGTS; do
    ssh -i $SSH_KEY $TRGT_USER@$DEVICE 'show full-configuration' \
    > $TRGT_DIR/$DEVICE-$TIMESTAMP.conf
  done
}

check_preq () {
    if [ -d $TRGT_DIR ]; then
        RUN=TRUE
    else
        mkdir $TRGT_DIR
    fi
}

main () {
    set_config
    source $BACKUPCFG
    check_preq
    run_backup
}
main

Der Einfachheit halber wird das Skript unter /usr/local/bin mit dem Namen fgt-backup.sh gespeichert. Das Skript benötigt noch eine Konfigurationsdatei die unter /etc/ oder als versteckte Datei im Benutzerverzeichnis abgelegt werden kann und auf den Namen fgt-backup.cfg hört.

#!/bin/sh

SSH_KEY="/PATH/TO/id_rsa"
TRGT_USER=your_admin_user
TRGTS="FQDN or IP"
TRGT_DIR="/tmp/fgt-backup"

Wenn mehrere FortiGates zu sichern sind und alle den selben Benutzer (mit Adminrechten) inkl. des selben SSH-Keys haben kann auch eine Freichzeichen getrennte Liste von FortiGates in TRGTS="... ..." angegeben werden.

Wie funktioniert das ganze jetzt?

Zunächst wird die Konfigurationsdatei gesucht und eingebunden, anschließend geschaut ob das Zeilverzeichnis da ist und im dritten Schritt wird eine SSH-Verbindung zur FortiGate aufgebaut und die gesamte Konfiguration ausgegeben. Da die Ausgabe auf der Standardausgabe des lokalen Rechners erfolgt, wird diese dann auch gleich in die Zieldatei geschrieben.

In gängigen Backup-Lösungen kann dieses Skript eingebunden werden und vor der eigentlichen Sicherung ausgeführt werden. Damit kann man dann eine regelmäßige Sicherung der Konfiguration der FortiGate im Rahmen des jeweiligen Sicherungskonzeptes sicherstellen.

Viel Spaß damit.