Logo MariaDB

Datenbank-Verschlüsselung für MariaDB

MariaDB speichert die Tabellendaten als Dateien im Dateisystem. Falls ein Angreifer ohne Datenbankzugriff diese Dateien lesen kann, ist er auch in der Lage, sensible Daten zu lesen oder in seine eigene Installation zu kopieren.

MariaDB Beispiel Screen 1

MariaDB Beispiel Screen 2

Zum Verhindern dieses Angriffs, implementieren wir für MariaDB eine Verschlüsselung in zwei Arten:

  1. Tabellenverschlüsselung
  2. Spaltenverschlüsselung

Die Tabellenverschlüsselung verschlüsselt alle Daten der Tabelle und der Indizes. Diese Lösung ist auf die Storage Engines InnoDB und XtraDB begrenzt.

Die Spaltenverschlüsselung verschlüsselt die Daten der Spalten und ermöglicht eine selektivere Verschlüsselungsnutzung. Diese Funktion ist unabhängig von der Speicher-Engine.

Beide Modi sind zum größten Teil transparent für den Datenbankbenutzer. Die Verschlüsselung wird mit dem CREATE-Statement konfiguriert. Eine Änderung dieses Status mit einem ALTER-Statement ist nicht möglich.

Tabellenverschlüsselung

Die Tabellenverschlüsselung arbeitet auf den Seiten der Tabelle und verschlüsselt den gespeicherten Inhalt. Die Tabellenverschlüsselung wird mit dem CREATE-Statement konfiguriert.

Beispiel:

CREATE TABLE t1
 (
 id int,
 value varchar(255)
 ) PAGE_ENCRYPTION=1, ENCRYPTION_KEY=99;

Der Parameter PAGE_ENCRYPTION aktiviert die Verschlüsselung und ENCRYPTION_KEY definiert den zu verwendenden Schlüssel.

Einschränkungen der ersten Version:

  1. Deaktivierung der Verschlüsselung ist nicht möglich
  2. Änderung des Verschlüsselungs-Schlüssels ist nicht möglich
  3. Aktivierung der Verschlüsselung für vorhandene Tabellen ist nicht möglich

Die Verschlüsselungskonfiguration wird in den Tablespace Flags gespeichert. Das Bit 7 wird für den Aktivierungsstatus verwendet. Die Schlüssel-ID wird in den Bits 8-23 gespeichert.

Die Verschlüsselung erfolgt nach der Seitenkomprimierung. Dies ermöglicht die effektive Nutzung der Komprimierungsfunktionen, obwohl die Seite verschlüsselt ist.

Die folgenden Funktionen werden geändert:

  • os_aio_array_reserve_slot
  • os_file_read_func
  • os_aio_windows_handle
  • os_aio_linux_collect

Spaltenverschlüsselung

Spaltenverschlüsselung verschlüsselt die persistenten Daten auf Feldebene. Die Spaltenverschlüsselung wird mit dem CREATE-Statement konfiguriert.

Beispiel:

CREATE TABLE t1
 (
 id int,
 value varchar (255) ENCRYPTION_KEY=4711
 );

Der Aktivierungsstatus der Verschlüsselung wird im Bit 12 des Feldes Flag gespeichert. Die Schlüssel-ID ist in der Struktur Create_Field gespeichert.

Einschränkungen der ersten Version:

  1. Deaktivierung der Verschlüsselung ist nicht möglich
  2. Änderung des Verschlüsselungs-Schlüssels ist nicht möglich
  3. Aktivierung der Verschlüsselung für vorhandene Tabellen ist nicht möglich

Folgende neue Field-Klassen werden implementiert:

  • Field_encrypted_blob
  • Field_encrypted_longstring
  • Field_encrypted_string
  • Field_encrypted_varstring

Verschlüsselung und Schlüssel

Die Daten werden mit AES im CBC-Modus verschlüsselt. Die verschlüsselten Daten werden mit 32 Bit Zufallszahlen erweitert.

Die Erzeugung und Verwaltung von Schlüsseln ist von entscheidender Bedeutung für das gesamte System und für die Sicherheit. Die Schlüssel werden von einer numerischen 16-Bit ID identifiziert und als Zahlen zwischen 1 und 65.535 dargestellt. Da der Schlüssel nicht neben den verschlüsselten Daten gespeichert wird, darf die Zuordnung der ID zu dem Schlüssel nicht verändert werden.

Die Schlüssel werden beim Start des Servers geladen und während der Laufzeit im Speicher gehalten. Dies verhindert, dass der Angreifer die Schlüssel aus einer Datei lesen kann, falls die Schlüssel Quelle nur beim Start verfügbar ist.

Um diesen Prozess sicherer zu machen, werden die folgenden Schlüssel-Provider implementiert:

  1. Schlüsseldatei
  2. verschlüsselte Schlüsseldatei
  3. Schlüssel-Server

Die Schlüsseldatei ist eine Textdatei, die eine ID, eine Algorithmus-Kennung, den hex-kodierten Schlüssel und die hex-kodierte IV enthält.

Das folgende Beispiel definiert drei Schlüssel:

# 1 is an AES−128 key
1 AES 00112233445566778899AABBCCDDEEFF 00112233445566778899AABBCCDDEEFF
# 2 is an AES−192 key
2 AES 00112233445566778899AABBCCDDEEFF0011223344556677 00112233445566778899AABBCCDDEEFF
# 99 is an AES−256 key
99 AES 00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF 00112233445566778899AABBCCDDEEFF

Zufällige Schlüssel können mit OpenSSL per folgendem Befehl erstellt werden:

openssl enc −aes−128−cbc −k [secret] −P −md sha1
openssl enc −aes−192−cbc −k [secret] −P −md sha1
openssl enc −aes−256−cbc −k [secret] −P −md sha1

Die Schlüsseldatei kann mit OpenSSL und AES-256 per folgendem Befehl verschlüsselt werden:

openssl enc −aes−256−cbc −in [keyfile] −out [encrypted keyfile]

Der Schlüssel-Provider ist in der Tabelle Encryption_Configuration in dem mysql Schema konfiguriert.

keyvalue
key_provider1 = Schlüsseldatei, 2 = verschlüsselte Schlüsseldatei, 3 = Schlüssel-Server
key_filePfad zur (verschlüsselten) Schlüsseldatei
key_server_addressURL des Schlüssel-Servers
access_keyDer Verschlüsselungs-Schlüssel für die verschlüsselte Schlüsseldatei oder das gemeinsame Geheimnis des Schlüssel-Servers.