sql >> Database >  >> RDS >> MariaDB

Een MariaDB-database verplaatsen naar versleutelde en niet-versleutelde toestanden

In deze blog presenteren we een manier om een ​​bestaande database eerst naar een versleutelde staat te verplaatsen en vervolgens hoe u uw database naar een niet-versleutelde staat kunt verplaatsen.

Om codering te gebruiken, moet u een plug-in laden om de coderingssleutels te beheren. Zie momenteel ondersteunde versleutelingsplug-ins. Elke sleutel gebruikt een 32-bits geheel getal als sleutel-ID (key_id) en werkelijke sleutel. Sleutels kunnen worden geversied, zodat gegevens opnieuw worden versleuteld van een oudere sleutel naar een nieuwere versie van de sleutel. In deze blog zullen we de plug-in voor bestandssleutelbeheer als voorbeeld gebruiken (zie Encryptiesleutelbeheer). We gaan er ook van uit dat je de meest recente versie van MariaDB Server gebruikt (in deze blog wordt ervan uitgegaan dat MDEV-15566 is opgelost, d.w.z. de MariaDB-versie moet 10.1.33, 10.2.15 of 10.3.6 zijn).

Het verplaatsen van een database naar een versleutelde of niet-versleutelde status wordt gedaan met behulp van een key_rotation. Sleutelrotatie verplaatst de database van een bestaande versleutelde status naar een andere. Merk op dat tablespace hier geen versleutelde status kan hebben (d.w.z. tablespace is niet-versleuteld) of tablespace kan een versleutelingsstatus hebben die wordt verplaatst naar een niet-versleutelde status. Sleutelrotatie kan periodiek plaatsvinden (op basis van configuratievariabele innodb-encryption-rotate-key-age d.w.z. hoe oud de sleutel mag zijn voordat deze wordt geroteerd), aangevraagd door de databasebeheerder (bijv. door set global innodb_encrypt_tables=ON uit te geven; ) of door een beheersysteem voor versleutelingssleutels (zie bijv. sleutels roteren).

Databasebeheerders moeten beslissen of het voldoende is om alleen afzonderlijke tabellen te versleutelen (zie gegevens versleutelen voor InnoDB) of de hele database inclusief systeemtabelruimte. Merk op dat tabelgegevens ook worden geschreven om log opnieuw uit te voeren en log ongedaan te maken. Dus als de database tabellen bevat die zeer gevoelige gegevens bevatten innodb-encrypt-log moet ook worden ingeschakeld. In deze blog laten we zien hoe je de hele database versleutelt.

Database verplaatsen naar versleutelde staat

Voordat de database naar een versleutelde staat kan worden verplaatst, moeten we de configuratie van de versleutelingsplug-in toevoegen aan het configuratiebestand (zie gedetailleerde beschrijving over parameters):

# 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

Na het opnieuw opstarten kan de voortgang van de coderingsbewerking worden gevolgd vanuit de tabel INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION. In het volgende voorbeeld vragen we de naam van de tabelruimte, de huidige pagina onder sleutelrotatie en de maximale pagina in de tabelruimte voor de tabellen die nog niet versleuteld zijn:

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)

Uiteraard kunt u ook de status van alle tabellen opvragen:

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)

Hieruit kunnen we zien dat de systeemtabelruimte al is versleuteld, maar de tabelklant uit de database tpcc1000 wordt momenteel versleuteld. Als uw systeem hardwarebronnen heeft en het coderingsproces traag lijkt, kunt u de volgende parameters proberen:

# 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;

Databaseversleuteling is voltooid als er geen tabellen in een niet-versleutelde staat zijn:

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)

En om te verifiëren, vermeld alle tabellen die versleuteld zijn:

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)

Zoals te zien is, gebruiken alle tablespaces ENCRYPTION_SCHEME=1 (versleuteld) en MIN_KEY_VERSION=1 . Na deze fase zou de databasebeheerder moeten overwegen om het aantal gebruikte encryptiethreads en rotatie-iops te verminderen. Bovendien moet ook rekening worden gehouden met de noodzaak van verdere sleutelrotatie, aangezien de plug-in voor bestandssleutelbeheer geen echte sleutelrotatie ondersteunt. Sleutelrotatie kan worden uitgeschakeld met innodb-encryption-rotate-key-age=0 . Houd er rekening mee dat zelfs met die instelling alle nieuwe tabellen die worden gemaakt, in aanmerking komen voor versleuteling.

Database verplaatsen naar niet-versleutelde staat

Hierbij gaan we ervan uit dat je een database hebt die versleuteld is en dat het niet langer nodig is om gegevens te versleutelen of dat de gegevensbescherming anders wordt gedaan. We zullen dezelfde database als voorbeeld gebruiken als bij het verplaatsen van de database naar de versleutelde staat. Op dit moment is het niet nodig om de server opnieuw op te starten. In plaats daarvan kan het verplaatsen van de database naar een niet-versleutelde staat worden gedaan als een online bewerking. Eerst moet de databasebeheerder controleren of er geen tabellen zijn die expliciete versleuteling gebruiken, d.w.z. dat er een tabel is waar tabel aanmaken wordt gebruikt ENCRYPTED=YES tabeloptie. Het verplaatsen van de database naar een niet-versleutelde staat kan nu eenvoudig worden gedaan door het volgende op te geven:

SET GLOBAL innodb_encrypt_tables=OFF;

Dit zal beginnen met het decoderen van alle tablespaces inclusief systeem tablespace en de voortgang van deze operatie kan worden gevolgd door:

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)

Hieruit kunnen we zien dat de tabel order_line uit database tpcc1000 wordt geroteerd. De bewerking is voltooid wanneer er geen tabellen zijn die codering gebruiken, d.w.z. min_key_version !=0 hebben.

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

Als de coderingsconfiguratie uit de configuratie moet worden verwijderd, is dit het moment om de server af te sluiten. Als de configuratie opnieuw log-versleuteling gebruikt, d.w.z. innodb-encrypt-log=ON  maak back-ups van uw database, inclusief InnoDB-logbestanden en verwijder daarna InnoDB-logbestanden omdat ze onbruikbaar zijn als ze versleutelde gegevens bevatten.

rm -rf ib_logfile*

Verwijder de coderingsinstellingen uit de configuratie en start de server opnieuw op. Nu heb je een database-instantie waar geen codering wordt gebruikt.

Conclusie

Het verplaatsen van een database naar een versleutelde staat, zoals hierboven te zien is, vereist dat de server opnieuw wordt opgestart en vereist een zorgvuldige configuratie van de versleutelingsplug-in. Hoe lang deze operatie duurt, hangt af van het aantal tafels en hoe groot deze tafels zijn. We hebben een manier gepresenteerd om deze voortgang te volgen en hoe deze te versnellen als de gebruikte hardware voldoende middelen heeft. Om een ​​database naar een niet-versleutelde staat te verplaatsen, hoeft u slechts één globale variabele in te stellen. Als codering echter langer nodig is en het nodig is om alle verwijzingen ernaar te verwijderen, is er een herstart nodig. We hebben laten zien hoe u deze overgang kunt bewaken en hoe u de encryptie-instellingen volledig kunt verwijderen uit zowel de database als de configuratie.


  1. Waarom rapporteert MySQL een syntaxisfout op FULL OUTER JOIN?

  2. Een Oracle-functie aanroepen vanuit Java

  3. Postgresql json zoals query

  4. PostgreSQL-databasebewaking:tips om te controleren