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

Enkripsi MariaDB Penuh Saat Istirahat dan Dalam Perjalanan untuk Perlindungan Data Maksimum - Bagian Kedua

Di bagian pertama dari seri ini, kita telah membahas konfigurasi enkripsi transit untuk server replikasi MariaDB, di mana kita mengonfigurasi enkripsi client-server dan replikasi. Diambil dari posting pertama, di mana kami telah mengonfigurasi sebagian enkripsi penuh kami (seperti yang ditunjukkan oleh panah hijau di sebelah kiri dalam diagram) dan dalam posting blog ini, kami akan menyelesaikan pengaturan enkripsi dengan enkripsi saat istirahat untuk membuat penyiapan replikasi MariaDB terenkripsi sepenuhnya.

Diagram berikut mengilustrasikan penyiapan kita saat ini dan penyiapan akhir yang akan kita capai:

Enkripsi Saat Istirahat

Enkripsi saat-rest berarti data-at-rest seperti file data dan log dienkripsi pada disk, membuat hampir tidak mungkin bagi seseorang untuk mengakses atau mencuri hard disk dan mendapatkan akses ke data asli (asalkan kuncinya diamankan dan tidak disimpan secara lokal). Enkripsi Data saat Istirahat, juga dikenal sebagai Enkripsi Data Transparan (TDE), didukung di MariaDB 10.1 dan yang lebih baru. Perhatikan bahwa menggunakan enkripsi memiliki overhead sekitar 5-10%, bergantung pada beban kerja dan jenis cluster.

Untuk MariaDB, komponen MariaDB berikut dapat dienkripsi saat tidak digunakan:

  • File data InnoDB (tablespace bersama atau tablespace individual, misalnya *.ibd dan ibdata1)
  • Data Aria dan file indeks.
  • Batalkan/ulangi log (file log InnoDB, mis., ib_logfile0 dan ib_logfile1).
  • Log biner/relai.
  • File dan tabel sementara.

Berkas berikut tidak dapat dienkripsi saat ini:

  • File metadata (misalnya file .frm).
  • Log umum berbasis file/log kueri lambat. Log umum berbasis tabel/log kueri lambat dapat dienkripsi.
  • Log kesalahan.

Enkripsi data-at-rest MariaDB memerlukan penggunaan manajemen kunci dan plugin enkripsi. Dalam posting blog ini, kita akan menggunakan Plugin Enkripsi Manajemen Kunci File, yang disediakan secara default sejak MariaDB 10.1.3. Perhatikan bahwa ada sejumlah kelemahan menggunakan plugin ini, misalnya, kuncinya masih dapat dibaca oleh root dan pengguna MySQL, seperti yang dijelaskan di halaman Enkripsi Data-at-Rest MariaDB.

Membuat File Kunci

Mari buat direktori khusus untuk menyimpan data enkripsi saat istirahat:

$ mkdir -p /etc/mysql/rest
$ cd /etc/mysql/rest

Buat file kunci. Ini adalah inti dari enkripsi:

$ openssl rand -hex 32 > /etc/mysql/rest/keyfile

Menambahkan string "1;" sebagai pengidentifikasi kunci ke dalam file kunci:

$ echo '1;' 
sed -i '1s/^/1;/' /etc/mysql/rest/keyfile

Jadi, saat membaca file kunci, seharusnya terlihat seperti ini:

$ cat /etc/mysql/rest/keyfile
1;4eb5770dcfa691bc634cbcd3c6bed9ed4ccd0111f3d3b1dae2c51a90fbf16ed7

Di atas hanya berarti untuk pengidentifikasi kunci 1, kuncinya adalah 4eb... File kunci harus berisi dua bagian informasi untuk setiap kunci enkripsi. Pertama, setiap kunci enkripsi perlu diidentifikasi dengan bilangan bulat 32-bit sebagai pengidentifikasi kunci. Kedua, kunci enkripsi itu sendiri perlu disediakan dalam bentuk hex-encoded. Kedua informasi ini harus dipisahkan dengan titik koma.

Buat sandi untuk mengenkripsi kunci di atas. Di sini kita akan menyimpan kata sandi di dalam file bernama "keyfile.passwd":

$ echo -n 'mySuperStrongPassword' > /etc/mysql/rest/keyfile.passwd

Anda dapat melewati langkah di atas jika Anda ingin menentukan kata sandi secara langsung di file konfigurasi menggunakan opsi file_key_management_filekey. Misalnya:file_key_management_filekey=mySuperStrongPassword

Tetapi dalam contoh ini, kita akan membaca kata sandi yang disimpan dalam sebuah file, sehingga kita harus mendefinisikan baris berikut di file konfigurasi nanti: 

file_key_management_filekey=FILE:/etc/mysql/encryption/keyfile.passwd

Kita akan mengenkripsi file kunci teks yang jelas ke file lain bernama keyfile.enc, menggunakan kata sandi di dalam file kata sandi:

$  openssl enc -aes-256-cbc -md sha1 -pass file:/etc/mysql/rest/keyfile.passwd -in /etc/mysql/rest/keyfile -out /etc/mysql/rest/keyfile.enc

Saat membuat daftar direktori, kita akan melihat 3 file ini:

$ ls -1 /etc/mysql/rest/
keyfile
keyfile.enc
keyfile.passwd

Isi keyfile.enc hanyalah versi terenkripsi dari keyfile:

Untuk mengujinya, kita dapat mendekripsi file terenkripsi menggunakan OpenSSL dengan menyediakan file kata sandi (keyfile.passwd):

$ openssl aes-256-cbc -d -md sha1 -pass file:/etc/mysql/rest/keyfile.passwd -in /etc/mysql/rest/keyfile.enc
1;4eb5770dcfa691bc634cbcd3c6bed9ed4ccd0111f3d3b1dae2c51a90fbf16ed7

Kami kemudian dapat menghapus kunci biasa karena kami akan menggunakan yang terenkripsi (.enc) bersama dengan file kata sandi:

$ rm -f /etc/mysql/encryption/keyfile

Sekarang kita dapat melanjutkan untuk mengonfigurasi enkripsi diam MariaDB.

Mengonfigurasi Enkripsi Saat Istirahat

Kita harus memindahkan file kunci terenkripsi dan kata sandi ke slave untuk digunakan oleh MariaDB untuk mengenkripsi/mendekripsi data. Jika tidak, tabel terenkripsi yang dicadangkan dari master menggunakan cadangan fisik seperti Cadangan MariaDB akan mengalami masalah untuk dibaca oleh budak (karena kombinasi kunci/kata sandi yang berbeda). Pencadangan logis seperti mysqldump harus bekerja dengan kunci dan kata sandi yang berbeda.

Pada slave, buat direktori untuk menyimpan barang enkripsi saat istirahat:

(slave1)$ mkdir -p /etc/mysql/rest
(slave2)$ mkdir -p /etc/mysql/rest

Pada master, salin file kunci dan sandi terenkripsi ke slave lainnya:

(master)$ cd /etc/mysql/rest
(master)$ scp keyfile.enc keyfile.passwd [email protected]:/etc/mysql/rest/
(master)$ scp keyfile.enc keyfile.passwd [email protected]:/etc/mysql/rest/

Lindungi file dari akses global dan tetapkan pengguna "mysql" sebagai kepemilikan:

$ chown mysql:mysql /etc/mysql/rest/*
$ chmod 600 /etc/mysql/rest/*

Tambahkan yang berikut ini ke dalam file konfigurasi MariaDB di bawah bagian [mysqld] atau [mariadb]:

# at-rest encryption
plugin_load_add              = file_key_management
file_key_management_filename = /etc/mysql/rest/keyfile.enc
file_key_management_filekey  = FILE:/etc/mysql/rest/keyfile.passwd
file_key_management_encryption_algorithm = AES_CBC

innodb_encrypt_tables            = ON
innodb_encrypt_temporary_tables  = ON
innodb_encrypt_log               = ON
innodb_encryption_threads        = 4
innodb_encryption_rotate_key_age = 1
encrypt-tmp-disk-tables          = 1
encrypt-tmp-files                = 1
encrypt-binlog                   = 1
aria_encrypt_tables              = ON

Perhatikan variabel file_key_management_filekey, jika kata sandi ada di dalam file, Anda harus mengawali path dengan "FILE:". Atau, Anda juga dapat menentukan string sandi secara langsung (tidak disarankan karena bertele-tele): 

file_key_management_filekey=mySuperStrongPassword

Mulai ulang server MariaDB satu node pada satu waktu, dimulai dengan slave:

(slave1)$ systemctl restart mariadb
(slave2)$ systemctl restart mariadb
(master)$ systemctl restart mariadb

Amati log kesalahan dan pastikan enkripsi MariaDB diaktifkan saat memulai:

$ tail -f /var/log/mysql/mysqld.log
...
2019-12-17  6:44:47 0 [Note] InnoDB: Encrypting redo log: 2*67108864 bytes; LSN=143311
2019-12-17  6:44:48 0 [Note] InnoDB: Starting to delete and rewrite log files.
2019-12-17  6:44:48 0 [Note] InnoDB: Setting log file ./ib_logfile101 size to 67108864 bytes
2019-12-17  6:44:48 0 [Note] InnoDB: Setting log file ./ib_logfile1 size to 67108864 bytes
2019-12-17  6:44:48 0 [Note] InnoDB: Renaming log file ./ib_logfile101 to ./ib_logfile0
2019-12-17  6:44:48 0 [Note] InnoDB: New log files created, LSN=143311
2019-12-17  6:44:48 0 [Note] InnoDB: 128 out of 128 rollback segments are active.
2019-12-17  6:44:48 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2019-12-17  6:44:48 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2019-12-17  6:44:48 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
2019-12-17  6:44:48 0 [Note] InnoDB: Waiting for purge to start
2019-12-17  6:44:48 0 [Note] InnoDB: 10.4.11 started; log sequence number 143311; transaction id 222
2019-12-17  6:44:48 0 [Note] InnoDB: Creating #1 encryption thread id 139790011840256 total threads 4.
2019-12-17  6:44:48 0 [Note] InnoDB: Creating #2 encryption thread id 139790003447552 total threads 4.
2019-12-17  6:44:48 0 [Note] InnoDB: Creating #3 encryption thread id 139789995054848 total threads 4.
2019-12-17  6:44:48 0 [Note] InnoDB: Creating #4 encryption thread id 139789709866752 total threads 4.
2019-12-17  6:44:48 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
2019-12-17  6:44:48 0 [Note] Plugin 'FEEDBACK' is disabled.
2019-12-17  6:44:48 0 [Note] Using encryption key id 1 for temporary files
...

Anda akan melihat baris yang menunjukkan inisialisasi enkripsi di log kesalahan. Pada titik ini, sebagian besar konfigurasi enkripsi telah selesai.

Menguji Enkripsi Anda

Buat database pengujian untuk diuji pada master:

(master)MariaDB> CREATE SCHEMA sbtest;
(master)MariaDB> USE sbtest;

Buat tabel standar tanpa enkripsi dan masukkan baris:

MariaDB> CREATE TABLE tbl_plain (id INT AUTO_INCREMENT PRIMARY KEY, data VARCHAR(255));
MariaDB> INSERT INTO tbl_plain SET data = 'test data';

Kita dapat melihat data yang tersimpan dalam teks yang jelas saat menelusuri file data InnoDB menggunakan alat hexdump:

$ xxd /var/lib/mysql/sbtest/tbl_plain.ibd | less
000c060: 0200 1c69 6e66 696d 756d 0002 000b 0000  ...infimum......
000c070: 7375 7072 656d 756d 0900 0000 10ff f180  supremum........
000c080: 0000 0100 0000 0000 0080 0000 0000 0000  ................
000c090: 7465 7374 2064 6174 6100 0000 0000 0000  test data.......
000c0a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

Buat tabel terenkripsi dan masukkan baris:

MariaDB> CREATE TABLE tbl_enc (id INT AUTO_INCREMENT PRIMARY KEY, data VARCHAR(255)) ENCRYPTED=YES;
MariaDB> INSERT INTO tbl_enc SET data = 'test data';

Kami tidak dapat mengetahui apa yang disimpan dalam file data InnoDB untuk tabel terenkripsi:

$ xxd /var/lib/mysql/sbtest/tbl_enc.ibd | less
000c060: 0c2c 93e4 652e 9736 e68a 8b69 39cb 6157  .,..e..6...i9.aW
000c070: 3cd1 581c 7eb9 84ca d792 7338 521f 0639  <.X.~.....s8R..9
000c080: d279 9eb3 d3f5 f9b0 eccb ed05 de16 f3ac  .y..............
000c090: 6d58 5519 f776 8577 03a4 fa88 c507 1b31  mXU..v.w.......1
000c0a0: a06f 086f 28d9 ac17 8923 9412 d8a5 1215  .o.o(....#......

Perhatikan bahwa file metadata tbl_enc.frm tidak dienkripsi saat diam. Hanya file data InnoDB (.ibd) yang dienkripsi.

Saat membandingkan log biner atau relai "polos", kita dapat melihat dengan jelas isinya menggunakan alat hexdump:

$ xxd binlog.000002 | less
0000560: 0800 0800 0800 0b04 726f 6f74 096c 6f63  ........root.loc
0000570: 616c 686f 7374 0047 5241 4e54 2052 454c  alhost.GRANT REL
0000580: 4f41 442c 4c4f 434b 2054 4142 4c45 532c  OAD,LOCK TABLES,
0000590: 5245 504c 4943 4154 494f 4e20 434c 4945  REPLICATION CLIE
00005a0: 4e54 2c45 5645 4e54 2c43 5245 4154 4520  NT,EVENT,CREATE
00005b0: 5441 424c 4553 5041 4345 2c50 524f 4345  TABLESPACE,PROCE
00005c0: 5353 2c43 5245 4154 452c 494e 5345 5254  SS,CREATE,INSERT
00005d0: 2c53 454c 4543 542c 5355 5045 522c 5348  ,SELECT,SUPER,SH
00005e0: 4f57 2056 4945 5720 4f4e 202a 2e2a 2054  OW VIEW ON *.* T

Sementara untuk log biner terenkripsi, kontennya terlihat tidak masuk akal:

$ xxd binlog.000004 | less
0000280: 4a1d 1ced 2f1b db50 016a e1e9 1351 84ba  J.../..P.j...Q..
0000290: 38b6 72e7 8743 7713 afc3 eecb c36c 1b19  8.r..Cw......l..
00002a0: 7b3f 6176 208f 0000 00dc 85bf 6768 e7c6  {?av .......gh..
00002b0: 6107 5bea 241c db12 d50c 3573 48e5 3c3d  a.[.$.....5sH.<=
00002c0: 3179 1653 2449 d408 1113 3e25 d165 c95b  1y.S$I....>%.e.[
00002d0: afb0 6778 4b26 f672 1bc7 567e da96 13f5  ..gxK&.r..V~....
00002e0: 2ac5 b026 3fb9 4b7a 3ef4 ab47 6c9f a686  *..&?.Kz>..Gl...

Mengenkripsi Tabel Aria

Untuk mesin penyimpanan Aria, ini tidak mendukung opsi ENCRYPTED dalam pernyataan CREATE/ALTER karena mengikuti opsi global aria_encrypt_tables. Oleh karena itu, saat membuat tabel Aria, cukup buat tabel dengan opsi ENGINE=Aria:

MariaDB> CREATE TABLE tbl_aria_enc (id INT AUTO_INCREMENT PRIMARY KEY, data VARCHAR(255)) ENGINE=Aria;
MariaDB> INSERT INTO tbl_aria_enc(data) VALUES ('test data');
MariaDB> FLUSH TABLE tbl_aria_enc;

Kami kemudian dapat memverifikasi konten file data tabel (tbl_aria_enc.MAD) atau file indeks (tbl_aria_enc.MAI) dengan alat hexdump. Untuk mengenkripsi tabel Aria yang ada, tabel perlu dibuat ulang:

MariaDB> ALTER TABLE db.aria_table ENGINE=Aria ROW_FORMAT=PAGE;

Pernyataan ini menyebabkan Aria membangun kembali tabel menggunakan opsi tabel ROW_FORMAT. Dalam prosesnya, dengan pengaturan default baru, tabel akan dienkripsi saat menulis ke disk.

Mengenkripsi Log Umum/Log Kueri Lambat

Untuk mengenkripsi log kueri umum dan lambat, kita dapat menyetel opsi log_output MariaDB ke 'TABLE' alih-alih default 'FILE':

MariaDB> SET GLOBAL log_ouput = 'TABLE';

Namun, MariaDB secara default akan membuat tabel yang diperlukan menggunakan mesin penyimpanan CSV, yang tidak dienkripsi oleh MariaDB. Tidak ada mesin selain CSV, MyISAM atau Aria yang legal untuk tabel log. Triknya adalah membangun kembali tabel CSV default dengan mesin penyimpanan Aria, asalkan opsi aria_encrypt_tables disetel ke ON. Namun, opsi log masing-masing harus dimatikan agar perubahan tabel berhasil.

Jadi, langkah-langkah untuk mengenkripsi tabel log umum adalah:

MariaDB> SET GLOBAL general_log = OFF;
MariaDB> ALTER TABLE mysql.general_log ENGINE=Aria;
MariaDB> SET GLOBAL general_log = ON;

Demikian pula, untuk log kueri lambat:

MariaDB> SET GLOBAL slow_query_log = OFF;
MariaDB> ALTER TABLE mysql.slow_log ENGINE=Aria;
MariaDB> SET GLOBAL slow_query_log = ON;

Verifikasi keluaran log umum di dalam server:

MariaDB> SELECT * FROM mysql.general_log;
+----------------------------+---------------------------+-----------+-----------+--------------+------------------------------+
| event_time                 | user_host                 | thread_id | server_id | command_type | argument                     |
+----------------------------+---------------------------+-----------+-----------+--------------+------------------------------+
| 2019-12-17 07:45:53.109558 | root[root] @ localhost [] |        19 |     28001 |        Query | select * from sbtest.tbl_enc |
| 2019-12-17 07:45:55.504710 | root[root] @ localhost [] |        20 |     28001 |        Query | select * from general_log    |
+----------------------------+---------------------------+-----------+-----------+--------------+------------------------------+

Serta konten terenkripsi dari file data Aria di dalam direktori data menggunakan alat hexdump:

$ xxd /var/lib/mysql/mysql/general_log.MAD | less
0002040: 1d45 820d 7c53 216c 3fc6 98a6 356e 1b9e  .E..|S!l?...5n..
0002050: 6bfc e193 7509 1fa7 31e2 e22a 8f06 3c6f  k...u...1..*..<o
0002060: ae71 bb63 e81b 0b08 7120 0c99 9f82 7c33  .q.c....q ....|3
0002070: 1117 bc02 30c1 d9a7 c732 c75f 32a6 e238  ....0....2._2..8
0002080: d1c8 5d6f 9a08 455a 8363 b4f4 5176 f8a1  ..]o..EZ.c..Qv..
0002090: 1bf8 113c 9762 3504 737e 917b f260 f88c  ...<.b5.s~.{.`..
00020a0: 368e 336f 9055 f645 b636 c5c1 debe fbe7  6.3o.U.E.6......
00020b0: d01e 028f 8b75 b368 0ef0 8889 bb63 e032  .....u.h.....c.2

Enkripsi diam MariaDB sekarang selesai. Gabungkan ini dengan enkripsi dalam perjalanan yang telah kita lakukan di posting pertama, arsitektur akhir kita sekarang terlihat seperti ini:

Kesimpulan

Sekarang mungkin untuk mengamankan database MariaDB Anda sepenuhnya melalui enkripsi untuk perlindungan terhadap pelanggaran atau pencurian fisik dan virtual. ClusterControl dapat membantu Anda menjaga jenis keamanan ini juga dan Anda dapat mengunduhnya secara gratis di sini.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pindah ke Cadangan MariaDB

  2. Bagaimana ADDTIME() Bekerja di MariaDB

  3. Pemulihan Bencana Cloud untuk MariaDB dan MySQL

  4. Mengimpor Partisi InnoDB di MariaDB 10.0/10.1

  5. Bagaimana PERIOD_ADD() Bekerja di MariaDB