Costumamos cuidar de coisas que valorizamos, seja um smartphone caro ou os servidores da empresa. Os dados são um dos ativos mais importantes da organização e, embora não os vejamos, eles devem ser cuidadosamente protegidos. Implementamos criptografia de dados em repouso para criptografar arquivos de banco de dados ou volumes inteiros que contêm nossos dados. Implementamos criptografia de dados em trânsito usando SSL para garantir que ninguém possa farejar e coletar dados enviados pelas redes. Os backups não são diferentes. Não importa se este é um backup completo ou incremental, ele armazenará pelo menos uma parte de seus dados. Como tal, os backups também precisam ser criptografados. Nesta postagem do blog, examinaremos algumas opções que você pode ter quando se trata de criptografar backups. Primeiro, porém, vamos ver como você pode criptografar seus backups e quais podem ser os casos de uso para esses métodos.
Como criptografar seu backup?
Criptografar arquivo local
Em primeiro lugar, você pode criptografar facilmente os arquivos existentes. Vamos imaginar que você tenha um processo de backup armazenando todos os seus backups em um servidor de backup. Em algum momento, você decidiu que era a hora de implementar o armazenamento de backup externo para recuperação de desastres. Você pode usar o S3 ou infraestrutura semelhante de outros provedores de nuvem para isso. Obviamente, você não deseja fazer upload de backups não criptografados em qualquer lugar fora de sua rede confiável, portanto, é fundamental que você implemente a criptografia de backup de uma forma ou de outra. Um método muito simples, que não requer nenhuma alteração em seus scripts de backup existentes, seria criar um script que pegaria um arquivo de backup, criptografá-lo e enviá-lo para o S3. Um dos métodos que você pode usar para criptografar os dados é usar openssl:
openssl enc -aes-256-cbc -salt -in backup_file.tar.gz -out backup_file.tar.gz.enc -k yoursecretpassword
Isso criará um novo arquivo criptografado, ‘backup_file.tar.gz.enc’ no diretório atual. Você sempre pode descriptografá-lo mais tarde executando:
openssl aes-256-cbc -d -in backup_file.tar.gz.enc -out backup_file.tar.gz -k yoursecretpassword
Este método é muito simples, mas tem algumas desvantagens. O maior deles são os requisitos de espaço em disco. Ao criptografar como descrito acima, você deve manter o arquivo não criptografado e o criptografado e, como resultado, precisará de um espaço em disco com o dobro do tamanho do arquivo de backup. Claro, dependendo dos seus requisitos, isso pode ser algo que você deseja - manter arquivos não criptografados localmente melhorará a velocidade de recuperação - afinal, descriptografar os dados também levará algum tempo.
Criptografar backup em tempo real
Para evitar a necessidade de armazenar dados criptografados e não criptografados, convém implementar a criptografia no estágio anterior do processo de backup. Podemos fazer isso através de tubos. Pipes são, em suma, uma forma de enviar os dados de um comando para outro. Isso possibilita a criação de uma cadeia de comandos que processa dados. Você pode gerar os dados, compactá-los e criptografar. Um exemplo dessa cadeia pode ser:
mysqldump --all-databases --single-transaction --triggers --routines | gzip | openssl enc -aes-256-cbc -k mypass > backup.xb.enc
Você também pode usar esse método com xtrabackup ou mariabackup. Na verdade, este é o exemplo da documentação do MariaDB:
mariabackup --user=root --backup --stream=xbstream | openssl enc -aes-256-cbc -k mypass > backup.xb.enc
Se quiser, você pode até tentar fazer upload de dados como parte do 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
Como resultado, você verá um arquivo local ‘mysqldump.gz.enc’ e a cópia dos dados será canalizada para um programa que fará algo a respeito. Usamos 'nc', que transmitia dados para outro host no qual o seguinte foi executado:
nc -l 9991 > backup.gz.enc
Neste exemplo, usamos mysqldump e nc, mas você pode usar xtrabackup ou mariabackup e alguma ferramenta que fará o upload do fluxo para o Amazon S3, Google Cloud Storage ou algum outro provedor de nuvem. Qualquer programa ou script que aceite dados em stdin pode ser usado em vez de 'nc'.
Usar criptografia incorporada
Em alguns casos, uma ferramenta de backup tem suporte embutido para criptografia. Um exemplo aqui é o xtrabackup, que pode criptografar o arquivo internamente. Infelizmente, o mariabackup, mesmo sendo um fork do xtrabackup, não suporta esse recurso.
Antes de podermos usá-lo, temos que criar uma chave que será usada para criptografar os dados. Isso pode ser feito executando o seguinte comando:
[email protected]:~# openssl rand -base64 24
HnliYiaRo7NUvc1dbtBMvt4rt1Fhunjb
O Xtrabackup pode aceitar a chave em formato de texto simples (usando a opção --encrypt-key) ou pode lê-la do arquivo (usando a opção --encrypt-key-file). O último é mais seguro, pois passar senhas e chaves como texto simples para comandos resulta em armazená-los no histórico do bash. Você também pode ver claramente na lista de processos em execução, o que é bastante ruim:
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, você usará a chave armazenada em um arquivo, mas há uma pequena pegadinha da qual você deve estar ciente.
[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.
Você pode se perguntar qual é o problema. Ficará claro quando abriremos o arquivo encrypt.key em um editor hexadecimal como o 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.
Agora você pode notar o último caractere codificado usando '0A'. Este é basicamente o caractere de alimentação de linha, mas é levado em consideração ao avaliar a chave de criptografia. Depois de removê-lo, podemos finalmente executar o 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
Como resultado, teremos um diretório de backup cheio de arquivos criptografados:
[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
O Xtrabackup tem algumas outras variáveis que podem ser usadas para ajustar o desempenho da criptografia:
- --encrypt-threads permite a paralelização do processo de criptografia
- --encrypt-chunk-size define um buffer de trabalho para o processo de criptografia.
Se você precisar descriptografar os arquivos, você pode usar o innobackupex com a opção --decrypt para isso:
[email protected]:~# innobackupex --decrypt=AES256 --encrypt-key-file=/root/encrypt.key /backup/2018-11-16_10-11-25/
Como o xtrabackup não limpa arquivos criptografados, você pode removê-los usando o seguinte one-liner:
for i in `find /backup/2018-11-16_10-11-25/ -iname "*\.xbcrypt"`; do rm $i ; done
Criptografia de backup no ClusterControl
Com o ClusterControl, os backups criptografados estão a apenas um clique de distância. Todos os métodos de backup (mysqldump, xtrabackup ou mariabackup) suportam criptografia. Você pode criar um backup ad hoc ou preparar uma programação para seus backups.
Em nosso exemplo, escolhemos um xtrabackup completo, vamos armazená-lo na instância do controlador.
Na página seguinte, habilitamos a criptografia. Conforme declarado, o ClusterControl criará automaticamente uma chave de criptografia para nós. É isso, ao clicar no botão “Criar Backup” um processo será iniciado.
O novo backup é visível na lista de backups. Ele está marcado como criptografado (o ícone de cadeado).
Esperamos que esta postagem do blog forneça algumas informações sobre como garantir que seus backups sejam criptografados corretamente.