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.