Always Encrypted
Gilt für: SQL Server
Azure SQL-Datenbank
Azure SQL Managed Instance
Always Encrypted ist ein Feature zum Schutz sensibler Daten wie Kreditkartennummern oder nationaler/regionaler Identifikationsnummern (etwa Sozialversicherungsnummern), die in Azure SQL-Datenbank, Azure SQL Managed Instance und SQL Server-Datenbanken gespeichert sind. Always Encrypted ermöglicht es Clients, sensible Daten in Clientanwendungen zu verschlüsseln und die Verschlüsselungsschlüssel niemals an das Datenbankmodul weiterzugeben. Dies bietet eine Trennung zwischen denjenigen, welche die Daten besitzen und diese anzeigen können, und denjenigen, welche die Daten verwalten, aber keinen Zugriff haben sollen – lokale Datenbankadministratoren, Clouddatenbankoperatoren oder andere nicht autorisierte Benutzer mit hoher Berechtigung. Daher ermöglicht Always Encrypted es Kunden, ihre vertraulichen Daten in der Cloud sicher zu speichern und die Wahrscheinlichkeit des Datendiebstahls durch böswillige Insider zu verringern.
Always Encrypted kann so konfiguriert werden, dass eingeschränkte vertrauliche Abfragen für verschlüsselte Daten unterstützt werden, die Abfragen, die Gleichheitsvergleiche beinhalten. Zeigen Sie z. B. Nachschlagevorgänge oder Gleichheitsverknüpfungen an. Solche Abfragen nutzen deterministische Verschlüsselung.
Hinweis
Secure Enclaves erweitern die Funktionen des vertraulichen Computings von Always Encrypted mit Musterabgleich, anderen Vergleichsoperatoren und direkter Verschlüsselung. Weitere Informationen finden Sie unter Always Encrypted mit Secure Enclaves.
Always Encrypted macht die Verschlüsselung den Anwendungen gegenüber transparent. Ein auf dem Clientcomputer installierter Treiber, bei dem Always Encrypted aktiviert ist, erreicht dies durch die automatische Ver- und Entschlüsselung von sensiblen Daten in der Clientanwendung. Der Treiber verschlüsselt die Daten in vertraulichen Spalten, bevor er sie an Datenbank-Engineweitergibt, und schreibt Abfragen automatisch neu, sodass die Semantik der Anwendung beibehalten wird. Analog dazu werden in verschlüsselten Datenbankspalten gespeicherte Daten aus Abfrageergebnissen durch den Treiber transparent entschlüsselt.
Konfigurieren von Always Encrypted
Dieser Abschnitt enthält eine Übersicht über das Einrichten von Always Encrypted. Ausführliche Informationen und erste Schritte finden Sie im Tutorial: Erste Schritte mit Always Encrypted.
Zum Einrichten von Always Encrypted in Ihrer Datenbank müssen Sie:
Stellen Sie kryptografische Schlüssel bereit, um Ihre Daten zu schützen. Always Encrypted nutzt zwei Arten von Schlüsseln:
- Spaltenverschlüsselungsschlüssel.
- Spaltenhauptschlüssel.
Ein Spaltenverschlüsselungsschlüssel wird verwendet, um Daten in einer verschlüsselten Spalte zu verschlüsseln. Ein Spaltenhauptschlüssel ist ein Schlüssel zum Schutz von Schlüsseln, der einen oder mehrere Spaltenverschlüsselungsschlüssel verschlüsselt.
Sie müssen Spaltenhauptschlüssel in einem vertrauenswürdigen Schlüsselspeicher außerhalb des Datenbanksystems speichern, z. B. Azure Key Vault, Windows-Zertifikatspeicher oder einem Hardwaresicherheitsmodul.
Anschließend müssen Sie Spaltenverschlüsselungsschlüssel bereitstellen und jeden mit einem Spaltenhauptschlüssel verschlüsseln.
Schließlich müssen Sie die Metadaten zu den Schlüsseln in Ihrer Datenbank speichern.
- Die Metadaten des Spaltenhauptschlüssels erfassen den Speicherort des Spaltenhauptschlüssels.
- Die Metadaten des Spaltenverschlüsselungsschlüssels enthalten den verschlüsselten Wert des Spaltenverschlüsselungsschlüssels. Beachten Sie jedoch, dass die Datenbank-Engine die genannten Schlüsselarten niemals im Klartext speichert oder verwendet.
Weitere Informationen zur Verwaltung von Always Encrypted-Schlüsseln finden Sie unter Übersicht über die Schlüsselverwaltung für Always Encrypted.
Konfigurieren Sie die Verschlüsselung für ausgewählte Datenbankspalten mit vertraulichen Daten, die geschützt werden sollen. Dies kann das Erstellen neuer Tabellen mit verschlüsselten Spalten oder das Verschlüsseln vorhandener Datenbankspalten und vorhandener Daten beinhalten. Beim Einrichten der Verschlüsselung für eine Spalte geben Sie die Informationen an einen Verschlüsselungsalgorithmus, einen Spaltenverschlüsselungsschlüssel zum Schutz der Daten in der Spalte und einen Verschlüsselungstyp an. Always Encrypted unterstützt zwei Verschlüsselungstypen:
Bei der deterministischen Verschlüsselung wird für jeden Wert in Klartext immer derselbe verschlüsselte Wert generiert. Die deterministische Verschlüsselung ermöglicht die Punktsuche, Gleichheitsverknüpfung, Gruppierung und Indizierung in verschlüsselten Spalten. Sie erlaubt jedoch auch, dass nicht autorisierte Benutzer Informationen zu verschlüsselten Werten erraten, indem sie die Muster in der verschlüsselten Spalte untersucht, insbesondere wenn es eine kleine Anzahl von möglichen verschlüsselten Werten wie TRUE/FALSE oder die Region Norden/Süden/Osten/Westen gibt.
Diezufällige Verschlüsselung verwendet eine Methode, die Daten in einer weniger vorhersagbaren Weise verschlüsselt. Die zufällige Verschlüsselung ist sicherer, verhindert aber die Suche, Gruppierung, Indizierung und Verknüpfung für verschlüsselte Spalten.
Verwenden Sie die deterministische Verschlüsselung für Spalten, die als Such- oder Gruppierungsparameter verwendet werden, wie z. B. eine Personalausweisnummer. Verwenden Sie die zufällige Verschlüsselung für Daten wie beispielsweise Kommentare zu vertraulichen Untersuchungen, die nicht mit anderen Datensätzen gruppiert oder für die Verknüpfung mit anderen Tabellen verwendet werden.
Informationen zu kryptografischen Algorithmen von Always Encrypted finden Sie unter Always Encrypted-Kryptografie.
Sie können die obigen Schritte mit SQL-Tools ausführen:
- SQL Server Management Studio (SSMS)
- SQL Server-PowerShell
- sqlpackage automatisiert den Setupprozess.
Damit Always Encrypted-Schlüssel und geschützte vertrauliche Daten in der Datenbankumgebung nie in Klartext offengelegt werden, darf die Datenbank-Engine nicht an der Schlüsselbereitstellung oder der Ausführung von Vorgängen zur Datenverschlüsselung oder -entschlüsselung beteiligt werden. Daher unterstützt Transact-SQL (T-SQL) keine Vorgänge zur Schlüsselbereitstellung oder kryptografischen Vorgänge. Aus demselben Grund muss das Verschlüsseln vorhandener Daten oder das erneute Verschlüsseln (mit einem anderen Verschlüsselungstyp oder einem Spaltenverschlüsselungsschlüssel) außerhalb der Datenbank ausgeführt werden (dies kann mit SQL-Tools automatisiert werden).
Hinweis
Always Encrypted mit Secure Enclaves hebt einige der oben genannten Einschränkungen auf, indem kryptografische Vorgänge für vorhandene Daten mit T-SQL zugelassen werden. Außerdem ist es nicht mehr notwendig, die Daten außerhalb der Datenbank zu verschieben.
Funktionsweise von Abfragen für verschlüsselte Spalten
Wenn Sie eine Abfrage für verschlüsselte Datenbankspalten ausführen, Daten in verschlüsselte Spalten einfügen, die Klartextwerte aus verschlüsselten Spalten abrufen oder unterstützte Vorgänge (z. B. Punktsuchvorgänge) für Spalten mithilfe einer deterministischen Verschlüsselung ausführen möchten, muss die Person oder Anwendung, die die Abfrage ausgibt, folgende Voraussetzungen erfüllen:
- Sie benötigt Zugriff auf den Hauptschlüssel der Spalte, mit dem die Daten geschützt sind. Der Schlüsselzugriff ist zusätzlich zu den Berechtigungen auf Datenbankebene erforderlich, z. B. für
SELECT
-Vorgänge in der Tabelle mit den Daten. - Stellen Sie eine Verbindung mit der Datenbank her, und aktivieren Sie in der Datenbankverbindung Always Encrypted. Die meisten SQL-Tools und SQL-Clienttreiber unterstützen die Aktivierung von Always Encrypted für Datenbankverbindungen.
Hinweis
Wenn der Benutzer Datenbankberechtigungen zum Lesen der Daten benötigt, aber keinen Zugriff auf die Schlüssel hat, die sie schützen, kann der Benutzer weiterhin Chiffretext(verschlüsselte)-Daten abrufen, indem er eine Verbindung mit der Datenbank herstellt, ohne „Always Encrypted“ in der Datenbankverbindung zu aktivieren.
So funktionieren Abfragen für verschlüsselte Spalten:
- Wenn eine Anwendung eine parametrisierte Abfrage ausgibt, kontaktiert der SQL-Clienttreiber innerhalb der Anwendung im Hintergrund die Datenbank-Engine (durch Aufrufen von sp_describe_parameter_encryption“ (Transact-SQL)), um zu bestimmen, welche Parameter verschlüsselte Spalten als Ziel haben und verschlüsselt werden müssen. Für jeden Parameter, der verschlüsselt werden muss, empfängt der Treiber den Verschlüsselungsalgorithmus, den Verschlüsselungstyp und Schlüsselmetadaten, einschließlich des Verschlüsselungsschlüssels der verschlüsselten Spalte und des Speicherorts des entsprechenden Spaltenhauptschlüssels.
- Der Treiber ruft den Schlüsselspeicher mit den Spaltenhauptschlüsseln auf, um die Werte der Verschlüsselungsschlüssel der verschlüsselten Spalten zu entschlüsseln. Die resultierenden Klartext-Spaltenverschlüsselungsschlüssel werden zwischengespeichert, um die Anzahl der Roundtrips zum Schlüsselspeicher bei nachfolgenden Verwendungen desselben Spaltenverschlüsselungsschlüssels zu verringern.
- Der Treiber verwendet die erhaltenen Klartext-Spaltenverschlüsselungsschlüssel, um die Abfrageparameter zu verschlüsseln, die verschlüsselten Spalten entsprechen.
- Der Treiber ersetzt die Klartextwerte der Parameter, die auf verschlüsselte Spalten abzielen, durch ihre verschlüsselten Werte und sendet die Abfrage zur Verarbeitung an die Datenbank-Engine.
- Die Datenbank-Engine führt die Abfrage aus. Dies kann Vergleiche auf Gleichheit für Spalten mit deterministischer Verschlüsselung umfassen.
- Wenn Abfrageergebnisse Daten aus verschlüsselten Spalten enthalten, fügt die Datenbank-Engine Verschlüsselungsmetadaten für jede Spalte an das Resultset an, einschließlich der Informationen zum Verschlüsselungsalgorithmus, dem Verschlüsselungstyp und den Schlüsselmetadaten.
- Die Datenbank-Engine sendet das Resultset an die Clientanwendung.
- Der Treiber versucht für jede verschlüsselte Spalte im empfangenen Resultset zunächst, den Klartext-Spaltenverschlüsselungsschlüssel im lokalen Cache zu finden, und führt dann nur einen Roundtrip zum Schlüsselspeicher mit dem Spaltenhauptschlüssel aus, wenn er den Schlüssel nicht im Cache finden kann.
- Der Treiber entschlüsselt die Ergebnisse und gibt Klartextwerte an die Anwendung zurück.
Ein Clienttreiber interagiert mit einem Schlüsselspeicher, der einen Spaltenhauptschlüssel enthält, indem er einen Speicheranbieter für den Spaltenhauptschlüssel verwendet. Dies ist eine clientseitige Softwarekomponente, die einen Schlüsselspeicher einkapselt, der den Spaltenhauptschlüssel enthält. Anbieter für allgemeine Arten von Schlüsselspeichern sind in clientseitigen Treiberbibliotheken von Microsoft oder als eigenständige Downloads verfügbar. Sie können auch einen eigenen Anbieter implementieren. Die Funktionen von Always Encrypted, einschließlich integrierte Speicheranbieter für Spaltenhauptschlüssel, variieren je nach Treiberbibliothek und deren Version.
Unter Entwickeln von Anwendungen mithilfe von Always Encrypted finden Sie die Liste der Clienttreiber, die Always Encrypted unterstützen, sowie Informationen zum Entwickeln von Anwendungen, die verschlüsselte Spalten abfragen.
Sie können verschlüsselte Spalten auch mit SQL-Tools abfragen, z. B. Azure Data Studio oder SSMS.
Begrenzungen
Die folgenden Einschränkungen gelten für Abfragen für verschlüsselte Spalten:
Die deterministische Verschlüsselung unterstützt die folgenden Vorgänge mit Vergleichen auf Gleichheit – andere Vorgänge sind nicht zulässig.
- = (ist gleich) in Punktlookupvorgängen.
- IN.
- SELECT – GROUP BY.
- DISTINCT.
Es sind keine Berechnungen für Spalten zulässig, die mit randomisierter Verschlüsselung verschlüsselt wurden.
Hinweis
Always Encrypted mit Secure Enclaves hebt die obige Einschränkung auf, indem Musterabgleiche, Vergleichsoperatoren, Sortierung und Indizierung für Spalten mit zufälliger Verschlüsselung ermöglicht werden.
Abfrageanweisungen, die Berechnungen mit Klartext- und verschlüsselten Daten auslösen, sind nicht zulässig. Zum Beispiel:
- Vergleichen einer verschlüsselten Spalte mit einer Klartextspalte oder einem Literal
- Kopieren von Daten aus einer Klartextspalte in eine verschlüsselte Spalte (oder umgekehrt) mit UPDATE, BULK INSERT, SELECT INTO oder INSERT..SELECT.
- Einfügen von Literalen in verschlüsselte Spalten
Solche Anweisungen führen zu Fehlern durch Operandenkonflikte wie diesem:
Msg 206, Level 16, State 2, Line 89 Operand type clash: char(11) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_1', column_encryption_key_database_name = 'ssn') collation_name = 'Latin1_General_BIN2' is incompatible with char
Anwendungen müssen Abfrageparameter verwenden, um Werte zu übergeben, die verschlüsselten Spalten entsprechen. Dies gilt z. B., wenn Sie Daten in verschlüsselte Spalten einfügen oder nach verschlüsselten Spalten filtern (bei Verwendung einer deterministischen Verschlüsselung). Das Übergeben von Literalen oder T-SQL-Variablen, die verschlüsselten Spalten entsprechen, wird nicht unterstützt. Weitere spezifische Informationen zu einzelnen Clienttreibern finden Sie unter Entwickeln von Anwendungen mithilfe von Always Encrypted.
Sie müssen die Parameterisierung für Always Encrypted-Variablen in Azure Data Studio oder SSMS verwenden, um Abfragen auszugeben, die Werte übergeben, die verschlüsselten Spalten in diesen Tools entsprechen. Dies gilt z. B., wenn Sie Daten in verschlüsselte Spalten einfügen oder nach verschlüsselten Spalten filtern (bei Verwendung einer deterministischen Verschlüsselung).
Tabellenwertparameter, die auf verschlüsselte Spalten ausgerichtet sind, werden nicht unterstützt
Abfragen, die die folgenden Klauseln verwenden, werden nicht unterstützt:
Führen Sie nach der Änderung der Definition einer verschlüsselten Spalte sp_refresh_parameter_encryption aus, um die Always Encrypted-Metadaten für das Objekt zu aktualisieren.
Always Encrypted wird für die Spalten mit den folgenden Merkmalen nicht unterstützt:
- Spalten, die einen der folgenden Datentypen verwenden; xml, timestamp, rowversion, image, ntext, text, sql_variant, hierarchyid, geography, geometry, Alias, benutzerdefinierte Typen.
- FILESTREAM-Spalten
- Spalten mit der IDENTITY-Eigenschaft
- Spalten mit der ROWGUIDCOL-Eigenschaft
- Zeichenfolgenspalten (varchar, char usw.) mit anderen Sortierungen als binärem Codepunkt (_BIN2) bei Verwendung der deterministischen Verschlüsselung
- Spalten, die bei Verwendung der Zufallsverschlüsselung Schlüssel für gruppierte und nicht gruppierte Indizes darstellen (Indizes in Spalten mit deterministischer Verschlüsselung werden unterstützt)
- In Volltextindizes eingeschlossene Spalten (Always Encrypted unterstützt die Volltextsuche nicht)
- Berechnete Spalten
- Spalten, auf die berechnete Spalten verweisen (wenn der Ausdruck nicht unterstützte Vorgänge für Always Encrypted ausführt)
- Sparsespaltensatz
- Spalten, auf die bei Verwendung der zufälligen Verschlüsselung von Statistiken verwiesen wird (deterministische Verschlüsselung wird unterstützt)
- Partitionierungsspalten
- Spalten mit standardmäßigen Einschränkungen.
- Spalten, auf die Unique-Einschränkungen verweisen, wenn die zufällige Verschlüsselung verwendet wird (deterministische Verschlüsselung wird unterstützt)
- Primärschlüsselspalten, wenn die zufällige Verschlüsselung verwendet wird (deterministische Verschlüsselung wird unterstützt)
- Verweisende Spalten in Fremdschlüsseleinschränkungen bei Verwendung der zufälligen Verschlüsselung oder bei Verwendung der deterministischen Verschlüsselung, falls die referenzierten und die verweisenden Spalten verschiedene Schlüssel oder Algorithmen verwenden
- Spalten, auf die Check-Einschränkungen verweisen.
- Spalten, die mithilfe von Change Data Capture erfasst oder nachverfolgt werden
- Primärschlüsselspalten in Tabellen mit Änderungsnachverfolgung.
- Spalten, die maskiert werden (mithilfe der dynamischen Datenmaskierung)
- Spalten in Stretchdatenbanktabellen (Tabellen mit Spalten, die mit Always Encrypted verschlüsselt sind, können für Stretch aktiviert werden.)
Wichtig
Stretch Database ist in SQL Server 2022 (16.x) und der Azure SQL-Datenbank veraltet. Diese Funktion wird in einer zukünftigen Version der Datenbank-Engine entfernt. Nutzen Sie diese Funktionen bei Neuentwicklungen nicht mehr, und planen Sie die Änderung von Anwendungen, die diese Funktion zurzeit verwenden.
- Spalten in externen (PolyBase)-Tabellen (Hinweis: Die Verwendung von externen Tabellen und Tabellen mit verschlüsselten Spalten in der gleichen Abfrage wird unterstützt)
Die folgenden Funktionen funktionieren nicht bei verschlüsselten Spalten:
- SQL Server-Replikation (Transaktions-, Merge- oder Momentaufnahmereplikation) Physische Replikationsfeatures, einschließlich Always, werden unterstützt.
- Verteilte Abfragen (verknüpfte Server, OPENROWSET (Transact-SQL), OPENDATASOURCE (Transact-SQL))
- Datenbankübergreifende Abfragen, die Joins für Spalten (mit deterministischer Verschlüsselung) aus verschiedenen Datenbanken ausführen
Transact-SQL-Referenz für Always Encrypted
Always Encrypted verwendet die folgenden Transact-SQL-Anweisungen, Systemkatalogsichten, gespeicherten Systemprozeduren und Berechtigungen.
Aufstellungen
- CREATE COLUMN MASTER KEY (Transact-SQL)
- DROP COLUMN MASTER KEY (Transact-SQL)
- CREATE COLUMN ENCRYPTION KEY (Transact-SQL)
- ALTER COLUMN ENCRYPTION KEY (Transact-SQL)
- DROP COLUMN ENCRYPTION KEY (Transact-SQL)
- CREATE TABLE (ENCRYPTED WITH)
Systemkatalogsichten und gespeicherte Prozeduren
- sys.column_encryption_keys (Transact-SQL)
- sys.column_encryption_key_values (Transact-SQL)
- sys.column_master_keys (Transact-SQL)
- sp_refresh_parameter_encryption (Transact-SQL)
- sp_describe_parameter_encryption (Transact-SQL)
Informationen zu Verschlüsselungsmetadaten, die für jede Spalte gespeichert sind, finden Sie auch unter sys.columns (Transact-SQL).
Datenbankberechtigungen
Es gibt vier Datenbankberechtigungen für Always Encrypted:
ALTER ANY COLUMN MASTER KEY: erforderlich zum Erstellen und Löschen von Metadaten zu Spaltenhauptschlüsseln
ALTER ANY COLUMN ENCRYPTION KEY: erforderlich zum Erstellen und Löschen von Metadaten zu Spaltenverschlüsselungsschlüsseln
VIEW ANY COLUMN MASTER KEY DEFINITION: erforderlich, um auf die Metadaten des Spaltenhauptschlüssels, der zum Abfragen verschlüsselter Spalten erforderlich ist, zuzugreifen und sie zu lesen
VIEW ANY COLUMN ENCRYPTION KEY DEFINITION: erforderlich, um auf die Metadaten des Spaltenhauptschlüssels, der zum Abfragen verschlüsselter Spalten erforderlich ist, zuzugreifen und sie zu lesen
In der folgenden Tabelle werden die erforderlichen Berechtigungen für häufig verwendete Aktionen zusammengefasst.
Szenario | ALTER ANY COLUMN MASTER KEY | ALTER ANY COLUMN ENCRYPTION KEY | VIEW ANY COLUMN MASTER KEY DEFINITION | VIEW ANY COLUMN ENCRYPTION KEY DEFINITION |
---|---|---|---|---|
Schlüsselverwaltung (Erstellen/Ändern/Überprüfen von Schlüsselmetadaten in der Datenbank) | X | X | X | X |
Abfragen von verschlüsselten Spalten | X | X |
Wichtige Hinweise
Die Berechtigungen VIEW ANY COLUMN MASTER KEY DEFINITION und VIEW ANY COLUMN ENCRYPTION KEY DEFINITION sind erforderlich, wenn verschlüsselte Spalten ausgewählt werden, auch wenn das Benutzerkonto nicht über die Berechtigung für die Spaltenhauptschlüssel (in seinen Schlüsselspeichern) verfügt, um die Spalten zu schützen und einen Klartextzugriff zu verhindern.
In SQL Server sind die Berechtigungen VIEW ANY COLUMN MASTER KEY DEFINITION und VIEW ANY COLUMN ENCRYPTION KEY DEFINITION standardmäßig der öffentlichen festen Datenbankrolle zugewiesen. Datenbankadministratoren/-administratorinnen können die Berechtigungen der öffentlichen Rolle aufheben und sie bestimmten Rollen oder Benutzerkonten gewähren, um mehr eingeschränkte Steuerung zu implementieren.
In SQL-Datenbank sind die Berechtigungen VIEW ANY COLUMN MASTER KEY DEFINITION und VIEW ANY COLUMN ENCRYPTION KEY DEFINITION standardmäßig der öffentlichen festen Datenbankrolle nicht zugewiesen. Dadurch können bestimmte vorhandene Legacytools (die ältere Versionen von DacFx verwenden) ordnungsgemäß funktionieren. Datenbankadministratoren/-administratorinnen müssen explizit die Berechtigungen VIEW ANY COLUMN MASTER KEY DEFINITION und VIEW ANY COLUMN ENCRYPTION KEY DEFINITION zuweisen, um mit verschlüsselten Spalten zu arbeiten (auch wenn sie nicht entschlüsselt werden).