Verwenden von Always Encrypted mit sicheren Enklaven im JDBC-Treiber

JDBC-Treiber herunterladen

Dieser Artikel enthält Informationen zum Entwickeln von Java-Anwendungen mithilfe von Always Encrypted mit Secure Enclaves und des Microsoft JDBC-Treibers 8.2 (oder höher) für SQL Server.

Das Secure Enclaves-Feature ist eine Ergänzung des bereits vorhandenen Always Encrypted-Features. Mit Secure Enclaves sollen Einschränkungen bei der Arbeit mit Always Encrypted-Daten beseitigt werden. Bisher konnten Benutzer für Always Encrypted-Daten nur Gleichheitsvergleiche durchführen und mussten die Daten abrufen und entschlüsseln, um andere Vorgänge durchführen zu können. Secure Enclaves beseitigen diese Einschränkungen, indem Berechnungen für Klartextdaten innerhalb einer Secure Enclave auf Serverseite zugelassen werden. Eine Secure Enclave ist ein geschützter Speicherbereich innerhalb des SQL Server-Prozesses. Sie fungiert als vertrauenswürdige Ausführungsumgebung für die Verarbeitung vertraulicher Daten innerhalb der SQL Server-Engine. Eine sichere Enklave erscheint für den Rest von SQL Server und andere Prozesse auf dem Hostcomputer als Blackbox. Es gibt keine Möglichkeit, Daten oder Code innerhalb der Enclave von außen anzuzeigen, auch nicht mit einem Debugger.

Important

Der Support für Always Encrypted mit Intel Software Guard Extensions (Intel SGX)-Enklaven endet am 31. Oktober 2027. Migrieren Sie betroffene Datenbanken vor diesem Datum. Nach dem 31. Oktober 2027 verschiebt Azure automatisch jede Datenbank, die sich auf der DC-Serien-Compute-Stufe befindet, auf eine unterstützte Standardserien-Compute-Stufe (nicht-DC) und aktiviert virtualisierungsbasierte Sicherheits-Enklaven (VBS). Für Migrationsoptionen siehe Always Encrypted with Intel SGX Enclaves Migrationsleitfaden.

Voraussetzungen

  • Stellen Sie sicher, dass der Microsoft JDBC-Treiber 8.2 (oder höher) für SQL Server auf dem Entwicklungscomputer installiert ist.
  • Überprüfen Sie, ob sich die Umgebungsabhängigkeiten wie DLLs, Keystores usw. jeweils im richtigen Pfad befinden. Always Encrypted mit Secure Enclaves ist ein Add-On für das bereits vorhandene Always Encrypted-Feature und verfügt über ähnliche Voraussetzungen.

Hinweis

Wenn Sie eine ältere Version von JDK 8 verwenden, müssen Sie möglicherweise die Richtliniendateien „Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction“ herunterladen und installieren. Achten Sie darauf, die in der ZIP-Datei enthaltene Infodatei zu lesen, um Installationsanweisungen und relevante Details zu möglichen Export-/Importproblemen zu erhalten.

Diese Richtliniendateien können unter Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 Download heruntergeladen werden.

Einrichten von Secure Enclaves

Folgen Sie Tutorial: Erste Schritte unter Verwendung von Always Encrypted mit Secure Enclaves in SQL Server, Tutorial: Erste Schritte unter Verwendung von Always Encrypted mit Intel SGX-Enclaves in Azure SQL-Datenbank oder Tutorial: Erste Schritte mit Always Encrypted mit VBS-Enclaves in Azure SQL-Datenbank, um erste Schritte mit Secure Enclaves auszuführen. Ausführlichere Informationen finden Sie unter Always Encrypted mit Secure Enclaves.

Eigenschaften der Verbindungszeichenfolge

Um Enclaveberechnungen für eine Datenbankverbindung zu ermöglichen, müssen Sie zusätzlich zur Aktivierung von Always Encrypted die folgenden Schlüsselwörter für die Verbindungszeichenfolge festlegen.

  • enclaveAttestationProtocol: gibt ein Nachweisprotokoll an.

    • Wenn Sie SQL Server und den Host-Überwachungsdienst (Host Guardian Service, HGS) verwenden, sollte der Wert dieses Schlüsselworts HGS lauten.
    • Wenn Sie Azure SQL-Datenbank und Microsoft Azure Attestation verwenden, sollte der Wert dieses Schlüsselworts AAS lauten.
    • Wenn Sie Secure Enclaves in einer Umgebung verwenden, in der keine Nachweisdienste verfügbar sind, sollte der Wert dieses Schlüsselworts NONE sein. Erfordert JDBC 12.2 oder höher.
  • enclaveAttestationUrl: gibt eine Nachweis-URL (einen Endpunkt für den Nachweisdienst) an. Sie benötigen für Ihre Umgebung eine Nachweis-URL von dem Dienstadministrator, der für Nachweise zuständig ist.

Benutzer müssen columnEncryptionSetting aktivieren und beide der oben genannten Verbindungszeichenfolgen-Eigenschaften richtig festlegen, um Always Encrypted mit Secure Enclaves aus dem Microsoft JDBC-Treiber für SQL Server zu aktivieren.

Ab Version 13.6 prüft der Treiber, wenn enclaveAttestationProtocol=HGS, ob der signierte VBS-Enklave-Bericht an den für die Sitzung verwendeten öffentlichen Schlüssel der Enklave gebunden ist. Die Attestation scheitert, wenn Bericht und Sitzungsschlüssel nicht übereinstimmen. Es sind keine Änderungen an der Verbindungszeichenfolge erforderlich.

Zwischenspeicherung von Spaltenverschlüsselungsschlüsseln

Ab Version 13.6 leitet der Treiber die Suche nach Enclave-Spaltenverschlüsselungsschlüsseln über SQLServerSymmetricKeyCache weiter, im Einklang mit Always Encrypted-Vorgängen ohne Enclave. Wiederholte Enklave-Abfragen können einen zwischengespeicherten Klartext-Spaltenverschlüsselungsschlüssel wiederverwenden, anstatt eine weitere Anfrage an den Spalten-Hauptschlüsselspeicher zu stellen. Dieses Verhalten reduziert Anfragen an den Schlüsselspeicher und die Abfragelatenz, insbesondere bei entfernten Speichern wie Azure Key Vault, und erfordert keine Anwendungsänderungen.

Arbeiten mit sicheren Enklaven

Wenn die Verbindungseigenschaften der Enclaves richtig festgelegt wurden, arbeitet das Feature transparent. Der Treiber stellt automatisch fest, ob für die Abfrage Secure Enclaves erforderlich sind. Im Folgenden sind Beispiele für Abfragen, die Enclave-Berechnungen auslösen. Informationen zum Einrichten von Datenbank und Tabellen finden Sie im Tutorial: Erste Schritte mit Always Encrypted mit Secure Enclaves in SQL Server und im Tutorial: Erste Schritte mit Always Encrypted mit Secure Enclaves in Azure SQL-Datenbank.

Umfangreiche Abfragen lösen Enclave-Berechnungen aus:

private static final String URL = "jdbc:sqlserver://<server>:<port>;encrypt=true;user=<username>;password=<password>;databaseName=ContosoHR;columnEncryptionSetting=enabled;enclaveAttestationUrl=<attestation-url>;enclaveAttestationProtocol=<attestation-protocol>;";
try (Connection c = DriverManager.getConnection(URL)) {
    try (PreparedStatement p = c.prepareStatement("SELECT * FROM Employees WHERE SSN LIKE ?")) {
        p.setString(1, "%6818");
        try (ResultSet rs = p.executeQuery()) {
            while (rs.next()) {
                // Do work with data
            }
        }
    }
    
    try (PreparedStatement p = c.prepareStatement("SELECT * FROM Employees WHERE SALARY > ?")) {
        ((SQLServerPreparedStatement) p).setMoney(1, new BigDecimal(0));
        try (ResultSet rs = p.executeQuery()) {
            while (rs.next()) {
                // Do work with data
            }
        }
    }
}

Das Verschlüsseln von Spalten löst ebenfalls Enclave-Berechnungen aus:

private static final String URL = "jdbc:sqlserver://<server>:<port>;encrypt=true;user=<username>;password=<password>;databaseName=ContosoHR;columnEncryptionSetting=enabled;enclaveAttestationUrl=<attestation-url>;enclaveAttestationProtocol=<attestation-protocol>;";
try (Connection c = DriverManager.getConnection(URL);Statement s = c.createStatement()) {
    s.executeUpdate("ALTER TABLE Employees ALTER COLUMN SSN CHAR(11) NULL WITH (ONLINE = ON)");
}

Benutzer von Java 8

Diese Funktion erfordert den Signaturalgorithmus RSASSA-PSA. Dieser Algorithmus wurde in JDK 11 hinzugefügt, aber nicht auf JDK 8 zurückportiert. Benutzer, die dieses Feature mit der JDK 8-Version von Microsoft JDBC-Treiber für SQL Server verwenden möchten, müssen entweder einen eigenen Anbieter laden, der den Signaturalgorithmus RSASSA-PSA unterstützt, oder die optionale BouncyCastleProvider-Abhängigkeit integrieren. Diese Abhängigkeit wird später entfernt, wenn der Signaturalgorithmus auf JDK 8 zurückportiert wird oder der Support-Lebenszyklus von JDK 8 endet.