MySQL-Verschlüsselung und Schlüsselverwaltung

10

Ich entwickle ein lokales Intranetsystem in PHP / MySQL, um unsere Kundendaten zu verwalten. Es scheint, dass die beste Vorgehensweise darin besteht, die vertraulichen Daten auf dem MySQL-Server während der Eingabe zu verschlüsseln.

Ich bin mir jedoch nicht sicher, was der beste Weg wäre, dies zu tun, während die Daten immer noch leicht zugänglich sind.

Es scheint eine schwierige Frage zu sein: Wo werden die Schlüssel gespeichert? Wie schütze ich den Schlüssel am besten? Wenn der Schlüssel auf dem Computer jedes Benutzers gespeichert ist, wie kann er geschützt werden, wenn der Computer ausgenutzt wird? Wie kann der Schlüssel geändert werden, wenn der Schlüssel ausgenutzt wird?

Wie soll der Schlüssel dort geschützt werden, wenn er in der Datenbank gespeichert werden soll? Wie würden Benutzer darauf zugreifen?

Stormdrain
quelle
Die Art der Verschlüsselung und des Schlüsselspeichers hängt davon ab, welche Szenarien Sie verhindern möchten. Wenn Ihr Angreifer einen Root- oder App-Benutzer auf dem Server hat, kann er natürlich dieselben Routinen zum Entschlüsseln verwenden, die Ihre Anwendung verwendet. Welches Szenario möchten Sie also verhindern? Jemand, der das Backup stiehlt? SQL-Injection-Angriff? Etwas anderes?
Aleksandar Ivanisevic
Danke für die Antwort! Ich bin nicht so besorgt über Backups. Ich mache mir mehr Sorgen darüber, dass jemand einen Benutzercomputer ausnutzt und dann von dort aus entweder über SQL-Injection auf die Site zugreift oder die Anwendungsanmeldeinformationen eines Benutzers überprüft. Ich mache mir keine allzu großen Sorgen um die Maschine selbst. Die Anmeldeinformationen für su sind sehr stark (ich mache mir jedoch keine Illusion, dass es 100% sicher ist).
Stormdrain

Antworten:

9

Es gibt eigentlich keine integrierten MySQL-Funktionen für die Verwaltung komplexer Verschlüsselungsschlüssel-Setups. Sie müssen den Großteil der Verschlüsselungslogik in Ihrem eigenen PHP- und / oder Browserseitencode (Javascript?) Implementieren.

Ihre Bedenken sind jedoch etwas eigenartig: Ihre einzigen wirklichen Bedenken scheinen eine SQL-Injection oder ein Brute-Force-Angriff (ich nehme an, das Erraten von Passwörtern) von einer Remote-Client-Desktop- / Laptop-Workstation aus zu sein. Das lässt mich vermuten, dass Sie bereits andere, nicht erwähnte Sicherheitsmaßnahmen geplant haben und die möglichen Kompromissmöglichkeiten analysiert haben.

  • Zum einen gehe ich davon aus, dass Sie Firewall-Regeln haben, die den MySQL / PHP-Host vor jeglichem Zugriff durch nicht genehmigte Remote-Client-IPs schützen. Wenn ich richtig liege, ist es sinnvoll, dass Sie sich nur über Angriffe von den Workstations kompromittierter Benutzer Sorgen machen.

  • Ich gehe auch davon aus, dass Sie verstehen, dass die Daten dieses Clients unabhängig von der Verschlüsselung oder anderen Sicherheitsvorkehrungen keinen Schutz bieten, wenn ein Angreifer auf dem Remote-Client-Host zu Root- / Administrator-Rechten eskalieren oder das eigene Konto des realen Benutzers direkt gefährden kann. (Der Angreifer kann die Schlüssel von jedem Ort aus lesen, an dem sie auf der Festplatte gespeichert sind, oder sie abhören, wenn der echte Benutzer sie bei der Anmeldung eingibt, und Schlüssel führen zu Daten.)

Ausgehend von diesen beiden Annahmen ist es für uns sinnvoll zu folgern, dass die einzigen zwei relevanten Bedrohungen A) Brute-Force-Kennwortraten und B) SQL-Injection-Versuche sind:

  • Wenn der Angreifer den Schlüssel des realen Benutzers nicht erhält oder auf mehr als nur die Daten des realen Benutzers zugreifen möchte, kann er versuchen, Anmelde-Creds für den realen Benutzer oder ein anderes Konto brutal zu erzwingen. (Theoretisch könnten Sie jedes Konto für eine bestimmte Remote-Client-IP sperren, um auch die Risiken zu unterteilen.)
  • Wenn der Angreifer einen gültigen Schlüssel für den realen Benutzer erhält, hat er einen Weg hinter dem Anmeldebildschirm (der vermutlich einfach genug ist, um sicher zu sein) zum weichen Unterbauch des möglicherweise fehlerhaften App-Codes. Eine erfolgreiche SQL-Injection aus dem Kontext des realen Benutzers könnte ihm auch Zugriff auf andere Clientdaten gewähren.

Lassen Sie uns nun darüber sprechen, wie die serverseitige Verschlüsselung auf diese Situationen angewendet wird:

  • Die serverseitige Verschlüsselung hilft definitiv gegen die Bedrohung durch SQL-Injection. Wenn die Zeilenwerte in den DB-Tabellen verschlüsselt sind, kann der Angreifer nur Kauderwelsch-Chiffretext der Daten sehen, die zu anderen Konten gehören. Die Bedrohung ist eingedämmt und unterteilt.
  • Das brutale Erzwingen des Erraten von Passwörtern wird für einen Angreifer, der mit serverseitiger Verschlüsselung konfrontiert ist, jedoch nicht wirklich schwieriger. Unabhängig davon, ob die Schlüssel der Benutzer auf dem Server gespeichert oder vor Ort aus dem Kennwort generiert werden, ist es nur wichtig, ob Sie das richtige Kennwort haben. Entweder lässt der Server zu, dass Sie den gültigen gespeicherten Schlüssel verwenden, weil er überprüft, ob Ihr Kennwort korrekt ist, oder er berechnet den gültigen Schlüssel für Sie, da Ihr Kennwort die richtige Eingabe zum Generieren dieses Schlüssels ist.

Die clientseitige Verschlüsselung macht Brute-Force-Kennwortangriffe dagegen irrelevant. Sie können einen richtig konstruierten Schlüssel nicht brutal erzwingen. Die clientseitige Verschlüsselung bietet grundsätzlich den gleichen Schutz gegen SQL-Injection wie die serverseitige Verschlüsselung. Der Client kann den Schlüssel bei der Anmeldung an den Server übergeben und eine Kopie im Speicher behalten, bis die Sitzung beendet ist, wodurch der Server von der Krypto-CPU belastet wird. Oder der Client kann die Verschlüsselung / Entschlüsselung selbst im Browser durchführen. Beide Techniken haben Höhen und Tiefen:

  • Die Übergabe des Schlüssels an den Server ist viel einfacher zu codieren und zu verwalten und aufgrund des optimierten Kryptocodes (wahrscheinlich kompiliertes C) in der Regel viel schneller.
  • Ein reiner clientseitiger Ansatz bietet zusätzliche Sicherheit, da selbst wenn ein Angreifer auf dem Server root wird, er die verschlüsselten Daten immer noch nicht lesen kann und sie niemals lesen kann. Der einzig mögliche Angriffsvektor besteht darin, die Remote-Client-Workstation zu gefährden.

Abschließend möchte ich darauf hinweisen, dass die Verschlüsselung von Daten in der Datenbank einige enorme betriebliche Nachteile hat. Da es sich bei den verschlüsselten Datendarstellungen im Wesentlichen um zufällige Muster handelt, funktionieren grundlegende Datenbankfunktionen wie Indizierung, Verknüpfungen usw. nicht. Der Client übernimmt eine enorme logische Belastung und kann viele der Vorteile verlieren, die Datenbankfunktionen normalerweise bieten.

Ryan B. Lynch
quelle
1
Beeindruckend! Erstaunliche und gründliche Antwort; vielen Dank. In den letzten Tagen habe ich über einige Optionen nachgedacht und mich entschlossen, eine clientseitige Lösung zu implementieren, wie Sie vorgeschlagen haben. Im Idealfall werden Schlüssel auf USB-Sticks gespeichert, die nur während der Arbeit eines Benutzers am System bereitgestellt werden (die physische Sicherheit ist sehr streng), und der Schlüssel wird nur so lange im Speicher gehalten, wie die Sitzung dauert. Die Idee ist, dass die Schlüssel nur während der Arbeitszeit für das System zugänglich sind, wenn ich dort bin, um den Verkehr usw. zu überwachen
Stormdrain
2

Vielleicht möchten Sie sich ezNcrypt ansehen , das ecryptfs, Zugriffskontrollen und Schlüsselverwaltung verwendet, um eine hohe Sicherheit und Leistung für die Linux-Verschlüsselung von MySQL-Datenbanken und anderen Prozessen bereitzustellen. Nein, ich arbeite nicht für sie.

Dan
quelle
2

Sie könnten Scytale verwenden. Es ist ein NoSQL-Krypto-Proxy für moderne DBMS- und Webanwendungen. Unterstützt die Verschlüsselung mit mehreren Empfängern und Gruppen. Geladen mit einem starken RSA / AES-Kryptosystem. Es ist auch 100% kostenlos und Open Source.

https://bitbucket.org/maximelabelle/scytale

Maxime Labelle
quelle