sql >> Databáze >  >> RDS >> MariaDB

Přesunutí databáze MariaDB do šifrovaných a nešifrovaných států

V tomto blogu představujeme způsob, jak přesunout existující databázi nejprve do šifrovaného stavu a poté, jak přesunout databázi do nezašifrovaného stavu.

Abyste mohli používat šifrování, musíte si načíst plugin pro správu šifrovacích klíčů. Viz aktuálně podporované zásuvné moduly pro šifrování. Každý klíč používá 32bitové celé číslo jako identifikátor klíče (key_id) a skutečný klíč. Klíče lze verzovat tak, aby byla data znovu zašifrována ze staršího klíče na novější verzi klíče. V tomto blogu jako příklad použijeme plugin pro správu klíčů souborů (viz správa šifrovacích klíčů). Předpokládáme také, že používáte nejnovější verzi serveru MariaDB (tento blog předpokládá, že MDEV-15566 je opravené, tj. verze MariaDB by měla být 10.1.33, 10.2.15 nebo 10.3.6).

Přesunutí databáze do zašifrovaného stavu nebo do nezašifrovaného stavu se provádí pomocí rotace klíče. Střídání klíčů přesune databázi z existujícího zašifrovaného stavu do jiného. Všimněte si, že zde tabulkový prostor nemůže mít žádný zašifrovaný stav (tj. tabulkový prostor je nezašifrovaný) nebo tabulkový prostor může mít stav šifrování, který se přesune do nezašifrovaného stavu. Střídání klíčů může probíhat pravidelně (na základě konfigurační proměnné innodb-encryption-rotate-key-age tj. jak starý může být klíč, než se otočí), požaduje správce databáze (např. vydáním set global innodb_encrypt_tables=ON; ) nebo systémem správy šifrovacích klíčů (viz např. rotace klíčů).

Správci databáze se musí rozhodnout, zda stačí zašifrovat pouze jednotlivé tabulky (viz šifrování dat pro InnoDB) nebo celou databázi včetně systémového tabulkového prostoru. Všimněte si, že data tabulky se také zapisují do opakování protokolu a zpět do protokolu. Pokud tedy databáze obsahuje tabulky, které obsahují velmi citlivá data, innodb-encrypt-log by měla být také povolena. V tomto blogu ukážeme, jak zašifrovat celou databázi.

Přesun databáze do zašifrovaného stavu

Než bude možné databázi přesunout do zašifrovaného stavu, musíme do konfiguračního souboru přidat konfiguraci šifrovacího pluginu (viz podrobný popis parametrů):

# 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

Po restartu lze průběh operace šifrování sledovat z tabulky INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION. V následujícím příkladu se dotazujeme na název tabulkového prostoru, aktuální stránku pod rotací klíčů a maximální stránku v tabulkovém prostoru pro ty tabulky, které ještě nejsou zašifrovány:

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)

Samozřejmě můžete také dotazovat stav všech tabulek:

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)

Z toho vidíme, že systémový tabulkový prostor je již zašifrován, ale tabulka zákazníka z databáze tpcc1000 je právě šifrována. Pokud má váš systém hardwarové prostředky a proces šifrování se zdá pomalý, můžete vyzkoušet následující parametry:

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

Šifrování databáze je dokončeno, když nejsou žádné tabulky v nezašifrovaném stavu:

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)

A pro ověření uveďte všechny tabulky, které jsou šifrované:

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)

Jak je vidět, všechny tabulkové prostory používají ENCRYPTION_SCHEME=1 (šifrováno) a MIN_KEY_VERSION=1 . Po této fázi by měl správce databáze zvážit snížení počtu používaných šifrovacích vláken a rotačních iops. Dále by měla být zvážena potřeba další rotace klíčů, protože plugin pro správu klíčů souborů nepodporuje skutečnou rotaci klíčů. Střídání klíčů lze zakázat pomocí innodb-encryption-rotate-key-age=0 . Všimněte si, že i s tímto nastavením jsou všechny nově vytvořené tabulky považovány za šifrované.

Přesun databáze do nešifrovaného stavu

Zde předpokládáme, že máte databázi, která je zašifrována a již není potřeba šifrovat data nebo je ochrana dat provedena jinak. Jako příklad použijeme stejnou databázi jako při přesunu databáze do zašifrovaného stavu. V tomto okamžiku není nutné restartovat server. Místo toho lze přesun databáze do nešifrovaného stavu provést jako online operaci. Nejprve by měl správce databáze zkontrolovat, že neexistují žádné tabulky využívající explicitní šifrování, tj. existuje tabulka, kde je použita možnost tabulky vytvořit tabulku ENCRYPTED=YES. Nyní lze přesun databáze do nešifrovaného stavu jednoduše provést vydáním:

SET GLOBAL innodb_encrypt_tables=OFF;

Tím se začnou dešifrovat všechny tabulkové prostory včetně systémového tabulkového prostoru a průběh této operace lze sledovat pomocí:

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)

Z toho vidíme, že se otáčí tabulka order_line z databáze tpcc1000. Operace je dokončena, když neexistují žádné tabulky využívající šifrování, tj. 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)

Pokud je nyní nutné odstranit nastavení šifrování z konfigurace, je čas server vypnout. Pokud konfigurace používá šifrování redo log, tj. innodb-encrypt-log=ON  proveďte zálohy z databáze včetně souborů protokolu InnoDB a poté odstraňte soubory protokolu InnoDB, protože jsou nepoužitelné, pokud obsahují šifrovaná data.

rm -rf ib_logfile*

Odeberte nastavení šifrování z konfigurace a restartujte server. Nyní máte instanci databáze, kde se nepoužívá žádné šifrování.

Závěr

Přesunutí databáze do zašifrovaného stavu, jak je vidět výše, vyžaduje restartování serveru a pečlivou konfiguraci zásuvného modulu pro šifrování. Jak dlouho tato operace trvá, závisí na počtu stolů a na tom, jak velké tyto stoly jsou. Představili jsme způsob, jak tento pokrok sledovat a jak jej urychlit, pokud má použitý hardware dostatek zdrojů. Přesunutí databáze do nešifrovaného stavu vyžaduje pouze nastavení jedné globální proměnné. Pokud je však šifrování potřeba déle a je potřeba odstranit všechny odkazy na něj, je potřeba jeden restart. Ukázali jsme, jak sledovat tento přechod a jak úplně odstranit nastavení šifrování z databáze i konfigurace.


  1. Náš záznam Microsoft Ignite Session Recording je nyní k dispozici k zobrazení!

  2. Míchání explicitních a implicitních spojení se nezdaří s Existuje záznam pro tabulku ... ale nelze na něj odkazovat z této části dotazu

  3. Rozdíl mezi tabulkovou funkcí a zřetězenou funkcí?

  4. Výstrahy EM12c databáze Čas strávený čekáním