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

Memindahkan Database MariaDB ke Status Terenkripsi dan Tidak Terenkripsi

Di blog ini, kami menyajikan cara untuk memindahkan database yang ada terlebih dahulu ke status terenkripsi, lalu cara memindahkan database Anda ke status tidak terenkripsi.

Untuk menggunakan enkripsi, Anda perlu memuat plugin untuk mengelola kunci enkripsi. Lihat plugin enkripsi yang saat ini didukung. Setiap kunci menggunakan integer 32-bit sebagai pengidentifikasi kunci (key_id) dan kunci sebenarnya. Kunci dapat diversi sehingga data dienkripsi ulang dari kunci lama ke versi kunci yang lebih baru. Di blog ini, kita akan menggunakan plugin manajemen kunci file sebagai contoh (lihat manajemen kunci enkripsi). Kami juga berasumsi bahwa Anda menggunakan Server MariaDB versi terbaru (blog ini mengasumsikan bahwa MDEV-15566 sudah diperbaiki, yaitu versi MariaDB seharusnya 10.1.33, 10.2.15, atau 10.3.6).

Memindahkan database ke status terenkripsi atau tidak terenkripsi dilakukan menggunakan rotasi_kunci. Rotasi kunci memindahkan database dari status terenkripsi yang ada ke status terenkripsi lainnya. Perhatikan bahwa di sini tablespace tidak boleh memiliki status terenkripsi (yaitu tablespace tidak terenkripsi) atau tablespace dapat memiliki status enkripsi yang dipindahkan ke status tidak terenkripsi. Rotasi kunci dapat terjadi secara berkala (berdasarkan variabel konfigurasi innodb-encryption-rotate-key-age yaitu berapa lama kunci dapat sebelum diputar), diminta oleh administrator basis data (misalnya dengan mengeluarkan set global innodb_encrypt_tables=ON; ) atau dengan sistem manajemen kunci enkripsi (lihat misalnya kunci putar).

Administrator database perlu membuat keputusan apakah cukup untuk mengenkripsi tabel individual saja (lihat mengenkripsi data untuk InnoDB) atau seluruh database termasuk tablespace sistem. Perhatikan bahwa data tabel juga ditulis untuk mengulang log dan membatalkan log. Jadi, jika database berisi tabel yang berisi data yang sangat sensitif innodb-encrypt-log juga harus diaktifkan. Di blog ini, kami menunjukkan cara mengenkripsi seluruh basis data.

Memindahkan database ke status terenkripsi

Sebelum database dapat dipindahkan ke keadaan terenkripsi, kita perlu menambahkan konfigurasi plugin enkripsi ke file konfigurasi (lihat deskripsi rinci tentang parameter):

# File Key Management
plugin-load-add = file_key_management
file-key-management-filename = /mnt/flash/keys.txt
file-key-management-encryption-algorithm = aes_ctr

# InnoDB encryption setup
innodb-encrypt-tables=ON
innodb-encrypt-log=ON
innodb-encryption-rotate-key-age=1024
innodb-encryption-threads=4
innodb-tablespaces-encryption

Setelah restart kemajuan operasi enkripsi dapat dipantau dari tabel INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION. Dalam contoh berikut, kami menanyakan nama tablespace, halaman saat ini di bawah rotasi kunci dan halaman maksimum di tablespace untuk tabel yang belum dienkripsi:

MariaDB [(none)]> select name, KEY_ROTATION_PAGE_NUMBER, KEY_ROTATION_MAX_PAGE_NUMBER from information_schema.innodb_tablespaces_encryption where min_key_version = 0 or ROTATING_OR_FLUSHING = 1;
+---------------+--------------------------+------------------------------+
| name          | KEY_ROTATION_PAGE_NUMBER | KEY_ROTATION_MAX_PAGE_NUMBER |
+---------------+--------------------------+------------------------------+
| innodb_system |                    17641 |                      1397504 |
+---------------+--------------------------+------------------------------+
1 row in set (0.000 sec)

Secara alami, Anda juga dapat menanyakan status semua tabel:

MariaDB [tpcc1000]> select * from information_schema.innodb_tablespaces_encryption;
+-------+-------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
| SPACE | NAME              | ENCRYPTION_SCHEME | KEYSERVER_REQUESTS | MIN_KEY_VERSION | CURRENT_KEY_VERSION | KEY_ROTATION_PAGE_NUMBER | KEY_ROTATION_MAX_PAGE_NUMBER | CURRENT_KEY_ID | ROTATING_OR_FLUSHING |
+-------+-------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
|     0 | innodb_system     |                 1 |                  1 |               1 |                   1 |                     NULL |                         NULL |              1 |                    0 |
|     3 | tpcc1000/customer |                 1 |                  1 |               0 |                   1 |                     2401 |                      1317888 |              1 |                    1 |
+-------+-------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
2 rows in set (0.000 sec)

Dari sini kita dapat melihat bahwa tablespace sistem sudah dienkripsi tetapi pelanggan tabel dari database tpcc1000 saat ini sedang dienkripsi. Jika sistem Anda memiliki sumber daya perangkat keras dan proses enkripsi tampak lambat, Anda dapat mencoba parameter berikut:

# Set close to number of cores
set global innodb_encryption_threads=16;
# For SSD increase number of I/O operations used for encryption in second
set global innodb_encryption_rotation_iops=40000;

Enkripsi database selesai jika tidak ada tabel dalam status tidak terenkripsi:

MariaDB [tpcc1000]> select name, KEY_ROTATION_PAGE_NUMBER, KEY_ROTATION_MAX_PAGE_NUMBER from information_schema.innodb_tablespaces_encryption where min_key_version = 0 or ROTATING_OR_FLUSHING = 1;
Empty set (0.001 sec)

Dan untuk memverifikasi, buat daftar semua tabel yang dienkripsi:

MariaDB [tpcc1000]> select * from information_schema.innodb_tablespaces_encryption where min_key_version != 0;
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
| SPACE | NAME                | ENCRYPTION_SCHEME | KEYSERVER_REQUESTS | MIN_KEY_VERSION | CURRENT_KEY_VERSION | KEY_ROTATION_PAGE_NUMBER | KEY_ROTATION_MAX_PAGE_NUMBER | CURRENT_KEY_ID | ROTATING_OR_FLUSHING |
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
|     0 | innodb_system       |                 1 |                  1 |               1 |                   1 |                     NULL |                         NULL |              1 |                    0 |
|     3 | tpcc1000/customer   |                 1 |                  1 |               1 |                   1 |                     NULL |                         NULL |              1 |                    0 |
|     2 | tpcc1000/district   |                 1 |                  1 |               1 |                   1 |                     NULL |                         NULL |              1 |                    0 |
|     4 | tpcc1000/history    |                 1 |                  1 |               1 |                   1 |                     NULL |                         NULL |              1 |                    0 |
|     8 | tpcc1000/item       |                 1 |                  1 |               1 |                   1 |                     NULL |                         NULL |              1 |                    0 |
|     5 | tpcc1000/new_orders |                 1 |                  1 |               1 |                   1 |                     NULL |                         NULL |              1 |                    0 |
|     7 | tpcc1000/order_line |                 1 |                  1 |               1 |                   1 |                     NULL |                         NULL |              1 |                    0 |
|     6 | tpcc1000/orders     |                 1 |                  1 |               1 |                   1 |                     NULL |                         NULL |              1 |                    0 |
|     9 | tpcc1000/stock      |                 1 |                  1 |               1 |                   1 |                     NULL |                         NULL |              1 |                    0 |
|     1 | tpcc1000/warehouse  |                 1 |                  1 |               1 |                   1 |                     NULL |                         NULL |              1 |                    0 |
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
10 rows in set (0.000 sec)

Seperti yang dapat dilihat, semua tablespace menggunakan ENCRYPTION_SCHEME=1 (terenkripsi) dan MIN_KEY_VERSION=1 . Setelah fase ini, administrator database harus mempertimbangkan untuk mengurangi jumlah utas enkripsi yang digunakan dan iops rotasi. Selanjutnya, kebutuhan untuk rotasi kunci lebih lanjut juga harus dipertimbangkan karena plugin manajemen kunci file tidak mendukung rotasi kunci yang sebenarnya. Rotasi kunci dapat dinonaktifkan menggunakan innodb-encryption-rotate-key-age=0 . Perhatikan bahwa bahkan dengan pengaturan itu, semua tabel baru yang dibuat akan dipertimbangkan untuk enkripsi.

Memindahkan database ke status tidak terenkripsi

Di sini kami berasumsi bahwa Anda memiliki database yang dienkripsi dan tidak ada lagi kebutuhan untuk mengenkripsi data atau perlindungan data dilakukan secara berbeda. Kami akan menggunakan database yang sama sebagai contoh seperti dalam memindahkan database ke keadaan terenkripsi. Pada titik ini tidak perlu me-restart server. Alih-alih memindahkan database ke status tidak terenkripsi dapat dilakukan sebagai operasi online. Pertama, administrator database harus memeriksa bahwa tidak ada tabel yang menggunakan enkripsi eksplisit yaitu ada tabel di mana buat tabel menggunakan opsi tabel ENCRYPTED=YES. Sekarang memindahkan database ke status tidak terenkripsi dapat dilakukan dengan mudah dengan mengeluarkan:

SET GLOBAL innodb_encrypt_tables=OFF;

Ini akan mulai membuka enkripsi semua tablespace termasuk tablespace sistem dan kemajuan operasi ini dapat dipantau oleh:

MariaDB [tpcc1000]> select * from information_schema.innodb_tablespaces_encryption where min_key_version != 0;
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
| SPACE | NAME                | ENCRYPTION_SCHEME | KEYSERVER_REQUESTS | MIN_KEY_VERSION | CURRENT_KEY_VERSION | KEY_ROTATION_PAGE_NUMBER | KEY_ROTATION_MAX_PAGE_NUMBER | CURRENT_KEY_ID | ROTATING_OR_FLUSHING |
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
|     7 | tpcc1000/order_line |                 1 |                  1 |               1 |                   1 |                    76564 |                      1947904 |              1 |                    1 |
|     6 | tpcc1000/orders     |                 1 |                  1 |               1 |                   1 |                     NULL |                         NULL |              1 |                    0 |
|     9 | tpcc1000/stock      |                 1 |                  1 |               1 |                   1 |                     NULL |                         NULL |              1 |                    0 |
|     1 | tpcc1000/warehouse  |                 1 |                  1 |               1 |                   1 |                     NULL |                         NULL |              1 |                    0 |
|    10 | tpcc1000/t1         |                 1 |                  1 |               1 |                   1 |                     NULL |                         NULL |              1 |                    0 |
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
5 rows in set (0.001 sec)

Dari sini kita dapat melihat bahwa tabel order_line dari database tpcc1000 sedang diputar. Operasi selesai ketika tidak ada tabel yang menggunakan enkripsi yaitu memiliki min_key_version !=0.

MariaDB [tpcc1000]> select * from information_schema.innodb_tablespaces_encryption where min_key_version != 0 or rotating_or_flushing = 1;
Empty set (0.000 sec)

Jika pengaturan enkripsi perlu dihapus dari konfigurasi sekarang adalah waktu untuk mematikan server. Jika konfigurasi menggunakan enkripsi redo log yaitu innodb-encrypt-log=ON  ambil cadangan dari database Anda termasuk file log InnoDB dan setelah itu hapus file log InnoDB karena tidak dapat digunakan jika berisi data terenkripsi.

rm -rf ib_logfile*

Hapus pengaturan enkripsi dari konfigurasi dan mulai ulang server. Sekarang Anda memiliki instance database di mana tidak ada enkripsi yang digunakan.

Kesimpulan

Memindahkan database ke status terenkripsi seperti yang terlihat di atas memerlukan server untuk dihidupkan ulang dan memerlukan konfigurasi plugin enkripsi yang cermat. Berapa lama operasi ini berlangsung tergantung pada jumlah tabel dan seberapa besar tabel ini. Kami telah menyajikan cara untuk memantau kemajuan ini dan cara mempercepatnya jika perangkat keras yang digunakan memiliki sumber daya yang cukup. Memindahkan database ke status tidak terenkripsi hanya memerlukan pengaturan satu variabel global. Namun, jika enkripsi lebih lama diperlukan dan ada kebutuhan untuk menghapus semua referensi untuk itu, ada kebutuhan untuk satu restart. Kami telah menunjukkan cara memantau transisi ini dan cara menghapus sepenuhnya penyiapan enkripsi dari database dan konfigurasi.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggabungkan Kekuatan SQL dan Pernyataan Prosedural dengan Mode Kompatibilitas Oracle MariaDB

  2. Pengantar Penerapan MySQL Menggunakan Peran yang Mungkin

  3. String Format Tanggal MariaDB

  4. Bagaimana PI() Bekerja di MariaDB

  5. Menjalankan Vitess dan MySQL dengan ClusterControl