Comment faire des backups (FR)
sam. 25 juin 2016 Dan LousquiHier, j'ai vu ce tweet :
Tweet of sadserver/744902909939224576
Je me suis dit "ah, cette légende, comme quoi les backup c'est de la théorie, tout le monde en conseil, mais personne n'en fait !". Et ben non ! Moi, je fais des backups de mes serveurs / données, et de façon réfléchie, et testée ! Et je vais expliquer comment j'y procède.
Tout d'abord, déformation professionnelle oblige, je me suis demander "Où, et comment les stocker de façon sécurisée".
Environnement
Donc à ma disposition j'ai:
- mes serveurs à backuper
- On ne va pas backuper la dessus ...
- mes workstations avec lesquelles je travaille
- On pourrait backuper dessus, mais elles sont trop volatiles pour avoir quelque chose de solide
- un NAS à la maison, avec pas mal de capacité
- Je ne suis pas très à l'aise à ouvrir l'accès à mon NAS sur Internet, depuis des machines qui ne sont pas hébergées par moi
- des FTPs plus où moins de confiance pour héberger des fichiers
- Ils sont fait pour stocker du backup, par contre, je n'ai aucune confiance en qui y a accès, et il s'agit de FTP non chiffré
Du coup, la solution la "moins pire" de toute serait d'héberger les backups sur le service FTP. Cependant, pour palier au problème de confiance lié à ces services, il va falloir chiffrer les backups. Ainsi, le fait de passer par FTP non chiffré ne sera pas un problème, et si quelqu'un (le stagiaire de chez Online par exemple) récupère mon backup, il ne pourra les lire.
Chiffrement
Très bien ! On chiffre les backups ! Comment ? Avec quelle clé ? Où la stocker ? L'idée que j'ai eue est d'utiliser une clé de chiffrement symétrique "temporaire". Lors de la génération des backups, le serveur chiffre l'archive avec une clé temporaire, qu'on va appeler KEY_TMP. Avant de l'envoyer sur le FTP. /!\ Cette clé temporaire ne doit surtout pas être envoyée sur le FTP !!!
Ensuite que fait-on de cette clé temporaire ? On pourrait nous l'envoyer par mail. Mais en faisant ainsi, quelqu'un pouvant lire nos mail pourrait déchiffrer les backups... Il faut un mécanisme pour protéger cette clé temporaire ! Chiffrons là ! Pour cela, on va utiliser une clé partagée (KEY_SHARED). Il suffit de chiffrer KEY_TMP avec KEY_SHARED, on va appeler ce résultat KEY_PROTECTED. Ainsi, en s'envoyant KEY_PROTECTED par mail, personne ne pourra récupérer KEY_TMP sans KEY_SHARED.
KEY_SHARED sera stockée en clair sur le serveur (c'est un risque accepté, quelqu'un ayant accès à KEY_SHARED a accès aux backups), et de façon sécurisée sur nos workstations (via un gestionnaire de mot de passe comme KeePass exemple).
Pour l'envoie de la clé, d'autres variantes peuvent exister, comme l'envoie sur IRC, sur Slack, par SMS, ... (pratique si vous êtes en équipe par exemple).
Synthèse
- On backup.
- On chiffre les backups avec une clé temporaire sur le serveur.
- On upload le backup sur un FTP (ou glacier Amazon par ex.).
- On chiffre la clé temporaire avec une clé partagée entre moi et le serveur.
- On s'envoie la clé chiffrée par mail
- On supprime la clé temporaire du serveur
- On supprime le backup du serveur
Script
(Le script est placé dans /backup/backup.sh)
ftp_host="XXXX"
ftp_user="XXXX"
ftp_pass="XXXX"
email="XXXX@XXXX.XX"
KEY_SHARED="XXXXXXXXX"
cd /backup
echo "[+] Generating KEY_TMP ..."
dd if=/dev/urandom of=KEY_TMP.bin bs=1 count=255
base64 KEY_TMP.bin -w0 > KEY_TMP.b64
echo "[+] Generating KEY_TMP: OK !"
echo ""
echo "[+] Generating encfs partition ..."
mkdir backup_protected/ backup/
encfs --standard --stdinpass /backup/backup_protected/ /backup/backup/ < KEY_TMP.b64
echo "[+] Generating encfs partition: OK !"
echo ""
echo "[+] Backuping XXXX directory ..."
tar -czf backup/XXXX.tar.gz /XXXX
echo "[+] Backuping XXXX: OK !"
echo ""
echo "[+] Closing encfs ..."
fusermount -u /backup/backup
echo "[+] Closing encfs: OK !"
echo ""
echo "[+] Creating archive ..."
tar -czf backup.tar.gz /backup/backup_protected
echo "[+] Creating archive: OK !"
echo ""
echo "[+] Uploading archive ..."
ftp -n -p <<EOF
open $ftp_host
user $ftp_user $ftp_pass
put backup.tar.gz
EOF
rm backup.tar.gz
echo "[+] Uploading archive: OK !"
echo ""
echo "[+] Encrypt the key ..."
zip -P $KEY_SHARED KEY_PROTECTED.zip KEY_TMP.b64
rm KEY_TMP.b64
echo "[+] Encrypt the key: OK !"
echo ""
echo "[+] Sending the key ..."
echo "A Backup done. Key: '$(base64 KEY_PROTECTED.zip -w0)'" | mail -s "Your backup key" $email
echo "[+] Sending the key: OK !"
echo ""
echo "[+] Clearing temporaries ..."
rm -rf backup
rm -rf backup_protected
rm -rf KEY_TMP.b64.zip
rm -rf KEY_TMP.b64.tmp
echo "[+] Clearing temporaries: OK !"
echo ""
echo "[+] That's all done !"