In diesem Blog stellen wir eine Möglichkeit vor, eine vorhandene Datenbank zuerst in einen verschlüsselten Zustand zu versetzen und dann, wie Sie Ihre Datenbank in einen unverschlüsselten Zustand versetzen.
Um die Verschlüsselung zu verwenden, müssen Sie ein Plugin laden, um die Verschlüsselungsschlüssel zu verwalten. Siehe derzeit unterstützte Verschlüsselungs-Plugins. Jeder Schlüssel verwendet eine 32-Bit-Ganzzahl als Schlüsselkennung (key_id) und tatsächlichen Schlüssel. Schlüssel können versioniert werden, sodass Daten von einem älteren Schlüssel zu einer neueren Version des Schlüssels neu verschlüsselt werden. In diesem Blog verwenden wir als Beispiel ein Plugin zur Verwaltung von Dateischlüsseln (siehe Verwaltung von Verschlüsselungsschlüsseln). Wir gehen außerdem davon aus, dass Sie die neueste Version von MariaDB Server verwenden (dieser Blog geht davon aus, dass MDEV-15566 behoben ist, d. h. die MariaDB-Version sollte 10.1.33, 10.2.15 oder 10.3.6 sein).
Das Verschieben einer Datenbank in einen verschlüsselten Zustand oder in einen unverschlüsselten Zustand erfolgt mit einer key_rotation. Die Schlüsselrotation verschiebt die Datenbank von einem vorhandenen verschlüsselten Zustand in einen anderen. Beachten Sie, dass der Tabellenbereich hier keinen verschlüsselten Zustand haben könnte (d. h. der Tabellenbereich ist unverschlüsselt) oder der Tabellenbereich einen Verschlüsselungszustand haben könnte, der in einen unverschlüsselten Zustand versetzt wird. Die Schlüsselrotation kann regelmäßig stattfinden (basierend auf der Konfigurationsvariablen innodb-encryption-rotate-key-age wie alt der Schlüssel sein kann, bevor er rotiert wird), vom Datenbankadministrator angefordert (z. B. durch Ausgabe von set global innodb_encrypt_tables=ON).; ) oder durch ein Verwaltungssystem für Verschlüsselungsschlüssel (siehe z. B. Rotationsschlüssel).
Datenbankadministratoren müssen entscheiden, ob es ausreicht, nur einzelne Tabellen (siehe Daten für InnoDB verschlüsseln) oder die gesamte Datenbank einschließlich System-Tablespace zu verschlüsseln. Beachten Sie, dass Tabellendaten auch in das Redo-Log und das Undo-Log geschrieben werden. Wenn also die Datenbank Tabellen enthält, die sehr sensible Daten enthalten innodb-encrypt-log sollte auch aktiviert sein. In diesem Blog zeigen wir, wie man die gesamte Datenbank verschlüsselt.
Verschieben der Datenbank in den verschlüsselten Zustand
Bevor die Datenbank in einen verschlüsselten Zustand versetzt werden kann, müssen wir die Verschlüsselungs-Plugin-Konfiguration zur Konfigurationsdatei hinzufügen (siehe detaillierte Beschreibung der 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
Nach dem Neustart kann der Fortschritt des Verschlüsselungsvorgangs in der Tabelle INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION überwacht werden. Im folgenden Beispiel fragen wir den Namen des Tablespace, die aktuelle Seite unter Schlüsselrotation und die maximale Seite im Tablespace für die Tabellen ab, die noch nicht verschlüsselt sind:
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)
Natürlich können Sie auch den Status aller Tabellen abfragen:
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)
Daraus können wir ersehen, dass der System-Tablespace bereits verschlüsselt ist, aber der Tabellenkunde aus der Datenbank tpcc1000 gerade verschlüsselt wird. Wenn Ihr System über Hardwareressourcen verfügt und der Verschlüsselungsprozess langsam erscheint, können Sie die folgenden Parameter ausprobieren:
# 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;
Die Datenbankverschlüsselung ist abgeschlossen, wenn keine Tabellen in einem unverschlüsselten Zustand vorhanden sind:
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)
Listen Sie zur Überprüfung alle Tabellen auf, die verschlüsselt sind:
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)
Wie man sieht, verwenden alle Tablespaces ENCRYPTION_SCHEME=1 (verschlüsselt) und MIN_KEY_VERSION=1 . Nach dieser Phase sollte der Datenbankadministrator erwägen, die Anzahl der verwendeten Verschlüsselungsthreads und Rotations-IOPS zu verringern. Darüber hinaus sollte auch die Notwendigkeit einer weiteren Schlüsselrotation berücksichtigt werden, da das File Key Management Plugin keine echte Schlüsselrotation unterstützt. Die Schlüsselrotation kann mit innodb-encryption-rotate-key-age=0 deaktiviert werden . Beachten Sie, dass auch bei diesem Setup alle neu erstellten Tabellen für die Verschlüsselung berücksichtigt werden.
Verschieben der Datenbank in den unverschlüsselten Zustand
Hier gehen wir davon aus, dass Sie eine verschlüsselte Datenbank haben und keine Notwendigkeit mehr besteht, Daten zu verschlüsseln oder der Datenschutz anders gehandhabt wird. Wir verwenden dieselbe Datenbank als Beispiel wie beim Verschieben der Datenbank in den verschlüsselten Zustand. Zu diesem Zeitpunkt ist es nicht erforderlich, den Server neu zu starten. Stattdessen kann das Verschieben der Datenbank in den unverschlüsselten Zustand als Online-Vorgang durchgeführt werden. Zuerst sollte der Datenbankadministrator überprüfen, ob es keine Tabellen gibt, die eine explizite Verschlüsselung verwenden, d. h. es gibt eine Tabelle, bei der die Tabellenoption ENCRYPTED=YES zum Erstellen einer Tabelle verwendet wurde. Jetzt kann die Datenbank in einen unverschlüsselten Zustand versetzt werden, indem einfach Folgendes ausgegeben wird:
SET GLOBAL innodb_encrypt_tables=OFF;
Dies beginnt mit der Entschlüsselung aller Tabellenbereiche, einschließlich des System-Tabellenbereichs, und der Fortschritt dieses Vorgangs kann überwacht werden durch:
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)
Daraus können wir erkennen, dass die Tabelle order_line aus der Datenbank tpcc1000 gedreht wird. Die Operation ist beendet, wenn es keine Tabellen gibt, die Verschlüsselung verwenden, d. h. min_key_version !=0 haben.
MariaDB [tpcc1000]> select * from information_schema.innodb_tablespaces_encryption where min_key_version != 0 or rotating_or_flushing = 1;
Empty set (0.000 sec)
Wenn das Verschlüsselungssetup aus der Konfiguration entfernt werden muss, ist es jetzt an der Zeit, den Server herunterzufahren. Wenn die Konfiguration Redo-Log-Verschlüsselung verwendet, d. h. innodb-encrypt-log=ON Machen Sie Backups von Ihrer Datenbank, einschließlich der InnoDB-Protokolldateien, und entfernen Sie danach die InnoDB-Protokolldateien, da sie unbrauchbar sind, wenn sie verschlüsselte Daten enthalten.
rm -rf ib_logfile*
Entfernen Sie die Verschlüsselungseinrichtung aus der Konfiguration und starten Sie den Server neu. Jetzt haben Sie eine Datenbankinstanz, in der keine Verschlüsselung verwendet wird.
Schlussfolgerung
Das Verschieben einer Datenbank in einen verschlüsselten Zustand, wie oben gezeigt, erfordert einen Neustart des Servers und eine sorgfältige Konfiguration des Verschlüsselungs-Plugins. Wie lange dieser Vorgang dauert, hängt von der Anzahl der Tabellen und der Größe dieser Tabellen ab. Wir haben eine Möglichkeit vorgestellt, diesen Fortschritt zu überwachen und zu beschleunigen, wenn die verwendete Hardware über genügend Ressourcen verfügt. Um eine Datenbank in einen unverschlüsselten Zustand zu versetzen, muss nur eine globale Variable gesetzt werden. Wenn die Verschlüsselung jedoch länger benötigt wird und alle Verweise darauf entfernt werden müssen, ist ein Neustart erforderlich. Wir haben gezeigt, wie man diesen Übergang überwacht und wie man die Verschlüsselungseinrichtung sowohl aus der Datenbank als auch aus der Konfiguration vollständig entfernt.