Bevor Sie sich für solche Sicherheitsaspekte entscheiden, sollten Sie das Bedrohungsmodell bewerten. Ohne eine Vorstellung davon, wogegen Sie sich verteidigen, sind Maßnahmen, die Sie ergreifen, wahrscheinlich von geringem Wert.
Nun, es gibt ein paar Dinge, über die Sie sich in diesem Zusammenhang Sorgen machen könnten:
- Angreifer erhalten physischen Zugriff auf Ihre Daten (z. B. Eindringen in das Datencenter, Diebstahl von Sicherungsbändern usw.)
- Angreifer erhalten Lesezugriff auf Ihre Rohdatenbank
- Angreifer, die Ihre Anwendung gefährden, z. B. durch SQL-Injection, Pufferüberläufe usw.
Für das erste Szenario sollte das Speichern der Datenbank und aller Sicherungen auf verschlüsselten Volumes funktionieren, vorausgesetzt, der Server ist kopflos - ein Diebstahl des Servers oder der Bänder würde dann das Unterbrechen der Verschlüsselung auf Festplattenebene erfordern.
Im zweiten Szenario hilft das Verschlüsseln von Datenbankdaten, allerdings nur, wenn Sie die erforderlichen Schlüssel oder Passphrasen nirgendwo speichern.
Im dritten Szenario hängt alles vom Kontext ab, in dem der Angriff erfolgt: Wenn es sich beispielsweise um einen XSS- oder CSRF-Angriff handelt, kann ein Angreifer alles tun, was der legitime Benutzer kann, und die Verschlüsselung Ihrer Daten hilft überhaupt nicht .
Ihr Bedrohungsmodell ist daher ein Angreifer, der Lesezugriff auf die unformatierte Datenbank erhält, indem er entweder die Anmeldeinformationen ermittelt und sich von außen beim Datenbankserver anmeldet oder Root-Zugriff auf den Datenbankserver erhält. Ein typischer Weg besteht darin, zuerst auf dem Webserver auf die Shell zuzugreifen. Von dort aus kann ein Angreifer die Zugangsdaten aus der Konfigurationsdatei lesen und eine Verbindung zur Datenbank herstellen.
Eine weitere Überlegung ist, wo Sie die Schlüssel und Passphrasen aufbewahren, insbesondere wenn Sie eine Plattform mit einem zustandslosen Ausführungsmodell wie PHP verwenden. Im Idealfall muss der Kunde seine Passphrase bei Bedarf eingeben und sie nur im Speicher aufbewahren, oder noch besser, die Entschlüsselung clientseitig durchführen (dies ist jedoch häufig nicht möglich). Auf einer statusfreien Plattform wird der Status normalerweise über Sitzungen, Memcache, Datenbanken oder Flatfiles übertragen. All dies ist jedoch weitaus anfälliger, als den Status im eigenen Speicher einer statusbehafteten Webanwendung zu halten. Dies zu vermeiden ist ein Henne-Ei-Problem, denn wenn Sie den Status verschlüsseln, bevor Sie ihn beibehalten, haben Sie gerade ein weiteres Geheimnis erstellt, an das Sie sich sicher erinnern müssen. Sich die Passphrase auf dem Client zu merken und sie zusammen mit jeder Anforderung zu senden, die sie benötigt, kann dann die am wenigsten schreckliche Lösung sein.