sql >> Databasteknik >  >> RDS >> MariaDB

Hur du krypterar dina MySQL- och MariaDB-säkerhetskopier

Vi brukar ta hand om saker vi värdesätter, oavsett om det är en dyr smartphone eller företagets servrar. Data är en av organisationens viktigaste tillgångar, och även om vi inte ser dem måste de skyddas noggrant. Vi implementerar data at rest-kryptering för att kryptera databasfiler eller hela volymer som innehåller våra data. Vi implementerar kryptering av data under överföring med SSL för att se till att ingen kan sniffa och samla in data som skickas över nätverk. Säkerhetskopiering är inte annorlunda. Oavsett om detta är en fullständig säkerhetskopia eller inkrementell, kommer den att lagra åtminstone en del av dina data. Som sådan måste säkerhetskopior också krypteras. I det här blogginlägget kommer vi att undersöka några alternativ du kan ha när det gäller att kryptera säkerhetskopior. Men låt oss först titta på hur du kan kryptera dina säkerhetskopior och vad som kan användas för dessa metoder.

Hur krypterar du din säkerhetskopia?

Kryptera lokal fil

Först och främst kan du enkelt kryptera befintliga filer. Låt oss föreställa oss att du har en säkerhetskopieringsprocess som lagrar alla dina säkerhetskopior på en backupserver. Vid någon tidpunkt bestämde du dig för att det är hög tid att implementera extern backuplagring för katastrofåterställning. Du kan använda S3 eller liknande infrastruktur från andra molnleverantörer för det. Naturligtvis vill du inte ladda upp okrypterade säkerhetskopior någonstans utanför ditt betrodda nätverk, därför är det viktigt att du implementerar säkerhetskopieringskryptering på ett eller annat sätt. En mycket enkel metod som inte kräver några ändringar i dina befintliga säkerhetskopieringsskript är att skapa ett skript som tar en säkerhetskopia, krypterar den och laddar upp den till S3. En av metoderna du kan använda för att kryptera data är att använda openssl:

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

Detta kommer att skapa en ny, krypterad fil, 'backup_file.tar.gz.enc' i den aktuella katalogen. Du kan alltid dekryptera det senare genom att köra:

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

Denna metod är mycket enkel, men den har några nackdelar. Den största är kraven på diskutrymme. Vid kryptering som vi beskrev ovan måste du behålla både okrypterad och krypterad fil och i resultatet kräver du ett diskutrymme som är dubbelt så stort som backupfilen. Naturligtvis, beroende på dina krav, kan detta vara något du vill ha - att behålla okrypterade filer lokalt kommer att förbättra återställningshastigheten - trots allt kommer det att ta lite tid att dekryptera data.

Kryptera säkerhetskopiering i farten

För att undvika behovet av att lagra både krypterad och okrypterad data, kanske du vill implementera krypteringen i ett tidigare skede av säkerhetskopieringsprocessen. Vi kan göra det genom rör. Pipes är kort sagt ett sätt att skicka data från ett kommando till ett annat. Detta gör det möjligt att skapa en kedja av kommandon som bearbetar data. Du kan generera data, sedan komprimera den och kryptera. Ett exempel på en sådan kedja kan vara:

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

Du kan också använda den här metoden med xtrabackup eller mariabackup. Faktum är att detta är exemplet från MariaDB-dokumentationen:

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

Om du vill kan du till och med försöka ladda upp data som en del av processen:

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

Som ett resultat kommer du att se en lokal fil 'mysqldump.gz.enc' och en kopia av data kommer att skickas till ett program som kommer att göra något åt ​​det. Vi använde 'nc', som strömmade data till en annan värd där följande exekverades:

nc -l 9991 > backup.gz.enc

I det här exemplet använde vi mysqldump och nc men du kan använda xtrabackup eller mariabackup och något verktyg som laddar upp strömmen till Amazon S3, Google Cloud Storage eller någon annan molnleverantör. Alla program eller skript som accepterar data på stdin kan användas istället för 'nc'.

Använd inbäddad kryptering

I några av fallen har ett säkerhetskopieringsverktyg inbäddat stöd för kryptering. Ett exempel här är xtrabackup, som internt kan kryptera filen. Tyvärr stöder inte mariabackup den här funktionen, även om det är en gaffel av xtrabackup.

Innan vi kan använda den måste vi skapa en nyckel som kommer att användas för att kryptera data. Det kan göras genom att köra följande kommando:

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

Xtrabackup kan acceptera nyckeln i vanligt textformat (med alternativet --encrypt-key) eller så kan det läsa den från filen (med alternativet --encrypt-key-file). Det senare är säkrare eftersom att skicka lösenord och nycklar som vanlig text till kommandon resulterar i att de lagras i bash-historiken. Du kan också se det tydligt på listan över pågående processer, vilket är ganska dåligt:

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/

Helst kommer du att använda nyckeln som är lagrad i en fil, men sedan finns det en liten gotcha du måste vara medveten om.

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

Du kanske undrar vad problemet är. Det kommer att bli klart när vi kommer att öppna encrypt.key-filen i en hexadecimal editor som 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.

Du kan nu lägga märke till det sista tecknet som kodats med "0A". Detta är i princip linjematningstecknet, men det beaktas vid utvärdering av krypteringsnyckeln. När vi har tagit bort det kan vi äntligen köra säkerhetskopieringen.

[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

Som ett resultat kommer vi att sluta med en säkerhetskopieringskatalog full av krypterade filer:

[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 har några andra variabler som kan användas för att justera krypteringsprestanda:

  • --encrypt-threads möjliggör parallellisering av krypteringsprocessen
  • --encrypt-chunk-size definierar en fungerande buffert för krypteringsprocessen.

Om du skulle behöva dekryptera filerna kan du använda innobackupex med --decrypt-alternativet för det:

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

Eftersom xtrabackup inte rensar krypterade filer, kanske du vill ta bort dem med följande one-liner:

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

Säkerhetskopiera kryptering i ClusterControl

Med ClusterControl är krypterade säkerhetskopior bara ett klick bort. Alla säkerhetskopieringsmetoder (mysqldump, xtrabackup eller mariabackup) stöder kryptering. Du kan både skapa en säkerhetskopia ad hoc eller så kan du förbereda ett schema för dina säkerhetskopior.

I vårt exempel valde vi en fullständig xtrabackup, vi kommer att lagra den på kontrollerinstansen.

På nästa sida aktiverade vi krypteringen. Som sagt kommer ClusterControl automatiskt att skapa en krypteringsnyckel åt oss. Detta är det, när du klickar på knappen "Skapa säkerhetskopia" kommer en process att startas.

Ny säkerhetskopia är synlig på säkerhetskopieringslistan. Den är markerad som krypterad (låsikonen).

Vi hoppas att det här blogginlägget ger dig lite insikter i hur du ser till att dina säkerhetskopior är korrekt krypterade.


  1. MySQL enkla citat, dubbla citat, tillbaka citat Användning förklaras

  2. Hur man uppdaterar data i en anpassad dialogruta

  3. JSON_STORAGE_SIZE() – Hitta lagringsstorleken för ett JSON-dokument i MySQL

  4. SQL Server Standard Edition High Availability Futures