====== 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:
{{:pfsense_group_backups.png|}}
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