I den här bloggen presenterar vi ett sätt att flytta en befintlig databas först till ett krypterat tillstånd och sedan hur du flyttar din databas till ett okrypterat tillstånd.
För att använda kryptering måste du ladda ett plugin för att hantera krypteringsnycklarna. Se krypteringsplugin som stöds för närvarande. Varje nyckel använder ett 32-bitars heltal som nyckelidentifierare (key_id) och faktisk nyckel. Nycklar kan versioneras så att data omkrypteras från äldre nyckel till nyare version av nyckeln. I den här bloggen kommer vi att använda plugin för filnyckelhantering som ett exempel (se hantering av krypteringsnyckel). Vi antar också att du använder den senaste versionen av MariaDB Server (den här bloggen förutsätter att MDEV-15566 är fixad, dvs. MariaDB-versionen ska vara 10.1.33, 10.2.15 eller 10.3.6).
Att flytta en databas till ett krypterat tillstånd eller till ett okrypterat tillstånd görs med en nyckelrotation. Nyckelrotation flyttar databasen från ett befintligt krypterat tillstånd till ett annat. Observera att här kan tabellutrymmet inte ha något krypterat tillstånd (dvs. tabellutrymmet är okrypterat) eller att tabellutrymmet kan ha ett krypteringsläge som flyttas till ett okrypterat tillstånd. Nyckelrotation kan ske med jämna mellanrum (baserat på konfigurationsvariabeln innodb-encryption-rotate-key-age d.v.s. hur gammal nyckel kan vara innan den roteras), begärd av databasadministratören (t.ex. genom att utfärda set global innodb_encrypt_tables=ON; ) eller med krypteringsnyckelhanteringssystem (se t.ex. rotera nycklar).
Databasadministratörer måste fatta beslutet om det räcker att endast kryptera enskilda tabeller (se krypteringsdata för InnoDB) eller hela databasen inklusive systemtabellutrymmet. Observera att tabelldata också skrivs för att göra om logg och ångra logg. Således, om databasen innehåller tabeller som innehåller mycket känsliga data innodb-encrypt-log bör också vara aktiverad. I den här bloggen visar vi hur man krypterar hela databasen.
Flyttar databasen till krypterat tillstånd
Innan databasen kan flyttas till ett krypterat tillstånd måste vi lägga till en krypteringspluginkonfiguration till konfigurationsfilen (se detaljerad beskrivning av parametrar):
# 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
Efter omstart kan krypteringsförloppet övervakas från tabellen INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION. I följande exempel frågar vi namn på tabellutrymme, aktuell sida under nyckelrotation och maximal sida i tabellutrymmet för de tabeller som ännu inte är krypterade:
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)
Naturligtvis kan du också fråga status för alla tabeller:
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)
Av detta kan vi se att systemets tabellutrymme redan är krypterat men tabellkund från databasen tpcc1000 krypteras för närvarande. Om ditt system har hårdvaruresurser och krypteringsprocessen verkar långsam kan du prova följande parametrar:
# 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;
Databaskrypteringen är klar när det inte finns några tabeller i okrypterat tillstånd:
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)
Och för att verifiera, lista alla tabeller som är krypterade:
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)
Som kan ses använder alla tabellutrymmen ENCRYPTION_SCHEME=1 (krypterad) och MIN_KEY_VERSION=1 . Efter denna fas bör databasadministratören överväga att minska antalet använda krypteringstrådar och rotation iops. Dessutom bör behovet av ytterligare nyckelrotation också övervägas eftersom filnyckelhanteringspluginet inte stöder riktig nyckelrotation. Nyckelrotation kan inaktiveras med innodb-encryption-rotate-key-age=0 . Observera att även med den inställningen anses alla nya tabeller som skapas för kryptering.
Flyttar databasen till okrypterat tillstånd
Här utgår vi från att du har en databas som är krypterad och att det inte längre finns behov av att kryptera data eller så görs dataskyddet annorlunda. Vi kommer att använda samma databas som ett exempel som när vi flyttar databas till krypterat tillstånd. Vid denna tidpunkt finns det inget behov av att starta om servern. Istället kan man flytta databasen till okrypterat tillstånd som en onlineoperation. Först bör databasadministratören kontrollera att det inte finns några tabeller som använder explicit kryptering, dvs det finns en tabell där skapa tabell används ENCRYPTED=YES tabellalternativ. Att nu flytta databasen till ett okrypterat tillstånd kan enkelt göras genom att utfärda:
SET GLOBAL innodb_encrypt_tables=OFF;
Detta kommer att börja avkryptera alla tabellutrymmen inklusive systemets tabellutrymme och förloppet för denna operation kan övervakas av:
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)
Av detta kan vi se att tabellen order_line från databasen tpcc1000 roteras. Operationen är klar när det inte finns några tabeller som använder kryptering, dvs. har 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)
Om krypteringsinställningarna behöver tas bort från konfigurationen är det nu dags att stänga av servern. Om konfigurationen använder gör om loggkryptering, dvs. innodb-encrypt-log=ON ta säkerhetskopior från din databas inklusive InnoDB-loggfiler och ta sedan bort InnoDB-loggfiler eftersom de är oanvändbara om de innehåller krypterad data.
rm -rf ib_logfile*
Ta bort krypteringsinställningarna från konfigurationen och starta om servern. Nu har du en databasinstans där ingen kryptering används.
Slutsats
Att flytta en databas till ett krypterat tillstånd enligt ovan kräver att servern startas om och kräver en noggrann konfiguration av krypteringsplugin. Hur lång tid denna operation tar beror på antalet bord och hur stora dessa bord är. Vi har presenterat ett sätt att övervaka detta framsteg och hur man kan snabba upp det om den använda hårdvaran har tillräckligt med resurser. Att flytta en databas till ett okrypterat tillstånd kräver bara inställning av en global variabel. Men om kryptering behövs längre och det finns ett behov av att ta bort alla referenser till den, finns det ett behov av en omstart. Vi har visat hur man övervakar denna övergång och hur man helt tar bort krypteringsinställningar från både databasen och konfigurationen.