Cifrar backup de mysql con gpg y enviarlo a la nube

From zerutek.com
Jump to: navigation, search

Template:Borrador

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

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

http://www.busybox.net/

https://github.com/andreafabrizi/Dropbox-Uploader

http://www.gnupg.org/

http://www.mysql.com/

Template:Borrador

[[Category:Linux]]
[[Category:Seguridad]]
[[Category:Recordatorio]]