Empfehlen, wann Azure SQL-Datenbank immer verschlüsselt verwendet werden soll

Abgeschlossen

Always Encrypted ist ein Feature zum Schutz vertraulicher Daten, z. B. Kreditkartennummern oder nationale/regionale Identifikationsnummern (z. B. US-Sozialversicherungsnummern), die in Azure SQL-Datenbank, azure SQL Managed Instance und SQL Server-Datenbanken gespeichert sind. Always Encrypted ermöglicht Clients, vertrauliche Daten in Clientanwendungen zu verschlüsseln und die Verschlüsselungsschlüssel niemals für das Datenbankmodul offenzulegen. Always Encrypted bietet eine Trennung zwischen denjenigen, die die Daten besitzen und diese anzeigen können, und denjenigen, die die Daten verwalten, aber keinen Zugriff haben sollten – lokale Datenbankadministratoren, Clouddatenbankoperatoren oder andere nicht autorisierte Benutzer mit hoher Berechtigung. Daher ermöglicht Always Encrypted 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 umfassen. Zeigen Sie z. B. Nachschlagevorgänge oder Gleichheitsverknüpfungen an. Solche Abfragen verwenden deterministische Verschlüsselung.

Diagramm mit einem Beispiel für eine immer verschlüsselte Datenbank.

Hinweis

Sichere Enklaven erweitern vertrauliche Computerfunktionen von Always Encrypted mit Musterabgleich, anderen Vergleichsoperatoren und direkte Verschlüsselung.

Always Encrypted macht Verschlüsselung für Anwendungen transparent. Ein Always Encrypted-aktivierter Treiber, der auf dem Clientcomputer installiert ist, verschlüsselt und entschlüsselt automatisch vertrauliche Daten in der Clientanwendung. Der Treiber verschlüsselt die Daten in vertraulichen Spalten, bevor die Daten an das Datenbankmodul übergeben werden. Anschließend schreibt der Treiber Abfragen automatisch um, sodass die Semantik für die Anwendung erhalten bleibt. Ebenso entschlüsselt der Treiber Daten transparent, die in verschlüsselten Datenbankspalten gespeichert sind, die in Abfrageergebnissen enthalten sind.

Konfigurieren von Always Encrypted

Zum Einrichten von Always Encrypted in Ihrer Datenbank müssen Sie:

  1. 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, der einen oder mehrere Spaltenverschlüsselungsschlüssel verschlüsselt und dadurch schützt. Sie müssen Spaltenmasterschlüssel in einem vertrauenswürdigen Schlüsselspeicher außerhalb des Datenbanksystems speichern. Die am häufigsten verwendeten Speicherorte sind Azure Key Vault, Windows-Zertifikatspeicher oder ein Hardwaresicherheitsmodul. Anschließend müssen Sie Spaltenverschlüsselungsschlüssel bereitstellen und jeden mit einem Spaltenmasterschlüssel verschlüsseln. Schließlich müssen Sie die Metadaten zu den Schlüsseln in Ihrer Datenbank speichern.

    • Die Metadaten des Spaltenmasterschlüssels geben an, wo dieser gespeichert ist.
    • 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.
  2. Konfigurieren Sie die Verschlüsselung für ausgewählte Datenbankspalten, die vertrauliche Daten enthalten, die geschützt werden sollen. Sie können neue Tabellen mit verschlüsselten Spalten erstellen oder vorhandene Datenbankspalten und vorhandene Daten verschlüsseln. Beim Einrichten der Verschlüsselung für eine Spalte geben Sie die Informationen zu einem 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:

    • Deterministische Verschlüsselung generiert immer denselben verschlüsselten Wert für einen bestimmten Nur-Text-Wert. Die Verwendung der deterministischen Verschlüsselung ermöglicht Punktsuche, Gleichheitsverknuppungen, Gruppieren und Indizieren in verschlüsselten Spalten. Es kann jedoch auch nicht autorisierten Benutzern erlauben, Informationen über verschlüsselte Werte zu erraten, indem Muster in der verschlüsselten Spalte untersucht werden, insbesondere, wenn es eine kleine Gruppe möglicher verschlüsselter Werte wie "True/False" oder "North/South/East/West"-Region gibt.
    • Randomisierte Verschlüsselung verwendet eine Methode, mit der Daten auf weniger vorhersehbare Weise verschlüsselt werden. Die zufällige Verschlüsselung ist sicherer, verhindert jedoch die Suche, Gruppierung, Indizierung und Verknüpfung zu verschlüsselten Spalten.

    Verwenden Sie die deterministische Verschlüsselung für Spalten, die als Such- oder Gruppierungsparameter verwendet werden. Beispielsweise eine Regierungs-ID-Nummer. Verwenden Sie die zufällige Verschlüsselung für Daten wie vertrauliche Untersuchungskommentare, die nicht mit anderen Datensätzen gruppiert sind und nicht zum Verknüpfen von 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:

    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ützen Transact-SQL (T-SQL) keine Schlüsselbereitstellung oder kryptografische 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).

Wie Abfragen für verschlüsselte Spalten funktionieren

Eine Reihe von Voraussetzungen muss erfüllt werden, wenn der Benutzer eine der folgenden Aktionen ausführen muss:

  • Ausführen einer Abfrage für verschlüsselte Datenbankspalten
  • Einfügen von Daten in verschlüsselte Spalten
  • Abrufen von Nur-Text-Werten aus verschlüsselten Spalten
  • Ausführen unterstützter Vorgänge (z. B. Punktsuche) für Spalten mit deterministischer Verschlüsselung

Ein Benutzer oder eine Anwendung, die die Abfrage ausgibt, muss die folgenden Voraussetzungen erfüllen:

  • Zugriff auf den Spaltenmasterschlüssel haben, der die Daten schützt. Zusätzlich zu den Berechtigungen auf Datenbankebene ist der Schlüsselzugriff auf die Tabelle, die die Daten enthält, erforderlich, wie z. B. SELECT.
  • Stellen Sie eine Verbindung mit der Datenbank her, wobei "Immer verschlüsselt" in der Datenbankverbindung aktiviert ist. Die meisten SQL-Tools und SQL-Clienttreiber unterstützen die Aktivierung von Always Encrypted für Datenbankverbindungen.

Hinweis

Wenn der Benutzer über die erforderlichen Datenbankberechtigungen zum Lesen der Daten verfügt, aber keinen Zugriff auf die Schlüssel, die sie schützen, hat, sind keine Aktionen möglich. Der Benutzer kann Verschlüsselungstextdaten (verschlüsselt) abrufen, indem eine Verbindung mit der Datenbank hergestellt wird, ohne always Encrypted in der Datenbankverbindung zu aktivieren.

So funktionieren Abfragen für verschlüsselte Spalten:

  1. Wenn eine Anwendung eine parametrisierte Abfrage ausgibt, kontaktiert der SQL-Clienttreiber innerhalb der Anwendung transparent das Datenbankmodul (durch Aufrufen von sp_describe_parameter_encryption (Transact-SQL), um zu bestimmen, welche Parameter verschlüsselte Spalten als Ziel haben und verschlüsselt werden sollen. 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üsselten Spaltenverschlüsselungsschlüssels und des Speicherorts des entsprechenden Spaltenmasterschlüssels.
  2. Der Treiber ruft den Schlüsselspeicher auf, der Spaltenmasterschlüssel enthält, um die verschlüsselten Spaltenverschlüsselungsschlüsselwerte zu entschlüsseln. Die resultierenden Verschlüsselungsschlüssel für Nur-Text-Spalten werden zwischengespeichert, um die Anzahl der Roundtrips zum Schlüsselspeicher bei nachfolgenden Verwendungen derselben Spaltenverschlüsselungsschlüssel zu reduzieren.
  3. Der Treiber verwendet die erhaltenen Verschlüsselungsschlüssel für Nur-Text-Spalten, um die Abfrageparameter zu verschlüsseln, die verschlüsselten Spalten entsprechen.
  4. Der Treiber ersetzt die Nur-Text-Werte der Parameter, die auf verschlüsselte Spalten mit ihren verschlüsselten Werten abzielen, und die Abfrage wird zur Verarbeitung an das Datenbankmodul gesendet.
  5. Das Datenbankmodul führt die Abfrage aus, die Gleichheitsvergleiche für Spalten mit deterministischer Verschlüsselung umfassen kann.
  6. Wenn Abfrageergebnisse Daten aus verschlüsselten Spalten enthalten, fügt das Datenbankmodul Verschlüsselungsmetadaten für jede Spalte an, einschließlich der Informationen zum Verschlüsselungsalgorithmus, dem Verschlüsselungstyp und den Schlüsselmetadaten an das Resultset.
  7. Das Datenbankmodul sendet das Resultset an die Clientanwendung.
  8. Für jede verschlüsselte Spalte im empfangenen Resultset versucht der Treiber zuerst, den Verschlüsselungsschlüssel für Nur-Text-Spalten im lokalen Cache zu finden, und macht nur einen Roundtrip zu einem Schlüsselspeicher, der den Spaltenmasterschlüssel enthält, wenn er den Schlüssel im Cache nicht finden kann.
  9. Der Treiber entschlüsselt die Ergebnisse und gibt Nur-Text-Werte an die Anwendung zurück.

Ein Clienttreiber interagiert mit einem Schlüsselspeicher, der einen Spaltenhauptschlüssel enthält, mithilfe eines Anbieters für den Spaltenhauptschlüsselspeicher, bei dem es sich um eine clientseitige Softwarekomponente handelt, die einen Schlüsselspeicher mit dem Spaltenhauptschlüssel kapselt. 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 Ihren eigenen Anbieter implementieren. Always Encrypted-Funktionen, einschließlich der integrierten Anbieter von Spaltenhauptschlüsselspeichern, variieren je nach Treiberbibliothek und Version.

Siehe Entwickeln von Anwendungen mit Always Encrypted für eine Liste der Clienttreiber, die Always Encrypted unterstützen, und für Informationen darüber, wie Anwendungen entwickelt werden, die verschlüsselte Spalten abfragen.

Sie können verschlüsselte Spalten auch mit SQL-Tools abfragen, z. B. Azure Data Studio oder SSMS.

Einschränkungen

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.

  • Es sind keine Berechnungen für Spalten zulässig, die mit randomisierter Verschlüsselung verschlüsselt wurden.

Hinweis

Always Encrypted mit sicheren Enklaven lockert die Beschränkungen, indem es Mustererkennung, Vergleichsoperatoren, Sortieren und Indizieren von Spalten mit zufälliger Verschlüsselung ermöglicht.

  • Abfrageanweisungen, die Berechnungen mit Klartext- und verschlüsselten Daten auslösen, sind nicht zulässig. 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:

Output
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. Wenn Sie z. B. Daten in verschlüsselte Spalten einfügen oder nach verschlüsselten Spalten filtern (bei verwendung deterministischer 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 ausstellen, die Werte übergeben, die verschlüsselten Spalten in diesen Tools entsprechen. Wenn Sie z. B. Daten in verschlüsselte Spalten einfügen oder nach verschlüsselten Spalten filtern (bei verwendung deterministischer 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, Zeitstempel, Zeilenversion, Bild, ntext, Text, sql_variant, Hierarchie-ID, Geografie, Geometrie, 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)
    • Spalten, die in Volltextindizes enthalten sind (Always Encrypted unterstützt keine Volltextsuche).
    • Berechnete Spalten.
    • Spalten, auf die berechnete Spalten verweisen (wenn der Ausdruck nicht unterstützte Vorgänge für Always Encrypted ausführt).
    • Spärlicher Spaltensatz.
    • Spalten, auf die von statistiken bei Verwendung zufälliger Verschlüsselung verwiesen werden (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 sind (mithilfe der dynamischen Datenformatierung).
    • Spalten in Stretchdatenbanktabellen. (Tabellen mit Spalten, die mit Always Encrypted verschlüsselt sind, können für Stretch aktiviert werden.)

Von Bedeutung

Stretch-Datenbank ist in SQL Server 2022 (16.x) und Azure SQL-Datenbank veraltet. Dieses Feature wird in einer zukünftigen Version des Datenbankmoduls entfernt. Vermeiden Sie die Verwendung dieses Features in neuer Entwicklungsarbeit, und planen Sie, Anwendungen zu ändern, die derzeit dieses Feature verwenden.

Transact-SQL-Referenz für Always Encrypted

„Always Encrypted“ verwendet die folgenden Transact-SQL-Anweisungen, Systemkatalogansichten, gespeicherten Systemprozeduren und Berechtigungen.

Erklärungen

Systemkatalogsichten und gespeicherte Prozeduren

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 Spaltenmasterschlüssel-Metadaten.
  • ALTER ANY COLUMN ENCRYPTION KEY – erforderlich zum Erstellen und Löschen von Metadaten für Spaltenverschlüsselungsschlüssel.
  • Anzeigen beliebiger Spaltenmasterschlüsseldefinitionen - erforderlich, um auf die Metadaten des Column Master Key zuzugreifen und diese zu lesen, die zum Abfragen verschlüsselter Spalten benötigt werden.
  • Anzeige jeglicher Spaltenverschlüsselungsschlüsseldefinition – erforderlich, um auf die Metadaten des Spaltenmasterschlüssels zuzugreifen und diese zu lesen, die zum Abfragen verschlüsselter Spalten notwendig sind.

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 Überlegungen

  • 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. Ein Datenbankadministrator kann die Berechtigungen für die öffentliche Rolle widerrufen (oder verweigern) und sie bestimmten Rollen oder Benutzern gewähren, um eine eingeschränkte Kontrolle 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. Um mit verschlüsselten Spalten zu arbeiten (auch wenn sie nicht entschlüsselt werden), muss ein Datenbankadministrator explizit die Berechtigungen VIEW ANY COLUMN MASTER KEY DEFINITION und VIEW ANY COLUMN ENCRYPTION KEY DEFINITION erteilen.