Uso di Always Encrypted con enclave protette con il driver JDBC

Scaricare il driver JDBC

Questa pagina include informazioni su come sviluppare applicazioni Java usando Always Encrypted con enclave sicure e Microsoft JDBC Driver 8.2 (o versioni successive) per SQL Server.

La funzionalità enclavi sicure è un'aggiunta alla funzionalità Always Encrypted esistente. Lo scopo delle enclavi sicure è gestire le limitazioni quando si lavora con dati Always Encrypted. In precedenza, gli utenti potevano solo eseguire confronti di uguaglianza sui dati Always Encrypted e dovevano recuperare e decrittografare i dati per eseguire altre operazioni. Le enclavi sicure consentono di superare queste limitazioni, permettendo l'esecuzione di calcoli su dati di testo non crittografato all'interno di un enclave sicura sul lato server. Un'enclave sicura è un'area protetta della memoria all'interno del processo di SQL Server. Funge da ambiente di esecuzione attendibile per l'elaborazione di dati sensibili all'interno del motore di SQL Server. Un enclave sicuro viene visualizzato come black box per il resto di SQL Server e altri processi nel computer host. Non vi è alcun modo per visualizzare dati o codice all'interno dell'enclave dall'esterno, anche con un debugger.

Importante

Gli enclave Always Encrypted with Intel Software Guard Extensions (Intel SGX) raggiungeranno la fine del supporto il 31 ottobre 2027. Migra i database interessati prima di questa data. Dopo il 31 ottobre 2027, Azure sposta automaticamente qualsiasi database rimasto nel livello di calcolo della serie DC a un livello di calcolo della serie standard supportata (non DC) e abilita enclave di sicurezza basate sulla virtualizzazione (VBS). Per le opzioni di migrazione, consulta la guida alla migrazione degli enclave Always Encrypted with Intel SGX.

Prerequisiti

  • Assicurarsi che nel computer di sviluppo sia installato Microsoft JDBC Driver 8.2 (o versione successiva) per SQL Server.
  • Verificare che le dipendenze dell'ambiente, ad esempio DLL, archivi di chiavi e così via, si trovino nei percorsi corretti. Always Encrypted con enclave sicuri è un componente aggiuntivo della funzionalità Always Encrypted esistente ed entrambi condividono prerequisiti simili.

Nota

Se si usa una versione precedente di JDK 8, potrebbe essere necessario scaricare e installare i file di criteri di giurisdizione di forza illimitata JCE (Java Cryptography Extension). Assicurarsi di leggere il file Readme incluso nel file ZIP per le istruzioni di installazione e per i dettagli pertinenti su possibili problemi di esportazione/importazione.

I file delle policy possono essere scaricati da Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 Download

Configurazione di enclave sicure

Seguire l'Esercitazione: Introduzione all'uso di Always Encrypted con enclave sicure in SQL Server, Esercitazione: Introduzione all'uso di Always Encrypted con enclavi Intel SGX nel database SQL di Azure o Esercitazione: Introduzione ad Always Encrypted con le enclavi VBS nel database SQL di Azure per iniziare a usare enclave sicure. Per informazioni più approfondite, consultare Always Encrypted con enclave sicure.

Proprietà per la stringa di connessione

Per consentire i calcoli dell'enclave per una connessione di database, è necessario impostare le parole chiave della stringa di connessione seguenti, nonché abilitare Always Encrypted.

  • enclaveAttestationProtocol: specifica un protocollo di attestazione.

    • Se si utilizza SQL Server e Host Guardian Service (HGS), il valore di questa parola chiave dovrebbe essere HGS.
    • Se si usa il database SQL di Azure e l'attestazione di Microsoft Azure, il valore di questa parola chiave deve essere AAS.
    • Se si usano enclave sicure in un ambiente in cui i servizi di attestazione non sono disponibili, il valore di questa parola chiave deve essere NONE. Richiede JDBC 12.2 o versione successiva.
  • enclaveAttestationUrl: specifica un URL di attestazione (endpoint di servizio di attestazione). È necessario ottenere un URL di attestazione per l'ambiente dall'amministratore del servizio di attestazione.

Gli utenti devono abilitare columnEncryptionSetting e impostare correttamente entrambe le proprietà della stringa di connessione sopra indicate per abilitare Always Encrypted con enclave sicure da Microsoft JDBC Driver per SQL Server.

A partire dalla versione 13.6, quando enclaveAttestationProtocol=HGS, il driver valida che il report enclave VBS firmato è vincolato alla chiave pubblica dell'enclave utilizzata per la sessione. L'attestazione fallisce se il report e la chiave della sessione non corrispondono. Non sono necessarie modifiche alla stringa di connessione.

Memorizzazione nella cache delle chiavi di crittografia della colonna

A partire dalla versione 13.6, il driver indirizza le ricerche delle chiavi di crittografia delle colonne enclave tramite SQLServerSymmetricKeyCache, in modo coerente con le operazioni Always Encrypted senza enclave. Le query ripetute all'interno dell'enclave possono riutilizzare una chiave di crittografia di colonna in chiaro memorizzata nella cache invece di inviare un'altra richiesta all'archivio della chiave master di colonna. Questo comportamento riduce le richieste di key store e la latenza delle query, specialmente con archivi remoti come Azure Key Vault, e non richiede modifiche alle applicazioni.

Uso delle enclavi sicure

Quando le proprietà di connessione dell'enclave sono impostate correttamente, il funzionamento è trasparente. Il driver determinerà automaticamente se la query richiede l'uso di un'enclave sicura. Di seguito sono riportati alcuni esempi di query che attivano i calcoli dell'enclave. Puoi trovare la configurazione del database e della tabella in Esercitazione: Introduzione all'utilizzo di Always Encrypted con enclave sicure in SQL Server o Esercitazione: Introduzione all'utilizzo di Always Encrypted con enclave sicure in Database SQL di Azure.

Le query avanzate attiveranno le elaborazioni dell'enclave:

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
            }
        }
    }
}

Per attivare o disattivare la crittografia in una colonna vengono attivati anche i calcoli dell'enclave:

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)");
}

Utenti di Java 8

Questa funzionalità richiede l'algoritmo di firma RSASSA-PSA. Questo algoritmo è stato aggiunto in JDK 11, ma non è stato eseguito il backporting a JDK 8. Gli utenti che desiderano usare questa funzionalità con la versione JDK 8 di Microsoft JDBC Driver per SQL Server devono caricare il proprio provider, che supporta l'algoritmo di firma RSASSA-PSA, o includere la dipendenza facoltativa BouncyCastleProvider. La dipendenza verrà rimossa in un secondo momento in caso di backporting dell'algoritmo di firma in JDK 8 o se termina il ciclo di vita del supporto di JDK 8.