• BLOG

  • Comment faire des backups (FR)

    Sat 25 June 2016 Dan Lousqui

    Share on: Twitter - Facebook - Google+

    Hier, j'ai vu ce tweet :

    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 !"
    
  • Comments