Backup par FTP et archive cryptée
backup ftp openssl tar
Cette page présente un petit script home made pour sauvegarder une liste de répertoires/fichiers dans une archive cryptée et uploader le tout sur un serveur ftp.
Pour éviter d'utiliser un client ftp, j'utilise perl pour uploader le fichier. De fait, il faut modifier les chemins de répertoire directement dans le code perl. Comme le mot de passe de mysql et de chiffrement est mis en clair en paramètres, c'est plutot une bonne idée des réduires les permissions sur le script au seul utilisateur root :
-rwx------ 1 root root 2312 2007-02-20 20:52 backup.sh
Le PWDDEST est le répertoire de stockage temporaire de l'archive, vous pouvez mettre /tmp ou n'importe quoi d'autre. Enfin, LISTFILETOARCHIVE contient les répertoires et les fichiers à sauvegarder. Listez les sans sauter de lignes et en laissant juste un espace entre les entrées.
Les packages tar, bzip, openssl et cowsay (pour le trip) doivent être installés.
Je le répète, pensez bien à modifier la section perl en majuscule pour l'upload de l'archive ! Vous pouvez aussi faire des replace directement sur ADRESSE_FTP_DISTANT, USER, MOTDEPASSE et REPERTOIRE_DE_DESTINATION.
#! /bin/sh ########VARIABLES########### MYSQLPW=Sup3rmOtd3p4ss3d3l4m0rT PWDDEST=/root LISTFILETOARCHIVE='/etc/postfix /etc/bind /etc/apache2 /etc/vsftpd.conf /etc/mysql /priv/Authority /pub/www/wiki/data' ############################ ############################################# # # dump the databases # mysqldump --all-databases -u root --password=$MYSQLPW > $PWDDEST/`hostname`-`date +%Y%m%d`.sql if [ $? != 0 ] then cowsay "ERREUR LORS DE L'EXECUTION DU SCRIPT DE BACKUP : dump de mysql" | mail -s 'BACKUP ERROR REPORT' root exit 1 fi ############################################# # # make an archive # tar -cjvf $PWDDEST/`hostname`-`date +%Y%m%d`.tar.bz $PWDDEST/`hostname`-`date +%Y%m%d`.sql $LISTFILETOARCHIVE if [ $? != 0 ] then cowsay "ERREUR LORS DE L'EXECUTION DU SCRIPT DE BACKUP : creation de l'archive avec tar" | mail -s 'BACKUP ERROR REPORT' root exit 1 fi ############################################# # # cipher the archive, to decipher use "-d" # openssl aes-256-ecb -e -a -salt -in $PWDDEST/`hostname`-`date +%Y%m%d`.tar.bz -out $PWDDEST/`hostname`-`date +%Y%m%d`.tar.bz.ciphered -pass pass:$MYSQLPW if [ $? != 0 ] then cowsay "ERREUR LORS DE L'EXECUTION DU SCRIPT DE BACKUP : chiffrement openssl du fichier de backup" | mail -s 'BACKUP ERROR REPORT' root exit 1 fi ############################################# # # send via ftp # # Note that perl command line cannot use env # variables. Then, the ftp parameters have to # be set statically in the following commands # cd $PWDDEST echo -en `hostname`-`date +%Y%m%d`.tar.bz.ciphered > /tmp/backupfilename perl -e ' use Net::FTP; $ftp = Net::FTP->new("ADRESSE_FTP_DISTANT", Debug=>0) or die "Cannot connect to ADRESSE_FTP_DISTANT: $@"; $ftp->login("USER","MOTDEPASSE") or die "Cannot login ", $ftp->message; $ftp->cwd("REPERTOIRE_DE_DESTINATION") or die "Cannot change working directory ", $ftp->message; $ftp->put(`cat /tmp/backupfilename`) or die "put failed", $ftp->message; $ftp->quit; ' if [ $? != 0 ] then cowsay "ERREUR LORS DE L'EXECUTION DU SCRIPT DE BACKUP : envoi vers le ftp" | mail -s 'BACKUP ERROR REPORT' root exit 1 fi ############################################# # # remove local files # rm -f $PWDDEST/`hostname`-`date +%Y%m%d`.* rm -f /tmp/backupfilename
Et pour déchiffrer ?
Dans le répertoire de destination de l'archive, je conserve le script suivant, pret à l'emploi si je dois déchiffrer une archive:
#! /bin/bash if [ -z $2 ] then echo "usage: sh decrypt.sh <ciphered_file> <output_unciphered_file>" else openssl aes-256-ecb -d -a -in $1 -out $2 fi