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.