Objektverschlüsselung und Secure Enclaves
Neben der Verschlüsselung ruhender Daten unterstützt SQL Server durch Always Encrypted auch die Verschlüsselung von Daten in Spalten. Nachdem die Daten verschlüsselt wurden, muss die Anwendung, die auf die Datenbank zugreift, über das richtige Zertifikat verfügen, um die Nur-Text-Werte der Daten anzuzeigen.
Always Encrypted
Always Encrypted ermöglicht die Verschlüsselung von Daten innerhalb der Clientanwendung und schützt vertrauliche Daten vor Malware und Benutzern mit umfassenden Berechtigungen wie Datenbankadministratoren (DBAs), Serveradministratoren, Cloudadministratoren oder anderen Personen, die die Daten verwalten, aber keinen Zugriff darauf haben sollten. Diese Verschlüsselung erfolgt automatisch und richtet sich nach den Einstellungen der Microsoft SQL Server-Datenbank, die der Anwendung mitteilen, welche die Verschlüsselungseinstellungen für die Datenbankspalte gelten.
Die folgende Tabelle enthält einige Szenarien für die Verwendung von Always Encrypted:
Szenario | Definition |
---|---|
Lokaler Client und lokale Daten | Für Szenarien, in denen Sie Ihre lokale Datenbank vor Benutzern mit umfassenden Berechtigungen schützen müssen, z. B. vor externen Anbietern, die SQL Server verwalten. |
Lokaler Client mit Daten in Azure | Um sicherzustellen, dass Microsoft-Cloudadministratoren keinen Zugriff auf die Daten haben, werden in diesem Szenario Always Encrypted-Schlüssel in einem lokal gehosteten Schlüsselspeicher für eine SQL-Datenbank- oder SQL Server-Instanz gespeichert, die auf einem virtuellen Computer in Microsoft Azure ausgeführt wird. |
Client und Daten in Azure | In diesem Szenario wird die Umgebung vollständig in Azure gehostet. Obwohl Always Encrypted die Daten nicht vollständig von den Cloudadministratoren isoliert, profitiert der Kunde dennoch von der Tatsache, dass die Daten in der Datenbank verschlüsselt sind. |
Always Encrypted basiert auf einem Hauptverschlüsselungsschlüssel und einem Spaltenverschlüsselungsschlüssel. Durch diese beiden Schlüssel kann jede Spalte mit einem anderen Verschlüsselungsschlüssel verschlüsselt werden, sodass ein Höchstmaß an Datenschutz gewährleistet wird. Always Encrypted verfügt über verschiedene Schlüsselspeicher, in denen die verwendeten Zertifikate nach Verschlüsselungsmethode gespeichert werden können.
Im Folgenden sehen Sie ein Beispiel für die Aktivierung von Always Encrypted. Sie sehen, dass die Spalten NationalIDNumber und BirthDate beide das Nur-Text-Format aufweisen.
Auf den nächsten Abbildungen wird die Verschlüsselung dieser beiden Spalten mit Always Encrypted veranschaulicht. Die Verschlüsselung könnte mit T-SQL durchgeführt werden, für dieses Beispiel wird jedoch der Assistent in SQL Server Management Studio verwendet. Sie können den Assistenten öffnen, indem Sie mit der rechten Maustaste auf den Tabellennamen im Objekt-Explorer klicken:
Wenn Sie Spalten verschlüsseln... auswählen, wird der Assistent gestartet.
Auf der folgenden Abbildung sehen Sie den Startbildschirm in Always Encrypted. Klicken Sie auf Weiter, um die zu verschlüsselnden Spalten auszuwählen.
Auf der obigen Abbildung werden zwei verschiedene Verschlüsselungsmethoden festgelegt. Die Spalte NationalIDNumber wird deterministisch verschlüsselt, die Spalte BirthDate hingegen randomisiert verschlüsselt.
Die randomisierte Verschlüsselung ist sicherer als die deterministische, aber auch eingeschränkter. Die Verschlüsselungsmethode kann nach der Erstellung der Spalte nicht mehr geändert werden. Es wird empfohlen, die randomisierte Verschlüsselung für Spalten mit wenigen, aber bekannten eindeutigen Werten zu verwenden, die von Benutzern erraten werden könnten, die auf die verschlüsselten Werte zugreifen können. Ein Beispiel für eine Spalte, deren Wert erraten werden könnte, wäre der dreistellige Prüfcode einer Kreditkarte.
Die Verwendung von Always Encrypted mit randomisierter Verschlüsselung ist eingeschränkt, da Randomisierung bedeutet, dass selbst gleiche Werte unterschiedlich verschlüsselt werden. Spalten mit randomisierter Verschlüsselung können nur in den Ergebnissen zurückgegeben werden. Bei der deterministischen Verschlüsselung wird ein Wert immer als dieselbe Zeichenfolge codiert. Dies ermöglicht es uns, Spalten mithilfe von Gleichheits- und Ungleichheitsoperatoren mit einer Konstanten zu vergleichen und Spalten miteinander zu vergleichen, um Joins, Gruppierungen und Indexierungen durchzuführen.
Beachten Sie auch, dass der Assistent einen Spaltenverschlüsselungsschlüssel generiert. Dabei handelt es sich um den Schlüssel, der die Datenverschlüsselung tatsächlich ausführt. Jede zu verschlüsselnde Spalte kann über einen eigenen Schlüssel verfügen. Sie können jedoch auch wie hier gezeigt denselben Schlüssel verwenden, um beide Spalten zu verschlüsseln.
Nachdem Sie die zu verschlüsselnden Spalten ermittelt haben, können Sie auf Weiter klicken. Dann gelangen Sie zum Bildschirm Konfiguration des Hauptschlüssels:
Auf diesem Bildschirm erstellen Sie den Spaltenhauptschlüssel, der zum Verschlüsseln der Spaltenverschlüsselungsschlüssel verwendet wird. Wenn Sie T-SQL zum Verschlüsseln der Spalten verwenden, können Sie einen eigenen Schlüssel angeben. Dieser Schlüssel muss in einem Schlüsselspeicher wie dem Windows-Zertifikatspeicher, Azure Key Vault oder in einem Hardwaresicherheitsmodul gespeichert werden. Die Datenbank-Engine speichert den Spaltenhauptschlüssel niemals und enthält nur die Metadaten zu dessen Speicherort. Den Hauptschlüssel nicht zu speichern verhindert, dass Benutzer mit vollständigem Datenbankzugriff auf diese Daten zugreifen können.
Das höchste Maß an Sicherheit wird gewährleistet, wenn der Schlüssel in einem Drittanbieter-Schlüsselspeicher wie Azure Key Vault gespeichert wird. Generieren Sie die Schlüssel niemals auf dem Server, der die Datenbank hostet. Sie könnten sonst aus dem Arbeitsspeicher des Servers extrahiert werden.
Im folgenden Beispiel wird der Schlüssel in Azure Key Vault gespeichert. Auf dem nächsten Bildschirm stellt der Assistent die Option bereit, entweder den Verschlüsselungsvorgang sofort zu beenden oder ein PowerShell-Skript zu generieren. Sobald der Vorgang abgeschlossen ist, werden die Daten verschlüsselt angezeigt, wenn sie ohne Angabe des Schlüssels abgefragt werden.
Damit Daten aus einer Always Encrypted-Spalte verschlüsselt werden können, benötigt Ihre Anwendung einen Always Encrypted-Treiber für die Verbindungsherstellung mit der Datenbank, gefolgt von den nachfolgenden Aktionen:
- Die Anwendung hat Zugriff auf den Schlüsselspeicher, in dem die Always Encrypted-Schlüssel gespeichert sind.
- Die Anwendung ruft dann die Daten ab.
- Daten, die in die Datenbank zurückgeschrieben werden, werden auf dem Client über den Treiber verschlüsselt.
Zusätzlich zum Treiber muss für die Verbindungszeichenfolge der Anwendung auch die Einstellung Column Encryption Setting=enabled bereitgestellt werden. Diese Einstellung bewirkt, dass für jede Spalte, die von der Anwendung verwendet wird, eine Metadatensuche durchgeführt wird.
Hinweis
Zum Minimieren von Metadatensuchvorgängen muss die Anwendung die Einstellung SqlCommandColumnEncryptionSetting der SqlConnection-Objekte in der .NET-Anwendung aktualisieren. Diese Einstellung muss für jede Datenbankabfrage festgelegt werden, die die Anwendung sendet.
Secure Enclaves
Always Encrypted unterstützt das Feature „Secure Enclaves“, das robustere Abfragen für verschlüsselte Daten ermöglicht.
Eine Secure Enclave ist ein geschützter Arbeitsspeicherbereich im SQL Server-Prozess, der als vertrauenswürdige Ausführungsumgebung für die Verarbeitung verschlüsselter Daten fungiert. Diese Enclave ist für SQL Server wie eine Blackbox, denn es ist selbst mit einem Debugger nicht möglich, deren Daten oder Code einzusehen.
Die folgende Abbildung veranschaulicht die Architektur für diesen Prozess:
Always Encrypted mit „Secure Enclaves“ behebt auch einige der Einschränkungen der randomisierten Verschlüsselung, die Musterabgleiche, Vergleichsvorgänge und Indizierungen für Spalten ermöglicht, die diesen Verschlüsselungstyp verwenden.