Open Source im professionellen Einsatz
Linux-Magazin 03/2016
© Olga Ublinskikh, 123RF

© Olga Ublinskikh, 123RF

Clouddatenbanken durch Verschlüsselung absichern

Unleserlich

Cloudapplikationen benötigen häufig eine Datenbank. Insofern stellt sich auch bei ihnen die Frage, wie der Kunde die Vertraulichkeit sichern kann, wenn der Server nicht im eigenen Haus steht.

1093

Wer seine Daten nicht vor dem Zugriff fremden Personals schützen kann, nutzt Verschlüsselung als Gegenmittel der Wahl. Sie macht den digitalen Schatz für Diebe oder Spione wertlos und bietet sich damit speziell für alle Daten an, die der Anwender in fremde Hände gibt. Das betrifft auch die Inhalte von Datenbanken in einer Cloud. Für ihre Verschlüsselung bieten sich verschiedene Verfahren an.

Umgebung verschlüsseln

Das Beispiel, das dieser Artikel durchspielt, verwendet MySQL als eine der verbreitetsten Open-Source-Datenbanken. Für andere wie beispielsweise PostgreSQL gibt es vergleichbare Funktionen. Mit MySQL ist es zudem möglich, alle Daten auf dem Weg durchs Netzwerk mit SSL zu verschlüsseln, unabhängig von der Leserlichkeit der Datenbankinhalte auf der Festplatte. Das vorliegende Beispiel setzt eine solche Transportverschlüsselung voraus.

Die erste und vielleicht einfachste Variante, um die eigentlichen Inhalte für Unbefugte unleserlich zu machen, besteht darin, den gesamten Datenbankserver oder auch nur eine Datenpartition zu verschlüsseln und die Files der Datenbank dann auf dieser Partition zu platzieren. Bei etlichen Distributionen, etwa bei Ubuntu, kann man bereits während der Installation die komplette oder teilweise Verschlüsselung als Option wählen. Aber auch im Nachhinein ist zumindest das Verschlüsseln einer freien Partition einfach zu bewerkstelligen.

Vorteilhaft an diesem Vorgehen ist, dass die Verschlüsselung für die Datenbank transparent ist. Sie startet erst, wenn die verschlüsselte Partition leserlich gemountet ist, und weiß nichts davon, dass der Rechner die Daten auf dem Weg von und zur Platte chiffriert. Daher bleiben alle Such- und Sortiermöglichkeiten der Datenbank unberührt und alle Applikationen, die die Datenbank nutzen, können so weitermachen wie bisher.

Nachteilig ist, dass es – im Unterschied zu der im folgenden Abschnitt diskutierten Verschlüsselung der Inhalte durch die Datenbank selbst – keine zweite Barriere gibt. Wer sich Zutritt zum laufenden Server verschaffen kann, dem liegen die Daten offen. Außerdem wird immer alles verschlüsselt, auch wenn es nicht nötig wäre. Und schließlich würde ein Backup, etwa via »mysqldump« , wieder ein unverschlüsseltes Abbild der Datenbank produzieren, das – sofern es nicht ebenfalls auf einem verschlüsselten Volume landet – die Sicherheitsmaßnahme aushebelt.

Verschlüsseln durch die Datenbank

Eine alternative Variante besteht deshalb darin, bestimmte Datenbankinhalte – also alle oder einzelne Spalten einiger Tabellen – durch die Datenbank verschlüsseln zu lassen. Vorteilhaft daran ist, dass dieser Sicherheitsmechanismus zusätzlich zum Schutz des Servers beiträgt. Da die Datenbank dabei direkt ihre Tabelleninhalte chiffriert, gibt auch ein Backup oder Dump der Inhalte nur Kauderwelsch für die geschützten Felder aus. Zudem wird Ressourcen-schonend nur das verschlüsselt, was explizit dafür bestimmt ist.

Nachteilig an dieser Methode ist vor allem, dass sie nicht transparent ist. Sie bedingt besondere Select-, Update- und Insert-Statements. Wenn der Anwender nicht mit der nackten Datenbank interagiert, sondern, was wohl die Regel ist, über eine Applikation die Datenquelle anzapft, dann muss auch diese Applikation mit der Verschlüsselung umgehen können. Ist sie nicht darauf vorbereitet, funktioniert dieses Konzept nicht.

Wie sähe es konkret aus? Zunächst müssen die verschlüsselten Felder vom Datentyp »BLOB« sein, weil sie Binärdaten aufnehmen sollen, zu denen auch nicht druckbare Bytes zählen. Beispiel:

create table gewürze(name_deu VARCHAR(256), name_lat_encr BLOB)

Für die eigentliche Ver- und Entschlüsselung bietet MySQL dann die Funktionen »AES_ENCRYPT« und »AES_DECRYPT« an, die der Programmierer zusammen mit einem Schlüssel auf den Wert einer Spalte anwendet (Listing 1). Die Zeichenfolge »2BueIuDTuPWHAraWiSMSaTb« ist dabei der Schlüssel.

Listing 1

Verschlüsseltes Insert

01 INSERT INTO gewürze (name_deu, name_lat_encr)
02 VALUES('Rosmarin',
03 AES_ENCRYPT(
04              'Rosmarinus officinalis',
05              '2BueIuDTuPWHAraWiSMSaTb')
06 );

In der Folge speichert MySQL einen verschlüsselten Wert, den man für die Ausgabe am besten mit der Funktion »HEX()« formatiert, weil er Bytes enthalten kann, die das Terminal ansonsten als Steuerzeichen interpretiert, etwa als Form Feed (Zeilenschaltung) oder Backspace. Das zerstört die Bildschirmdarstellung. Ein Beispiel zeigt Listing 2.

Listing 2

Ausgabe verschlüsselter Datenbankwerte

01 mysql> SELECT name_deu, HEX(name_lat_encr) FROM gewürze;
02 +------------+-----------------------------------------------------------------+
03 | name_deu   | HEX(name_lat_encr)                                              |
04 |            |                                                                 |
05 +------------+-----------------------------------------------------------------+
06 | Rosmarin   | A68D71CF37145275DC4F28A249227B72F677DADD0865B831CC8D8F5282985F8B|
07 | Thymian    | 05128E1D108D7EC1B29AD8D504FA0935                                |
08 | Basilikum  | B1F9D9C59354428C99B903EFFA5324A2CDA205760C628F0BCE195413BABABDDF|
09 | Oregano    | 7F302E380DFDB8ADD8391E32F27FA879CDA205760C628F0BCE195413BABABDDF|
10 | Vanille    | DE869A208F6CF6DCE0E698595D8CD25646CE602B1E23171C8C2E5EE068D256E2|
11 | Zimt       | DBBA2A7CBE9D09EFAC86DACD0838BCF6CDA205760C628F0BCE195413BABABDDF|
12 | Chili      | 9777B8F9E2E1A91BD8E1873DFF5D331A                                |
13 | Pfeffer    | FAECDCB00E3A6D308C1652CA32C6B9BC                                |
14 | Estragon   | 2FFB81EA72F21034030AA50DF55C76089014EA2C322C570B1F98026CC0038E6B|
15 | Petersilie | E072EF1B6F004BBE7152435E913CA6C07D3354C4A4D9011E1BDBC160E372DFBB|
16 +------------+-----------------------------------------------------------------+

Nach diesen Werten kann das eigene Programm natürlich nicht mehr ohne Weiteres suchen. Problemlos ist die Suche nach dem Wert einer unverschlüsselten Spalte, bei dem der Nutzer die verschlüsselte im Ergebnis dechiffriert. Ein Beispiel zeigt Listing 3. Wer nach einem verschlüsselten Wert suchen muss, hat zwei Möglichkeiten:

Listing 3

Suche in unverschlüsselter Spalte

01 mysql> SELECT name_deu, AES_DECRYPT(name_lat_encr, '2BueIuDTuPWHAraWiSMSaTb') FROM gewürze ORDER BY name_deu ASC;
02 +------------+-------------------------------------------------------+
03 | name_deu   | AES_DECRYPT(name_lat_encr, '2BueIuDTuPWHAraWiSMSaTb') |
04 +------------+-------------------------------------------------------+
05 | Basilikum  | Ocimum basilicum                                      |
06 | Chili      | Capsicum annuum                                       |
07 | Estragon   | Artemisia dracunculus                                 |
08 | Oregano    | Origanum vulgare                                      |
09 | Petersilie | Petroselinum crispum                                  |
10 | Pfeffer    | Piper nigrum                                          |
11 | Rosmarin   | Rosmarinus officinalis                                |
12 | Thymian    | Thymus vulgaris                                       |
13 | Vanille    | Vanilla planifolia                                    |
14 | Zimt       | Cinnamomum verum                                      |
15 +------------+-------------------------------------------------------+

Möglichkeit 1: Der Code verschlüsselt den Suchbegriff und sucht nach der verschlüsselten Form. Der Datenbank ist es egal, ob sie für Menschen sinnvolle Wörter oder irgendwelche, ansonsten bedeutungslosen Bytefolgen vergleicht:

SELECT name_deu
FROM gewürze
WHERE name_lat_encr=AES_ENCRYPT('Rosmarinus officinalis', '2BueIuDTuPWHAraWiSMSaTb');

Möglichkeit 2: Der Anwender entschlüsselt jeden in der Tabelle verschlüsselten Spaltenwert vor dem Vergleich. Das macht der Datenbank viel mehr Arbeit, hat aber den Vorteil, dass nun auch wieder eine Teilstring-Suche mit »LIKE« möglich ist. Ein Beispiel wäre:

SELECT name_deu
FROM pflanzen
WHERE AES_DECRYPT(name_lat_encr, '2BueIuDTuPWHAraWiSMSaTb') LIKE 'Thymus%';

In jedem Fall muss die Applikation sich für eine Fragemöglichkeit entscheiden, rechnet sie mit einer unverschlüsselten Datenbank, kann sie nicht mehr funktionieren.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 2 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Neue Mail-Verschlüsselung bei Posteo

    Der E-Maildienst Posteo führt eine neue Verschlüsselungsoption ein: Den Posteo-Krypto-Mailspeicher. In den kommenden Wochen wird Posteo die Funktion schrittweise für alle Postfächer freischalten.

  • Verschlusssache

    Datenbanken enthalten oft sensible Daten. Die sind aber ungeschützt, wenn ein Hacker an die Datenbank-Files oder ein Backup gelangt. Sicherheitsvorkehrungen in Oracle beheben diesen Mangel durch einfach zu konfigurierende Verschlüsselungsmechanismen.

  • Kern-Technik

    Der Linux-Kernel bietet seine Verschlüsselungsfunktionen auch zum asynchronen Zugriff an. Ineinander geschachtelte Datenstrukturen und undokumentierte Funktionen machen dem Programmierer allerdings das Leben schwer. Diese Kern-Technik schafft Abhilfe.

  • Collectd 4.7.0: Verschlüsselung und Java

    Der Datensammel-Daemon Collectd ist in Version 4.7.0 erhältlich. Neue und überarbeitete Plugins erweitern seinen Funktionsumfang.

  • Ägyptische Arbeiten

    Die alten Pharaonen scheuten keinen Aufwand, um ihre Pyramiden aufzutürmen. Ähnlich mühsam wäre es heute, wollten Admins jedes Mailprogramm PGP-fähig ausstatten. Die neuen IT-Götter manipulieren mit Anubis: Der Daemon nimmt Nachrichten vom Client entgegen und ergänzt, was der nicht schafft.

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.