Sauvegarde d'un serveur pfsense avec BackupPC

Un des gros points forts de pfsense est de pouvoir être entièrement re-configuré via le fichier de configuration xml que l'on peut télécharger depuis l'interface web. Ce how-to a pour but d'expliquer comment automatiser cette sauvegarde à l'aide de BackupPC (déjà pour que ça soit automatique bien sûre, mais grâce au mode historique de BackupPC, on peut suivre facilement les modification de configurations).

Sur Pfsense

Il faut d'abord créer un groupe d'utilisateurs nommé par exemple backups, qui n'a accès qu'à la page de sauvegardes:

Puis il faut créer un utilisateur (par exemple backuppc) membre de ce groupe, avec un mot de passe solide. Dans cet exemple, on lui mettra comme mot de passe secret

Sur BackupPC

Sur le serveur BackupPC, on va créer un répertoire pour y mettre des scripts, et un répertoire pour y télécharger la configuration de pfsense:

mkdir -p /var/lib/BackupPC/{bin,pfsense} chown :backuppc /var/lib/BackupPC/pfsense chmod 770 /var/lib/BackupPC/pfsense

Puis on écrit le script qui sera utilisé en pre/post dump:

cat <<'EOF' > /var/lib/BackupPC/bin/pfsense.sh #!/bin/bash -e OUT='/var/lib/BackupPC/pfsense' TMP=$(mktemp -d) URL='https://pfsense.domain.tld' LOGIN='backuppc' PASS='p@ssw0rd' # Save cookie and CSRF for the login form CSRF1=$(/usr/bin/wget -qO- --keep-session-cookies --save-cookies $TMP/cookies.txt --no-check-certificate $URL/diag_backup.php \ | grep "name='__csrf_magic'" \ | /usr/bin/perl -pe 's/.*value="(sid:[\da-z]+,[\d,a-z]+).*/$1/') # Submit the login form with the previous values, and save a new CSRF token CSRF2=$(/usr/bin/wget -qO- --keep-session-cookies --load-cookies $TMP/cookies.txt --save-cookies $TMP/cookies.txt --no-check-certificate \ --post-data "login=Login&usernamefld=$LOGIN&passwordfld=$PASS&__csrf_magic=$CSRF1" $URL/diag_backup.php \ | grep "csrfMagicToken" \ | /usr/bin/perl -pe 's/.*var\scsrfMagicToken\s=\s"(sid:[\da-z]+,[\d,a-z]+).*/$1/') # Save only the config, and retrieve a 3rd CSRF token /usr/bin/wget -q --keep-session-cookies --load-cookies $TMP/cookies.txt --save-cookies $TMP/cookies.txt --no-check-certificate \ --post-data "download=Download%20configuration%20as%20XML&donotbackuprrd=yes&__csrf_magic=$CSRF2" $URL/diag_backup.php -O $OUT/config-pfsense.xml \ rm -f $TMP/*.txt rmdir $TMP EOF chown :backuppc /var/lib/BackupPC/bin/pfsense.sh chmod 750 /var/lib/BackupPC/bin/pfsense.sh

Et voilà, il ne reste plus qu'à ajouter un hôte à sauvegarder dans BackupPC, qui ressemblera à ça:

$Conf{ClientNameAlias} = 'localhost'; $Conf{DumpPreUserCmd} = '/var/lib/BackupPC/bin/pfsense.sh'; $Conf{PingCmd} = '$pingPath -c 1 -w 3 pfsense.domain.tld'; $Conf{UserCmdCheckStatus} = 1; $Conf{RsyncClientCmd} = '$rsyncPath $argList+'; $Conf{RsyncClientRestoreCmd} = '$rsyncPath $argList+'; $Conf{RsyncShareName} = [ '/var/lib/BackupPC/pfsense' ]; $Conf{XferMethod} = 'rsync'; $Conf{XferLogLevel} = 6;
Pour un serveur OPNSense, le principe est le même, mais le script est légèrement différent: #!/bin/bash -e OUT='/var/lib/BackupPC/pfsense' TMP=$(mktemp -d) URL='https://pfsense.domain.tld' LOGIN='backuppc' PASS='p@ssw0rd' # Submit the login form with the previous values, and save a new CSRF token /usr/bin/wget -q -O /dev/null --keep-session-cookies --save-cookies $TMP/cookies.txt --no-check-certificate \ --post-data "login=Login&usernamefld=$LOGIN&passwordfld=$PASS" $URL/diag_backup.php # Save only the config /usr/bin/wget -q --keep-session-cookies --load-cookies $TMP/cookies.txt --save-cookies $TMP/cookies.txt --no-check-certificate \ --post-data "download=Download%20Configuration&donotbackuprrd=yes" $URL/diag_backup.php -O $OUT/config-pfsense.xml \ rm -f $TMP/*.txt rmdir $TMP