sql >> Databáze >  >> RDS >> MariaDB

Jak zašifrovat zálohy MySQL a MariaDB

Obvykle se staráme o věci, kterých si ceníme, ať už jde o drahý smartphone nebo servery společnosti. Data jsou jedním z nejdůležitějších aktiv organizace, a přestože je nevidíme, je třeba je pečlivě chránit. Implementujeme šifrování dat v klidu pro šifrování databázových souborů nebo celých svazků, které obsahují naše data. Implementujeme data v přenosovém šifrování pomocí SSL, abychom zajistili, že nikdo nebude moci snímat a sbírat data odesílaná přes sítě. Zálohy se neliší. Bez ohledu na to, zda se jedná o úplnou zálohu nebo přírůstkovou zálohu, uloží alespoň část vašich dat. Proto musí být zálohy také šifrovány. V tomto příspěvku na blogu se podíváme na některé možnosti, které můžete mít, pokud jde o šifrování záloh. Nejprve se však podívejme, jak můžete šifrovat zálohy a jaké by mohly být případy použití těchto metod.

Jak zašifrovat zálohu?

Šifrovat místní soubor

Za prvé, můžete snadno zašifrovat existující soubory. Představme si, že máte proces zálohování, který ukládá všechny vaše zálohy na záložní server. V určitém okamžiku jste se rozhodli, že je nejvyšší čas implementovat externí záložní úložiště pro obnovu po havárii. K tomu můžete využít S3 nebo podobnou infrastrukturu od jiných cloudových poskytovatelů. Samozřejmě nechcete nahrávat nešifrované zálohy kamkoli mimo vaši důvěryhodnou síť, proto je důležité, abyste šifrování záloh implementovali tak či onak. Velmi jednoduchou metodou, která nevyžaduje žádné změny ve vašich stávajících zálohovacích skriptech, by bylo vytvoření skriptu, který vezme záložní soubor, zašifruje jej a nahraje do S3. Jednou z metod, kterou můžete použít k šifrování dat, je použití openssl:

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

Tím se v aktuálním adresáři vytvoří nový zašifrovaný soubor „backup_file.tar.gz.enc“. Vždy jej můžete dešifrovat později spuštěním:

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

Tato metoda je velmi jednoduchá, ale má některé nevýhody. Tím největším jsou požadavky na místo na disku. Při šifrování, jak jsme popsali výše, musíte ponechat nezašifrovaný i zašifrovaný soubor a ve výsledku potřebujete místo na disku dvakrát větší než záložní soubor. Samozřejmě, v závislosti na vašich požadavcích to může být něco, co chcete – uchovávání nešifrovaných souborů lokálně zvýší rychlost obnovy – koneckonců dešifrování dat bude také nějakou dobu trvat.

Zašifrovat zálohu za chodu

Abyste se vyhnuli nutnosti ukládat šifrovaná i nešifrovaná data, možná budete chtít implementovat šifrování v dřívější fázi procesu zálohování. Můžeme to udělat pomocí potrubí. Pipe jsou zkrátka způsob, jak posílat data z jednoho příkazu do druhého. To umožňuje vytvořit řetězec příkazů, které zpracovávají data. Data můžete vygenerovat, poté je zkomprimovat a zašifrovat. Příkladem takového řetězce může být:

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

Tuto metodu můžete také použít s xtrabackup nebo mariabackup. Ve skutečnosti je to příklad z dokumentace MariaDB:

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

Pokud chcete, můžete dokonce zkusit nahrát data jako součást procesu:

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

Výsledkem je, že uvidíte místní soubor „mysqldump.gz.enc“ a kopie dat bude přesměrována do programu, který s tím něco udělá. Použili jsme „nc“, který streamoval data do jiného hostitele, na kterém bylo provedeno následující:

nc -l 9991 > backup.gz.enc

V tomto příkladu jsme použili mysqldump a nc, ale můžete použít xtrabackup nebo mariabackup a nějaký nástroj, který nahraje stream do Amazon S3, Google Cloud Storage nebo jiného poskytovatele cloudu. Namísto „nc“ lze použít jakýkoli program nebo skript, který přijímá data na stdin.

Použít vestavěné šifrování

V některých případech má zálohovací nástroj integrovanou podporu pro šifrování. Zde je příkladem xtrabackup, který dokáže interně zašifrovat soubor. Bohužel, mariabackup, i když se jedná o fork xtrabackup, tuto funkci nepodporuje.

Než jej budeme moci použít, musíme vytvořit klíč, který bude použit k šifrování dat. To lze provést spuštěním následujícího příkazu:

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

Xtrabackup může přijmout klíč ve formátu prostého textu (pomocí volby --encrypt-key) nebo jej může načíst ze souboru (pomocí volby --encrypt-key-file). Ten je bezpečnější, protože předávání hesel a klíčů jako prostého textu příkazům vede k jejich ukládání do historie bash. Jasně to vidíte i na seznamu běžících procesů, což je dost špatné:

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/

V ideálním případě použijete klíč uložený v souboru, ale pak je tu malý problém, kterého si musíte být vědomi.

[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.

Možná se ptáte, v čem je problém. Bude jasné, když otevřeme soubor encrypt.key v hexadecimálním editoru, jako je 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.

Nyní si můžete všimnout posledního znaku zakódovaného pomocí „0A“. Toto je v podstatě znak pro posun řádku, ale bere se v úvahu při vyhodnocování šifrovacího klíče. Jakmile jej odstraníme, můžeme konečně spustit zálohu.

[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

V důsledku toho skončíme se záložním adresářem plným zašifrovaných souborů:

[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 má některé další proměnné, které lze použít k vyladění výkonu šifrování:

  • --encrypt-threads umožňuje paralelizaci procesu šifrování
  • --encrypt-chunk-size definuje pracovní vyrovnávací paměť pro proces šifrování.

Pokud potřebujete dešifrovat soubory, můžete k tomu použít innobackupex s volbou --decrypt:

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

Protože xtrabackup nečistí zašifrované soubory, možná je budete chtít odstranit pomocí následujícího řádku:

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

Šifrování záloh v ClusterControl

S ClusterControl jsou šifrované zálohy vzdáleny pouze jedním kliknutím. Všechny metody zálohování (mysqldump, xtrabackup nebo mariabackup) podporují šifrování. Můžete buď vytvořit zálohu ad hoc, nebo si můžete připravit plán zálohování.

V našem příkladu jsme vybrali plnou zálohu xtrabackup, uložíme ji do instance řadiče.

Na další stránce jsme povolili šifrování. Jak bylo uvedeno, ClusterControl nám automaticky vytvoří šifrovací klíč. To je ono, když kliknete na tlačítko „Vytvořit zálohu“, proces se spustí.

Nová záloha je viditelná v seznamu záloh. Je označen jako zašifrovaný (ikona zámku).

Doufáme, že vám tento příspěvek na blogu poskytne nějaké informace o tom, jak zajistit, aby byly vaše zálohy správně zašifrovány.


  1. Jak spustit více instancí MySQL na stejném počítači

  2. Jak převést malá písmena na velká v MySQL

  3. Certifikace Oracle

  4. MySQL UPDATE a SELECT v jednom průchodu