sábado, 7 de junio de 2014

Una simple forma de tener backups encriptados

Hace unos días tuve un pequeño incidente con mi laptop que me hizo re pensar la forma en que hago backup a los archivos mas importantes que tengo en la misma. El incidente fue muy sencillo, de la noche a la mañana el teclado dejó de funcionar... por lo tanto decidí que debo cambiarla de una vez por todas, pero mientras lo hago debo tener backups de mis archivos en caso de que muera sorpresivamente.

El mecanismo va a estar compuesto por dos scripts, uno que hace efectivamente el backup, lo comprime, lo cifra y lo guarda en algún lugar y otro que es capaz de realizar la operación inversa para obtener los archivos deseados.

Script de backup

El script es el siguiente

#!/bin/bash

#Directorio donde se almacenan los backups
BACKUPS_DIR=/home/juan/backups/
#Nombre del archivo resultado del backup
SALIDA=backup_`date +%d_%m_%Y`.txt
#Archivo temporal
BKP_TMP=bkp

#Lista de los directorios a respaldar, un directorio/archivo por linea
DIRECTORIOS="/home/juan/cosas \
/home/juan/Scripts"

#Empaquetado y compresion
tar -cjvf $BKP_TMP $DIRECTORIOS
#Cifrado del backup con AES
openssl enc -e -aes-256-cbc -in $BKP_TMP -out $SALIDA -a
#Elimino el archivo temporal
rm $BKP_TMP
#Movimiento del backup a un lugar específico
mv $SALIDA $BACKUPS_DIR

es bastante sencillo y está autocomentado. En esencia toma una lista de directorios y/o archivos, los empaqueta y comprime con tar para luego cifrarlos usando AES-256 con OpenSSL. Por último mueve el archivo generado a un directorio que podría (debería de hecho) estar por NFS montado desde un lugar remoto.

Hay una opción interesante en la linea de cifrado y es la opción "-a", esta le indica a OpenSSl que luego de cifrar el archivo lo codifique en Base64 por lo tanto vamos a terminar con un archivo lleno de caracteres imprimibles ASCII, archivo que incluso podríamos mandar por mail sin problemas. Ejemplo:


juan@moon:~$ file backups/backup_07_06_2014.txt 
backups/backup_07_06_2014.txt: ASCII text
juan@moon:~$ head -5 backups/backup_07_06_2014.txt 
U2FsdGVkX19MkkXun9GG1psdETXgurINgFQ74plHh6GbgRe8pkdOyxHm2/ycxohn
pIf8YOXlNCteuGJGAEqqnnr4tykNqMsEdfzBRVklUqFcRBWn9aIifdPwbKtG0eT3
a2npSoFawKLGHn17MT+/kW5RkcDixdEQfZu2AuE3K3rEYOUdJCheqiP+VuFFOGQr
vGtv8pTaTcsNEGUilhQ+gm/4jBx0TnUluMWLswtatEuhgmjssqwcuskGbebZ2C/l
bWD9OlRczkodiNI6XxlfSTQomDmuMj5w98EJNxbLFmTolQIupO1HJu7dXa5a6957
juan@moon:~$ 

Ni mas ni menos que un simple archivo de texto.


Script de recuperación de backups

Este script completa el circuito del procedimiento de backups y es el que nos permitirá recuperar la información. El script se llama recuperar_backup.sh.

#!/bin/bash

#Directorio donde se almacenan los backups
BACKUPS_DIR=/home/juan/backups/

echo "Ingrese el nombre del archivo: "
read ARCHIVO

if [ -f $BACKUPS_DIR$ARCHIVO ];
then
        mkdir $BACKUPS_DIR/TMP
        #Decifrar el archivo en un directorio temporal
        openssl enc -d -aes-256-cbc -in $BACKUPS_DIR/$ARCHIVO -out $BACKUPS_DIR/TMP/$ARCHIVO -a
        if [ $? == 0 ];
        then
                cd $BACKUPS_DIR/TMP/
                tar -xvf $ARCHIVO
        else
                echo "Password incorrecto"
        fi
else
        echo "$ARCHIVO no existe."
fi

Como pueden ver es muy sencillo, espera el nombre del archivo a recuperar, luego unas pocas validaciones y por último decifrar el archivo con OpenSSL. Los datos son descomprimidos y desempaquetedos dentro de un directorio llamado TMP, allí podremos ver nuestros archivos.