MariaDB
 sql >> Database >  >> RDS >> MariaDB

Come crittografare i tuoi backup MySQL e MariaDB

Di solito ci prendiamo cura delle cose che apprezziamo, che si tratti di uno smartphone costoso o dei server dell'azienda. I dati sono una delle risorse più importanti dell'organizzazione e, sebbene non li vediamo, devono essere protetti con cura. Implementiamo la crittografia dei dati inattivi per crittografare i file di database o interi volumi che contengono i nostri dati. Implementiamo la crittografia dei dati in transito utilizzando SSL per assicurarci che nessuno possa annusare e raccogliere i dati inviati attraverso le reti. I backup non sono diversi. Non importa se si tratta di un backup completo o incrementale, memorizzerà almeno una parte dei tuoi dati. Pertanto, anche i backup devono essere crittografati. In questo post del blog, esamineremo alcune opzioni che potresti avere quando si tratta di crittografare i backup. Per prima cosa, diamo un'occhiata a come puoi crittografare i tuoi backup e quali potrebbero essere i casi d'uso per questi metodi.

Come crittografare il backup?

Crittografa file locale

Prima di tutto, puoi crittografare facilmente i file esistenti. Immaginiamo di avere un processo di backup che archivia tutti i backup su un server di backup. Ad un certo punto hai deciso che era giunto il momento di implementare l'archiviazione di backup fuori sede per il ripristino di emergenza. Per questo puoi utilizzare S3 o un'infrastruttura simile di altri provider cloud. Ovviamente, non vuoi caricare backup non crittografati ovunque al di fuori della tua rete affidabile, quindi è fondamentale implementare la crittografia dei backup in un modo o nell'altro. Un metodo molto semplice, che non richiede modifiche agli script di backup esistenti, consiste nel creare uno script che prenderà un file di backup, lo crittograferà e lo caricherà su S3. Uno dei metodi che puoi utilizzare per crittografare i dati è utilizzare openssl:

openssl enc -aes-256-cbc -salt -in backup_file.tar.gz -out backup_file.tar.gz.enc -k yoursecretpassword

Questo creerà un nuovo file crittografato, "backup_file.tar.gz.enc" nella directory corrente. Puoi sempre decifrarlo in un secondo momento eseguendo:

openssl aes-256-cbc -d -in backup_file.tar.gz.enc -out backup_file.tar.gz -k yoursecretpassword

Questo metodo è molto semplice, ma presenta alcuni inconvenienti. Il più grande sono i requisiti di spazio su disco. Quando si crittografa come descritto sopra, è necessario mantenere sia il file non crittografato che quello crittografato e, di conseguenza, è necessario uno spazio su disco doppio rispetto alle dimensioni del file di backup. Naturalmente, a seconda delle tue esigenze, questo potrebbe essere qualcosa che desideri:mantenere i file non crittografati localmente migliorerà la velocità di ripristino, dopo che anche la decrittografia dei dati richiederà del tempo.

Crittografa il backup al volo

Per evitare la necessità di archiviare dati crittografati e non crittografati, potresti voler implementare la crittografia nella fase precedente del processo di backup. Possiamo farlo attraverso i tubi. Le pipe sono, in breve, un modo per inviare i dati da un comando all'altro. Ciò consente di creare una catena di comandi che elabora i dati. Puoi generare i dati, quindi comprimerli e crittografarli. Un esempio di tale catena potrebbe essere:

mysqldump --all-databases --single-transaction --triggers --routines | gzip | openssl  enc -aes-256-cbc -k mypass > backup.xb.enc

Puoi anche usare questo metodo con xtrabackup o mariabackup. In effetti, questo è l'esempio della documentazione di MariaDB:

mariabackup --user=root --backup --stream=xbstream  | openssl  enc -aes-256-cbc -k mypass > backup.xb.enc

Se lo desideri, puoi anche provare a caricare i dati come parte del processo:

mysqldump --all-databases --single-transaction --triggers --routines | gzip | openssl  enc -aes-256-cbc -k mysecretpassword | tee -a mysqldump.gz.enc | nc 10.0.0.102 9991

Di conseguenza, vedrai un file locale "mysqldump.gz.enc" e una copia dei dati verrà inviata a un programma che farà qualcosa al riguardo. Abbiamo usato 'nc', che trasmetteva i dati a un altro host su cui è stato eseguito quanto segue:

nc -l 9991 > backup.gz.enc

In questo esempio abbiamo usato mysqldump e nc ma puoi usare xtrabackup o mariabackup e alcuni strumenti che caricheranno lo stream su Amazon S3, Google Cloud Storage o qualche altro provider cloud. Qualsiasi programma o script che accetta dati su stdin può essere utilizzato al posto di 'nc'.

Utilizza la crittografia incorporata

In alcuni casi, uno strumento di backup ha incorporato il supporto per la crittografia. Un esempio qui è xtrabackup, che può crittografare internamente il file. Sfortunatamente, mariabackup, anche se è un fork di xtrabackup, non supporta questa funzione.

Prima di poterlo utilizzare, dobbiamo creare una chiave che verrà utilizzata per crittografare i dati. Può essere fatto eseguendo il seguente comando:

[email protected]:~# openssl rand -base64 24
HnliYiaRo7NUvc1dbtBMvt4rt1Fhunjb

Xtrabackup può accettare la chiave in formato testo normale (usando l'opzione --encrypt-key) o può leggerla da file (usando l'opzione --encrypt-key-file). Quest'ultimo è più sicuro poiché il passaggio di password e chiavi come testo normale ai comandi comporta la loro memorizzazione nella cronologia di bash. Puoi anche vederlo chiaramente nell'elenco dei processi in esecuzione, il che è piuttosto negativo:

root      1130  0.0  0.6  65508  4988 ?        Ss   00:46   0:00 /usr/sbin/sshd -D
root     13826  0.0  0.8  93100  6648 ?        Ss   01:26   0:00  \_ sshd: [email protected]
root     25363  0.0  0.8  92796  6700 ?        Ss   08:54   0:00  \_ sshd: vagrant [priv]
vagrant  25393  0.0  0.6  93072  4936 ?        S    08:54   0:01  |   \_ sshd: [email protected]/1
vagrant  25394  0.0  0.4  21196  3488 pts/1    Ss   08:54   0:00  |       \_ -bash
root     25402  0.0  0.4  52700  3568 pts/1    S    08:54   0:00  |           \_ sudo su -
root     25403  0.0  0.4  52284  3264 pts/1    S    08:54   0:00  |               \_ su -
root     25404  0.0  0.4  21196  3536 pts/1    S    08:54   0:00  |                   \_ -su
root     26686  6.0  4.0 570008 30980 pts/1    Sl+  09:48   0:00  |                       \_ innobackupex --encrypt=AES256 --encrypt-key=TzIZ7g+WzLt0PXWf8WDPf/sjIt7UzCKw /backup/

Idealmente, utilizzerai la chiave memorizzata in un file, ma poi c'è un piccolo problema di cui devi essere a conoscenza.

[email protected]:~# openssl rand -base64 24 > encrypt.key
[email protected]:~# innobackupex --encrypt=AES256 --encrypt-key-file=/root/encrypt.key /backup/
.
.
.
xtrabackup: using O_DIRECT
InnoDB: Number of pools: 1
encryption: unable to set libgcrypt cipher key - User defined source 1 : Invalid key length
encrypt: failed to create worker threads.
Error: failed to initialize datasink.

Potresti chiederti qual è il problema. Diventerà chiaro quando apriremo il file encrypt.key in un editor esadecimale come hexedit:

00000000   6D 6B 2B 4B  66 69 55 4E  5A 49 48 77  39 42 36 72  68 70 39 79  6A 56 44 72  47 61 79 45  6F 75 6D 70  0A                                     mk+KfiUNZIHw9B6rhp9yjVDrGayEoump.

Ora puoi notare l'ultimo carattere codificato usando "0A". Questo è fondamentalmente il carattere di avanzamento riga, ma viene preso in considerazione durante la valutazione della chiave di crittografia. Una volta rimosso, possiamo finalmente eseguire il backup.

[email protected]:~# innobackupex --encrypt=AES256 --encrypt-key-file=/root/encrypt.key /backup/
xtrabackup: recognized server arguments: --datadir=/var/lib/mysql --innodb_buffer_pool_size=185M --innodb_flush_log_at_trx_commit=2 --innodb_file_per_table=1 --innodb_data_file_path=ibdata1:100M:autoextend --innodb_read_io_threads=4 --innodb_write_io_threads=4 --innodb_doublewrite=1 --innodb_log_file_size=64M --innodb_log_buffer_size=16M --innodb_log_files_in_group=2 --innodb_flush_method=O_DIRECT --server-id=1
xtrabackup: recognized client arguments: --datadir=/var/lib/mysql --innodb_buffer_pool_size=185M --innodb_flush_log_at_trx_commit=2 --innodb_file_per_table=1 --innodb_data_file_path=ibdata1:100M:autoextend --innodb_read_io_threads=4 --innodb_write_io_threads=4 --innodb_doublewrite=1 --innodb_log_file_size=64M --innodb_log_buffer_size=16M --innodb_log_files_in_group=2 --innodb_flush_method=O_DIRECT --server-id=1 --databases-exclude=lost+found --ssl-mode=DISABLED
encryption: using gcrypt 1.6.5
181116 10:11:25 innobackupex: Starting the backup operation

IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!".

181116 10:11:25  version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;mysql_socket=/var/lib/mysql/mysql.sock' as 'backupuser'  (using password: YES).
181116 10:11:25  version_check Connected to MySQL server
181116 10:11:25  version_check Executing a version check against the server...
181116 10:11:25  version_check Done.
181116 10:11:25 Connecting to MySQL server host: localhost, user: backupuser, password: set, port: not set, socket: /var/lib/mysql/mysql.sock
Using server version 5.7.23-23-57
innobackupex version 2.4.12 based on MySQL server 5.7.19 Linux (x86_64) (revision id: 170eb8c)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /var/lib/mysql
xtrabackup: open files limit requested 0, set to 1024
xtrabackup: using the following InnoDB configuration:
xtrabackup:   innodb_data_home_dir = .
xtrabackup:   innodb_data_file_path = ibdata1:100M:autoextend
xtrabackup:   innodb_log_group_home_dir = ./
xtrabackup:   innodb_log_files_in_group = 2
xtrabackup:   innodb_log_file_size = 67108864
xtrabackup: using O_DIRECT
InnoDB: Number of pools: 1
181116 10:11:25 >> log scanned up to (2597648)
xtrabackup: Generating a list of tablespaces
InnoDB: Allocated tablespace ID 19 for mysql/server_cost, old maximum was 0
181116 10:11:25 [01] Encrypting ./ibdata1 to /backup/2018-11-16_10-11-25/ibdata1.xbcrypt
181116 10:11:26 >> log scanned up to (2597648)
181116 10:11:27 >> log scanned up to (2597648)
181116 10:11:28 [01]        ...done
181116 10:11:28 [01] Encrypting ./mysql/server_cost.ibd to /backup/2018-11-16_10-11-25/mysql/server_cost.ibd.xbcrypt
181116 10:11:28 [01]        ...done
181116 10:11:28 [01] Encrypting ./mysql/help_category.ibd to /backup/2018-11-16_10-11-25/mysql/help_category.ibd.xbcrypt
181116 10:11:28 [01]        ...done
181116 10:11:28 [01] Encrypting ./mysql/slave_master_info.ibd to /backup/2018-11-16_10-11-25/mysql/slave_master_info.ibd.xbcrypt
181116 10:11:28 [01]        ...done

Di conseguenza ci ritroveremo con una directory di backup piena di file crittografati:

[email protected]:~# ls -alh /backup/2018-11-16_10-11-25/
total 101M
drwxr-x---  5 root root 4.0K Nov 16 10:11 .
drwxr-xr-x 16 root root 4.0K Nov 16 10:11 ..
-rw-r-----  1 root root  580 Nov 16 10:11 backup-my.cnf.xbcrypt
-rw-r-----  1 root root  515 Nov 16 10:11 ib_buffer_pool.xbcrypt
-rw-r-----  1 root root 101M Nov 16 10:11 ibdata1.xbcrypt
drwxr-x---  2 root root 4.0K Nov 16 10:11 mysql
drwxr-x---  2 root root  12K Nov 16 10:11 performance_schema
drwxr-x---  2 root root  12K Nov 16 10:11 sys
-rw-r-----  1 root root  113 Nov 16 10:11 xtrabackup_checkpoints
-rw-r-----  1 root root  525 Nov 16 10:11 xtrabackup_info.xbcrypt
-rw-r-----  1 root root 2.7K Nov 16 10:11 xtrabackup_logfile.xbcrypt

Xtrabackup ha alcune altre variabili che possono essere utilizzate per ottimizzare le prestazioni della crittografia:

  • --encrypt-threads consente la parallelizzazione del processo di crittografia
  • --encrypt-chunk-size definisce un buffer funzionante per il processo di crittografia.

Se hai bisogno di decrittografare i file, puoi usare innobackupex con l'opzione --decrypt per questo:

[email protected]:~# innobackupex --decrypt=AES256 --encrypt-key-file=/root/encrypt.key /backup/2018-11-16_10-11-25/

Poiché xtrabackup non pulisce i file crittografati, potresti volerli rimuovere utilizzando la seguente riga:

for i in `find /backup/2018-11-16_10-11-25/ -iname "*\.xbcrypt"`; do rm $i ; done

Crittografia di backup in ClusterControl

Con ClusterControl i backup crittografati sono a portata di clic. Tutti i metodi di backup (mysqldump, xtrabackup o mariabackup) supportano la crittografia. Puoi sia creare un backup ad hoc che preparare una pianificazione per i tuoi backup.

Nel nostro esempio abbiamo scelto un xtrabackup completo, lo memorizzeremo sull'istanza del controller.

Nella pagina successiva abbiamo abilitato la crittografia. Come affermato, ClusterControl creerà automaticamente una chiave di crittografia per noi. Questo è tutto, quando fai clic sul pulsante "Crea backup" verrà avviato un processo.

Il nuovo backup è visibile nell'elenco dei backup. È contrassegnato come crittografato (l'icona del lucchetto).

Ci auguriamo che questo post del blog ti fornisca alcune informazioni su come assicurarti che i tuoi backup siano crittografati correttamente.