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

Sådan krypterer du dine MySQL- og MariaDB-sikkerhedskopier

Vi tager os som regel af ting, vi værdsætter, hvad enten det er en dyr smartphone eller virksomhedens servere. Data er et af organisationens vigtigste aktiver, og selvom vi ikke kan se det, skal det beskyttes omhyggeligt. Vi implementerer data i hvile kryptering for at kryptere databasefiler eller hele mængder, som indeholder vores data. Vi implementerer data i transit-kryptering ved hjælp af SSL for at sikre, at ingen kan snuse og indsamle data sendt på tværs af netværk. Sikkerhedskopier er ikke anderledes. Lige meget om dette er en fuld sikkerhedskopi eller trinvis, vil den gemme mindst en del af dine data. Som sådan skal sikkerhedskopier også krypteres. I dette blogindlæg vil vi se nærmere på nogle muligheder, du kan have, når det kommer til at kryptere sikkerhedskopier. Lad os dog først se på, hvordan du kan kryptere dine sikkerhedskopier, og hvad der kunne bruges til disse metoder.

Hvordan krypterer du din sikkerhedskopi?

Krypter lokal fil

Først og fremmest kan du nemt kryptere eksisterende filer. Lad os forestille os, at du har en backup-proces, der gemmer alle dine backups på en backup-server. På et tidspunkt besluttede du, at det er på høje tid at implementere eksternt backuplager til katastrofegendannelse. Du kan bruge S3 eller lignende infrastruktur fra andre cloud-udbydere til det. Selvfølgelig ønsker du ikke at uploade ukrypterede sikkerhedskopier nogen steder uden for dit betroede netværk, derfor er det afgørende, at du implementerer backup-kryptering på den ene eller den anden måde. En meget simpel metode, der ikke kræver nogen ændringer i dine eksisterende backup-scripts, ville være at oprette et script, som tager en backup-fil, krypterer den og uploader den til S3. En af de metoder, du kan bruge til at kryptere dataene, er at bruge openssl:

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

Dette vil oprette en ny, krypteret fil, 'backup_file.tar.gz.enc' i den aktuelle mappe. Du kan altid dekryptere det senere ved at køre:

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

Denne metode er meget enkel, men den har nogle ulemper. Den største er kravene til diskplads. Når du krypterer som vi har beskrevet ovenfor, skal du beholde både ukrypteret og krypteret fil, og i resultatet kræver du en diskplads dobbelt så stor som backupfilen. Afhængigt af dine krav kan dette selvfølgelig være noget, du ønsker - at holde ikke-krypterede filer lokalt vil forbedre gendannelseshastigheden - trods alt vil dekryptering af dataene også tage noget tid.

Kryptér sikkerhedskopiering i farten

For at undgå behovet for at gemme både krypterede og ukrypterede data, kan det være en god idé at implementere krypteringen på det tidligere stadie af backup-processen. Det kan vi gøre gennem rør. Pipes er kort sagt en måde at sende data fra en kommando til en anden. Dette gør det muligt at oprette en kæde af kommandoer, der behandler data. Du kan generere dataene, derefter komprimere dem og kryptere. Et eksempel på en sådan kæde kunne være:

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

Du kan også bruge denne metode med xtrabackup eller mariabackup. Faktisk er dette eksemplet fra MariaDB-dokumentationen:

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

Hvis du vil, kan du endda prøve at uploade data som en del af 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 et resultat vil du se en lokal fil 'mysqldump.gz.enc', og kopi af dataene vil blive overført til et program, som vil gøre noget ved det. Vi brugte 'nc', som streamede data til en anden vært, hvor følgende blev udført:

nc -l 9991 > backup.gz.enc

I dette eksempel brugte vi mysqldump og nc, men du kan bruge xtrabackup eller mariabackup og et eller andet værktøj, som vil uploade streamen til Amazon S3, Google Cloud Storage eller en anden cloud-udbyder. Ethvert program eller script, der accepterer data på stdin, kan bruges i stedet for 'nc'.

Brug indlejret kryptering

I nogle af tilfældene har et backupværktøj indlejret understøttelse af kryptering. Et eksempel her er xtrabackup, som internt kan kryptere filen. Desværre understøtter mariabackup, selvom det er en gaffel af xtrabackup, ikke denne funktion.

Før vi kan bruge det, skal vi oprette en nøgle, som skal bruges til at kryptere dataene. Det kan gøres ved at køre følgende kommando:

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

Xtrabackup kan acceptere nøglen i almindeligt tekstformat (ved hjælp af --encrypt-key option), eller den kan læse den fra fil (ved hjælp af --encrypt-key-file option). Sidstnævnte er sikrere, da det at videregive adgangskoder og nøgler som almindelig tekst til kommandoer resulterer i lagring af dem i bash-historikken. Du kan også se det tydeligt på listen over kørende processer, hvilket er ret dårligt:

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/

Ideelt set vil du bruge nøglen, der er gemt i en fil, men så er der en lille gotcha, du skal være opmærksom på.

[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 kan undre dig over, hvad problemet er. Det bliver klart, hvornår vi åbner filen encrypt.key 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 bemærke det sidste tegn kodet ved hjælp af '0A'. Dette er dybest set line feed-karakteren, men det tages i betragtning under evaluering af krypteringsnøglen. Når vi har fjernet det, kan vi endelig køre sikkerhedskopien.

[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 et resultat vil vi ende med en backup-mappe fuld af krypterede 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 nogle andre variabler, som kan bruges til at justere krypteringsydelsen:

  • --encrypt-threads giver mulighed for parallelisering af krypteringsprocessen
  • --encrypt-chunk-size definerer en arbejdsbuffer for krypteringsprocessen.

Skulle du have brug for at dekryptere filerne, kan du bruge innobackupex med --decrypt mulighed for det:

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

Da xtrabackup ikke renser krypterede filer, vil du måske fjerne dem ved at bruge følgende one-liner:

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

Sikkerhedskopikryptering i ClusterControl

Med ClusterControl er krypterede sikkerhedskopier kun et klik væk. Alle backupmetoder (mysqldump, xtrabackup eller mariabackup) understøtter kryptering. Du kan både oprette en ad hoc backup, eller du kan udarbejde en tidsplan for dine backups.

I vores eksempel valgte vi en fuld xtrabackup, vi gemmer den på controller-instansen.

På næste side aktiverede vi krypteringen. Som nævnt vil ClusterControl automatisk oprette en krypteringsnøgle til os. Dette er det, når du klikker på knappen "Opret sikkerhedskopi" vil en proces blive startet.

Ny backup er synlig på backuplisten. Det er markeret som krypteret (låseikonet).

Vi håber, at dette blogindlæg giver dig lidt indsigt i, hvordan du sikrer dig, at dine sikkerhedskopier er korrekt krypteret.


  1. Sådan gemmer du data i unicode på hindi

  2. Opgrader MySQL til MariaDB 10 (del 1 – Installer MariaDB 5.5)

  3. Hvad er forskellen mellem Non-Repeatable Read og Phantom Read?

  4. Sådan importeres en SQL Server-database til Access 2016