MariaDB
 sql >> база данни >  >> RDS >> MariaDB

Как да шифровате вашите MySQL и MariaDB архиви

Обикновено се грижим за нещата, които ценим, независимо дали е скъп смартфон или сървърите на компанията. Данните са един от най-важните активи на организацията и въпреки че не ги виждаме, те трябва да бъдат внимателно защитени. Ние прилагаме криптиране на данни в покой, за да криптираме файлове на база данни или цели томове, които съдържат нашите данни. Ние внедряваме криптиране на данни при транзит, използвайки SSL, за да сме сигурни, че никой не може да надуши и събира данни, изпратени през мрежи. Архивите не са по-различни. Без значение дали това е пълно архивиране или инкрементално, то ще съхранява поне част от вашите данни. Като такива, архивите също трябва да бъдат криптирани. В тази публикация в блога ще разгледаме някои опции, които може да имате, когато става въпрос за криптиране на резервни копия. Първо обаче, нека разгледаме как можете да шифровате вашите архивни копия и какви могат да бъдат случаите на използване за тези методи.

Как да шифровате резервното си копие?

Шифроване на локален файл

На първо място, можете лесно да шифровате съществуващи файлове. Нека си представим, че имате процес на архивиране, който съхранява всичките ви архиви на резервен сървър. В един момент решихте, че е крайно време да внедрите резервно съхранение извън сайта за възстановяване при бедствия. За това можете да използвате S3 или подобна инфраструктура от други доставчици на облак. Разбира се, не искате да качвате некриптирани архиви навсякъде извън вашата надеждна мрежа, затова е от решаващо значение да приложите криптиране на архивиране по един или друг начин. Много прост метод, който не изисква никакви промени в съществуващите ви архивни скриптове, би бил да създадете скрипт, който ще вземе архивен файл, ще го криптира и ще го качи в S3. Един от методите, които можете да използвате за криптиране на данните, е да използвате openssl:

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

Това ще създаде нов, криптиран файл, „backup_file.tar.gz.enc“ в текущата директория. Винаги можете да го дешифрирате по-късно, като изпълните:

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

Този метод е много прост, но има някои недостатъци. Най-голямото е изискванията за дисково пространство. Когато криптирате, както описахме по-горе, трябва да запазите както некриптиран, така и криптиран файл и в резултат се нуждаете от дисково пространство, два пъти по-голямо от размера на архивния файл. Разбира се, в зависимост от вашите изисквания, това може да е нещо, което искате - запазването на некриптирани файлове локално ще подобри скоростта на възстановяване - в края на краищата декриптирането на данните също ще отнеме известно време.

Шифроване на архивиране в движение

За да избегнете необходимостта от съхраняване както на криптирани, така и на некриптирани данни, може да искате да приложите криптирането на по-ранния етап от процеса на архивиране. Можем да направим това чрез тръби. Накратко, тръбите са начин за изпращане на данни от една команда към друга. Това прави възможно създаването на верига от команди, която обработва данни. Можете да генерирате данните, след това да ги компресирате и шифровате. Пример за такава верига може да бъде:

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

Можете също да използвате този метод с xtrabackup или mariabackup. Всъщност това е примерът от документацията на MariaDB:

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

Ако искате, можете дори да опитате да качите данни като част от процеса:

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

В резултат на това ще видите локален файл „mysqldump.gz.enc“ и копието на данните ще бъде изпратено по канал към програма, която ще направи нещо по въпроса. Използвахме „nc“, който предаваше поточно данни към друг хост, на който беше изпълнено следното:

nc -l 9991 > backup.gz.enc

В този пример използвахме mysqldump и nc, но можете да използвате xtrabackup или mariabackup и някакъв инструмент, който ще качи потока в Amazon S3, Google Cloud Storage или друг доставчик на облак. Всяка програма или скрипт, който приема данни на stdin, може да се използва вместо „nc“.

Използвайте вградено криптиране

В някои от случаите инструментът за архивиране има вградена поддръжка за криптиране. Пример тук е xtrabackup, който може вътрешно да криптира файла. За съжаление, mariabackup, въпреки че е разклонение на xtrabackup, не поддържа тази функция.

Преди да можем да го използваме, трябва да създадем ключ, който ще се използва за криптиране на данните. Това може да стане, като изпълните следната команда:

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

Xtrabackup може да приеме ключа в обикновен текстов формат (използвайки опцията --encrypt-key) или да го прочете от файл (използвайки опцията --encrypt-key-file). Последното е по-безопасно, тъй като предаването на пароли и ключове като обикновен текст към командите води до съхраняването им в историята на bash. Можете също да го видите ясно в списъка с работещи процеси, което е доста лошо:

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/

В идеалния случай ще използвате ключа, съхранен във файл, но след това трябва да сте наясно с малка грешка.

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

Може да се чудите какъв е проблемът. Ще стане ясно кога ще отворим файла encrypt.key в шестнадесетичен редактор като 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.

Вече можете да забележите последния знак, кодиран с „0A“. Това е основно символът за подаване на ред, но се взема предвид при оценката на ключа за криптиране. След като го премахнем, най-накрая можем да стартираме архивирането.

[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

В резултат на това ще получим резервна директория, пълна с криптирани файлове:

[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 има някои други променливи, които могат да се използват за настройка на ефективността на криптиране:

  • --encrypt-threads позволява паралелизиране на процеса на криптиране
  • --encrypt-chunk-size дефинира работещ буфер за процеса на криптиране.

Ако трябва да дешифрирате файловете, можете да използвате innobackupex с опция --decrypt за това:

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

Тъй като xtrabackup не почиства криптирани файлове, може да искате да ги премахнете, като използвате следния едноред:

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

Резервно криптиране в ClusterControl

С ClusterControl криптираните архиви са само с едно щракване. Всички методи за архивиране (mysqldump, xtrabackup или mariabackup) поддържат криптиране. Можете както да създадете резервно копие ad hoc, така и да подготвите график за вашите архивни копия.

В нашия пример избрахме пълен xtrabackup, ще го съхраняваме в екземпляра на контролера.

На следващата страница активирахме криптирането. Както беше посочено, ClusterControl автоматично ще създаде ключ за криптиране за нас. Това е всичко, когато щракнете върху бутона „Създаване на резервно копие“, ще започне процес.

Новото архивиране се вижда в списъка с архиви. Той е маркиран като криптиран (иконата на заключване).

Надяваме се, че тази публикация в блога ви дава известна информация как да се уверите, че вашите архивни копия са правилно криптирани.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ръководство за автоматизирано внедряване на облачни бази данни

  2. Какво е новото в MariaDB 10.4

  3. Как работи SYSDATE() в MariaDB

  4. Преглед на MariaDB Xpand (бивш ClustrixDB)

  5. Защита на MySQL - Използване на привилегии за достъп до данни за сигурна инсталация