Cifrar backup de mysql con gpg y enviarlo a la nube
RECORDATORIO
Esto es el típico recordatorio, una anotación en un papel que siempre extravías.
Fuera de su contexto puede no tener ningún sentido.
10/11/2014
Contents
Cifrar backup de mysql con gpg y enviarlo "a la nube"
Si dispones de un hosting barato, con acceso a un ssh mínimo, y necesitas hacer backups, en algún servicio "en la nube", ésta es tu receta.
No esperes nada excesivamente elaborado, pero descuida que en mi caso me funciona. Todo lo necesario se coloca dentro del directorio ~/bin/ del usuario.
Herramientas utilizadas
- Dropbox-Uploader - Un script para utilizar la API de Dropbox desde una shell
- busybox - Nos proporciona todo lo necesario, y que no nos lo proporciona el hosting que tengamos
- gnupg - El software de cifrado.
- mysql - La base de datos utilizada.
Instalando busybox
Busybox nos proporciona en un único binario todas las utilidades que necesitemos para nuestras tareas.
- Miramos la versión que necesitamos, consultando por el kernel que utilice nuestro hosting:
$ uname -a Linux hosting1.zerutek.com 2.6.32.59-sg3 #9 SMP Wed Sep 26 03:29:25 CET 2012 x86_64 x86_64 x86_64 GNU/Linux
- Descargamos la versión de 64 bits:
cd ~/bin wget http://www.busybox.net/downloads/binaries/latest/busybox-x86_64 chmod +x ~/bin/busybox-x86_64
Instalando Dropbox-Uploader
Un script en bash que nos da acceso al API oficial de dropbox
- Descargamos el script:
cd ~/bin git clone https://github.com/andreafabrizi/Dropbox-Uploader/ ln -s ~/bin/Dropbox-Uploader/dropbox_uploader.sh ~/bin/ chmod +x ~/bin/Dropbox-Uploader/dropbox_uploader.sh
- Generamos en ~/bin/ los enlaces simbólicos a busybox necesarios para el funcionamiento del mismo. Según la cuenta shell que dispongamos, la lista puede ser mayor o menor. En nuestro caso hemos utilizado el método de prueba y error para saber qué necesitamos:
ln -s ~/bin/busybox-x86_64 ~/bin/dd ln -s ~/bin/busybox-x86_64 ~/bin/stat ln -s ~/bin/busybox-x86_64 ~/bin/readlink
Configuramos Dropbox-Uploader
La primera vez que ejecutamos dropbox_uploader.sh, éste nos muestra los pasos a seguir para configurar una cuenta de dropbox. Sólo hay que seguir las instrucciones que nos muestra para que todo funcione. Muestro la salida de dicho comando, por si pudiera servir de referencia:
$ dropbox_uploader.sh This is the first time you run this script. 1) Open the following URL in your Browser, and log in using your account: https://www2.dropbox.com/developers/apps 2) Click on "Create App", then select "Dropbox API app" 3) Select "Files and datastores" 4) Now go on with the configuration, choosing the app permissions and access restrictions to your DropBox folder 5) Enter the "App Name" that you prefer (e.g. MyUploader2329718129383) Now, click on the "Create App" button. When your new App is successfully created, please type the App Key, App Secret and the Permission type shown in the confirmation page: # App key: ab666hjgerd69x # App secret: x6v666hd2iozn1h # Permission type, App folder or Full Dropbox [a/f]: a > App key is ab666hjgerd69x, App secret is x6v666hd2iozn1h and Access level is App Folder. Looks ok? [y/n]: y > Token request... OK Please open the following URL in your browser, and allow Dropbox Uploader to access your DropBox folder: --> https://www2.dropbox.com/1/oauth/authorize?oauth_token=ziPAa9ZxuIREdsWa Press enter when done... > Access Token request... OK Setup completed!
gpg
Para el cifrado/descifrado de los backups vamos a utilizar gpg. Unas breves notas:
Creando una clave gpg
Seguro que se puede parametrizar en un único comando, pero vamos a utilizar el método que nos obliga a contestar a algunas preguntas:
$ gpg --gen-key gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? 2 DSA keys may be between 1024 and 3072 bits long. What keysize do you want? (2048) 3072 Requested keysize is 3072 bits Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0) Key does not expire at all Is this correct? (y/N) y You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form: "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" Real name: Zerutek.Com Email address: angeld@zerutek.punto.com Comment: Elimina el ".punto" You selected this USER-ID: "Zerutek.Com (Elimina el ".punto") <angeld@zerutek.punto.com>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O You need a Passphrase to protect your secret key. We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. gpg: WARNING: some OpenPGP programs can't handle a DSA key with this digest size +++++.+++++...+++++..++++++++++++++++++++..+++++.+++++.+++++.+++++.++++++++++.+++++..++++++++++.+++++.+++++..+++++.++++++++++.+++++.+++++++++++++++...+++++.+++++++++++++++++++++++++>+++++...++++++++++++++++++++..+++++...+++++++++++++++>+++++>...+++++...................................+++++ We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. ..+++++..++++++++++.+++++.++++++++++..+++++.++++++++++++++++++++++++++++++......+++++.+++++.++++++++++.+++++.+++++.+++++..+++++++++++++++......+++++.++++++++++++++++++++.+++++.+++++...+++++>.+++++++++++++++...++++++++++.+++++>+++++>....+++++>++++++++++^^^^ gpg: key FFBBFFBB marked as ultimately trusted public and secret key created and signed. gpg: checking the trustdb gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u pub 3072D/FFBBFFBB 2014-11-10 Key fingerprint = FFBB BBFF BBFF FFBB FFBB BBFF BBFF FFBB FFBB BBFF uid Zerutek.Com (Elimina el ".punto") <angeld@zerutek.punto.com> sub 3072g/66336633 2014-11-10
Exportamos la clave pública
gpg --export --armor FFBBFFBB -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.12 (GNU/Linux) mQSuBFRhHjgRDADnzrvPDGAZCbPRbNrbaWseMJUIvvPiCe2TmLcXlQaejooxSjou ss/M/b+SzEFUBhcj/z34II2x1roZv7qjp8iozI01tdal2BQjmkq8lqU9Z1rDCnEm . . . . . . . . . . . . yspJbzwtQEtoN2WlhKvrTHE/gnH5eLHenSN9OgEAu/8lLyM3+3htdvqv9VDyPkMu 4rvxHjRpp1Wa1oDrVXo= =eo8H -----END PGP PUBLIC KEY BLOCK-----
Importamos la clave pública en el hosting
Si necesitamos importar la clave privada, el procedimiento es el mismo.
$cat FFBBFFBB.txt | gpg --import gpg: key FFBBFFBB: "Zerutek.Com (Elimina el ".punto") <angeld@zerutek.punto.com>" imported gpg: Total number processed: 1 gpg: imported: 1
Exportación de la clave privada
Si necesitamos exportar la clave privada, teniendo en cuenta que lo de "privado" es importante. :-)
$ gpg --export-secret-keys --armor 29AB4CDE -----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1.4.12 (GNU/Linux) mQSuBFRhEjgRDZDnzrvPDGZZCbPRbNrbaWsaMJUIvvPiCa2TmLcXlQaajuuxSjuu ss/M/b+SzEFUBhcj/z34II2x1ruZv7qjp4iuzI01tdal2BQjmkq4lqU9Z1rDCnEm . . . . . . . . . . . . yspJbzwtQEtuN2WlhKvrTEE/gnE5aLEanSN9OgEZu/4lLyM3+3htdvqv9VDyPkMu 4rvxEjRpp1Wa1uDrVXu= =au4E -----END PGP PRIVATE KEY BLOCK----
Proceso de backup
Vamos a explicar someramente los pasos que utilizamos para realizar y enviar el backup.
Backup de la BBDD
Extraemos y comprimimos el backup
/usr/bin/mysqldump -u USER --password=PASSWORD NOMBRE_DE_LA_BBDD -c | /bin/gzip -9 > MyBackup.sql
Cifrado del Backup
Ciframos el backup utilizando la clave privada importada previamente.
gpg --encrypt --trusted-key AAABBBAFFBBFFBB -r MyBackup.sql
- El parámetro --trusted-key nos permite cifrar el backup aunque la clave no esté firmada por una de confianza. Para utilizarlo hay que utilizar el indentificativo en "formato largo" de la clave, que se consigue con le comando:
gpg --list-keys --with-colon FFBBFFBB
"Subida" del backup a DropBox
Para lo que utilizaremos dropbox_uploader.sh ya configurado
dropbox_uploader.sh upload MyBackup.sql.asc /backup/MyBackup.sql.asc
Referencias
https://github.com/andreafabrizi/Dropbox-Uploader
[[Category:Linux]] [[Category:Seguridad]] [[Category:Recordatorio]]