MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

Cara Mengenkripsi Cadangan MySQL &MariaDB Anda

Kami biasanya mengurus hal-hal yang kami hargai, apakah itu smartphone mahal atau server perusahaan. Data adalah salah satu aset organisasi yang paling penting, dan meskipun kita tidak melihatnya, itu harus dilindungi dengan hati-hati. Kami menerapkan enkripsi data saat istirahat untuk mengenkripsi file database atau seluruh volume yang berisi data kami. Kami menerapkan enkripsi data dalam perjalanan menggunakan SSL untuk memastikan tidak ada yang dapat mengendus dan mengumpulkan data yang dikirim melalui jaringan. Backup tidak berbeda. Tidak peduli apakah ini adalah cadangan penuh atau tambahan, itu akan menyimpan setidaknya sebagian dari data Anda. Dengan demikian, cadangan harus dienkripsi juga. Dalam posting blog ini, kami akan melihat beberapa opsi yang mungkin Anda miliki dalam hal mengenkripsi cadangan. Namun pertama-tama, mari kita lihat bagaimana Anda dapat mengenkripsi cadangan Anda dan kasus penggunaan apa yang dapat digunakan untuk metode tersebut.

Bagaimana cara mengenkripsi cadangan Anda?

Enkripsi file lokal

Pertama-tama, Anda dapat dengan mudah mengenkripsi file yang ada. Bayangkan Anda memiliki proses pencadangan yang menyimpan semua cadangan Anda di server cadangan. Pada titik tertentu Anda memutuskan inilah saatnya untuk menerapkan penyimpanan cadangan di luar lokasi untuk pemulihan bencana. Anda dapat menggunakan S3 atau infrastruktur serupa dari penyedia cloud lain untuk itu. Tentu saja, Anda tidak ingin mengunggah cadangan yang tidak terenkripsi di mana pun di luar jaringan tepercaya Anda, oleh karena itu penting bagi Anda untuk menerapkan enkripsi cadangan dengan satu atau lain cara. Metode yang sangat sederhana, tidak memerlukan perubahan apa pun pada skrip cadangan Anda yang ada adalah dengan membuat skrip yang akan mengambil file cadangan, mengenkripsinya, dan mengunggahnya ke S3. Salah satu metode yang dapat Anda gunakan untuk mengenkripsi data adalah dengan menggunakan openssl:

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

Ini akan membuat file terenkripsi baru, 'backup_file.tar.gz.enc' di direktori saat ini. Anda selalu dapat mendekripsinya nanti dengan menjalankan:

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

Metode ini sangat sederhana, tetapi memiliki beberapa kelemahan. Yang terbesar adalah kebutuhan ruang disk. Saat mengenkripsi seperti yang kami jelaskan di atas, Anda harus menyimpan file yang tidak terenkripsi dan terenkripsi dan akibatnya Anda memerlukan ruang disk dua kali ukuran file cadangan. Tentu saja, tergantung pada kebutuhan Anda, ini mungkin sesuatu yang Anda inginkan - menyimpan file yang tidak dienkripsi secara lokal akan meningkatkan kecepatan pemulihan - setelah semua mendekripsi data juga akan memakan waktu.

Enkripsi cadangan dengan cepat

Untuk menghindari kebutuhan menyimpan data terenkripsi dan tidak terenkripsi, Anda mungkin ingin menerapkan enkripsi pada tahap awal proses pencadangan. Kita bisa melakukannya melalui pipa. Singkatnya, pipa adalah cara mengirim data dari satu perintah ke perintah lainnya. Ini memungkinkan untuk membuat rantai perintah yang memproses data. Anda dapat menghasilkan data, lalu mengompresnya dan mengenkripsi. Contoh rantai tersebut mungkin:

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

Anda juga dapat menggunakan metode ini dengan xtrabackup atau mariabackup. Sebenarnya, ini adalah contoh dari dokumentasi MariaDB:

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

Jika mau, Anda bahkan dapat mencoba mengunggah data sebagai bagian dari proses:

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

Akibatnya, Anda akan melihat file lokal 'mysqldump.gz.enc' dan salinan data akan disalurkan ke program yang akan melakukan sesuatu tentang hal itu. Kami menggunakan 'nc', yang mengalirkan data ke host lain yang menjalankan berikut ini:

nc -l 9991 > backup.gz.enc

Dalam contoh ini kami menggunakan mysqldump dan nc tetapi Anda dapat menggunakan xtrabackup atau mariabackup dan beberapa alat yang akan mengunggah aliran ke Amazon S3, Google Cloud Storage atau beberapa penyedia cloud lainnya. Program atau skrip apa pun yang menerima data di stdin dapat digunakan sebagai pengganti 'nc'.

Gunakan enkripsi tersemat

Dalam beberapa kasus, alat pencadangan telah menyematkan dukungan untuk enkripsi. Contoh di sini adalah xtrabackup, yang dapat mengenkripsi file secara internal. Sayangnya, mariabackup, meskipun merupakan fork dari xtrabackup, tidak mendukung fitur ini.

Sebelum kita dapat menggunakannya, kita harus membuat kunci yang akan digunakan untuk mengenkripsi data. Itu dapat dilakukan dengan menjalankan perintah berikut:

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

Xtrabackup dapat menerima kunci dalam format teks biasa (menggunakan opsi --encrypt-key) atau dapat membacanya dari file (menggunakan opsi --encrypt-key-file). Yang terakhir lebih aman karena meneruskan kata sandi dan kunci sebagai teks biasa ke perintah menghasilkan menyimpannya dalam riwayat bash. Anda juga dapat melihatnya dengan jelas pada daftar proses yang sedang berjalan, yang cukup buruk:

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/

Idealnya, Anda akan menggunakan kunci yang disimpan dalam file, tetapi ada hal kecil yang harus Anda waspadai.

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

Anda mungkin bertanya-tanya apa masalahnya. Ini akan menjadi jelas ketika kita akan membuka file encrypt.key dalam editor heksadesimal seperti 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.

Anda sekarang dapat melihat karakter terakhir yang dikodekan menggunakan '0A'. Ini pada dasarnya adalah karakter umpan baris, tetapi ini dipertimbangkan saat mengevaluasi kunci enkripsi. Setelah kami menghapusnya, kami akhirnya dapat menjalankan pencadangan.

[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

Akibatnya kita akan berakhir dengan direktori cadangan yang penuh dengan file terenkripsi:

[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 memiliki beberapa variabel lain yang dapat digunakan untuk menyesuaikan kinerja enkripsi:

  • --encrypt-threads memungkinkan paralelisasi proses enkripsi
  • --encrypt-chunk-size mendefinisikan buffer yang berfungsi untuk proses enkripsi.

Jika Anda perlu mendekripsi file, Anda dapat menggunakan innobackupex dengan opsi --decrypt untuk itu:

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

Karena xtrabackup tidak membersihkan file terenkripsi, Anda mungkin ingin menghapusnya menggunakan satu baris berikut:

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

Enkripsi cadangan di ClusterControl

Dengan cadangan terenkripsi ClusterControl hanya dengan satu klik. Semua metode pencadangan (mysqldump, xtrabackup, atau mariabackup) mendukung enkripsi. Anda berdua dapat membuat cadangan ad hoc atau menyiapkan jadwal untuk pencadangan.

Dalam contoh kami, kami memilih xtrabackup lengkap, kami akan menyimpannya di instance controller.

Pada halaman berikutnya kami mengaktifkan enkripsi. Seperti yang dinyatakan, ClusterControl akan secara otomatis membuat kunci enkripsi untuk kita. Ini dia, ketika Anda mengklik tombol “Buat Cadangan”, sebuah proses akan dimulai.

Cadangan baru terlihat di daftar cadangan. Itu ditandai sebagai terenkripsi (ikon kunci).

Kami berharap postingan blog ini memberi Anda beberapa wawasan tentang cara memastikan cadangan Anda dienkripsi dengan benar.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MariaDB JSON_INSERT() Dijelaskan

  2. Pertimbangan Keamanan untuk Penerapan MariaDB di Lingkungan Cloud Hibrida

  3. Menggunakan Replikasi Cluster Galera MySQL untuk Membuat Cluster Geo-Distributed:Bagian Kedua

  4. 2 Cara Mendapatkan Nama Bulan Pendek dari Tanggal di MariaDB

  5. Menggunakan Flashback MariaDB di Server MySQL