Creare e usare indici in colonne usando Always Encrypted con enclave sicuriCreate and use indexes on columns using Always Encrypted with secure enclaves

Si applica a:Applies to: sìSQL Server 2019 (15.x)SQL Server 2019 (15.x)yesSQL Server 2019 (15.x)SQL Server 2019 (15.x) - Solo Windows Sìdatabase SQL di AzureAzure SQL DatabaseYesdatabase SQL di AzureAzure SQL DatabaseSi applica a:Applies to: sìSQL Server 2019 (15.x)SQL Server 2019 (15.x)yesSQL Server 2019 (15.x)SQL Server 2019 (15.x) - Windows only Sìdatabase SQL di AzureAzure SQL DatabaseYesdatabase SQL di AzureAzure SQL Database

Questo articolo descrive come creare e usare gli indici nelle colonne crittografate usando chiavi di crittografia di colonna abilitate per l'enclave con Always Encrypted con enclave sicuri.This article describes how to create and use indexes on columns encrypted using enclave-enabled column encryption keys with Always Encrypted with secure enclaves.

Always Encrypted con enclave sicuri supporta:Always Encrypted with secure enclaves supports:

  • Indici cluster e non cluster nelle colonne crittografate con la crittografia deterministica e le chiavi abilitate per l'enclave.Clustered and non-clustered indexes on columns encrypted using deterministic encryption and enclave-enabled keys.
    • Tali indici sono ordinati in base al testo crittografatoSuch indexes are sorted based on ciphertext. e non richiedono considerazioni particolari.No special considerations apply to such indexes. È possibile gestirli e usarli allo stesso modo degli indici nelle colonne crittografate con la crittografia deterministica e le chiavi non abilitate per l'enclave (come con Always Encrypted).You can manage and use them the same way as indexes on columns encrypted using deterministic encryption and keys that aren't enclave-enabled (as with Always Encrypted).
  • Indici non cluster nelle colonne crittografate con la crittografia casuale e le chiavi abilitate per l'enclave.Nonclustered indexes on columns encrypted using randomized encryption and enclave-enabled keys.
    • I valori delle chiavi nella struttura dei dati dell'indice (albero B) vengono crittografati e ordinati in base ai relativi valori del testo non crittografato.The key values in the index data structure (B-tree) are encrypted and sorted based on their plaintext values. Per altre informazioni, vedere indici nelle colonne abilitate per l'enclave.For more information, see Indexes on enclave-enabled columns.

Nota

Nel resto dell'articolo vengono illustrati gli indici non cluster nelle colonne crittografate con la crittografia casuale e le chiavi abilitate per l'enclave.The remainder of this article discusses nonclustered indexes on columns encrypted using randomized encryption and enclave-enabled keys.

Poiché un indice su una colonna che usa la crittografia casuale e una chiave di crittografia di colonna abilitata per l'enclave contiene dati crittografati (testo crittografato) ordinati in base al testo non crittografato, il motore di SQL Server deve usare l'enclave per qualsiasi operazione che comporta la creazione, l'aggiornamento o la ricerca in un indice, tra cui:Since an index on a column using randomized encryption and an enclave-enabled column encryption key contains encrypted (ciphertext) data sorted based on plaintext, SQL Server Engine must use the enclave for any operation that involves creating, updating, or searching an index, including:

  • Creazione o ricompilazione di un indice.Creating or rebuilding an index.
  • Inserimento, aggiornamento o eliminazione di una riga in una tabella (contenente una colonna indicizzata/crittografata), che attiva l'inserimento e/o la rimozione di una chiave di indice nell'indice.Inserting, updating, or deleting a row in a table (containing an indexed/encrypted column), which triggers inserting and/or removing an index key to/from the index.
  • Esecuzione di comandi DBCC che comportano la verifica dell'integrità degli indici, ad esempio DBCC CHECKDB (Transact-SQL) oppure DBCC CHECKTABLE (Transact-SQL).Running DBCC commands that involve checking the integrity of indexes, for example DBCC CHECKDB (Transact-SQL) or DBCC CHECKTABLE (Transact-SQL).
  • Ripristino del database (ad esempio, dopo il riavvio di SQL Server in seguito a un errore), se SQL Server deve annullare eventuali modifiche all'indice (altre informazioni di seguito).Database recovery (for example, after SQL Server fails and restarts), if SQL Server needs to undo any changes to the index (more details below).

Tutte le operazioni precedenti richiedono che l'enclave abbia la chiave di crittografia di colonna per la colonna indicizzata.All of the above operations require the enclave to have the column encryption key for the indexed column. La chiave è necessaria per decrittografare le chiavi di indice.The key is needed to decrypt the index keys. In generale, l'enclave può ottenere una chiave di crittografia della colonna in due modi:In general, the enclave can obtain a column encryption key in one of two ways:

  • Direttamente dall'applicazione client.Directly from the client application.
  • Dalla cache delle chiavi di crittografia della colonna.From the cache of column encryption keys.

Richiamare operazioni di indicizzazione con chiavi di crittografia della colonna fornite direttamente dal clientInvoke indexing operations with column encryption keys provided directly by the client

Per il corretto funzionamento di questo metodo per richiamare le operazioni di indicizzazione, l'applicazione, incluso uno strumento come SQL Server Management Studio (SSMS), che esegue una query che attiva un'operazione su un indice deve:For this method for invoking indexing operations to work, the application (including a tool, such as SQL Server Management Studio (SSMS)) issuing a query that triggers an operation on an index must:

  • Connettersi al database con Always Encrypted e i calcoli dell'enclave abilitati per la connessione di database.Connect to the database with both Always Encrypted and enclave computations enabled for the database connection.
  • L'applicazione deve avere accesso alla chiave master della colonna che protegge la chiave di crittografia della colonna per la colonna indicizzata.The application must have access to the column master key protecting the column encryption key for the indexed column.

Quando il motore di SQL Server analizza la query dell'applicazione e determina che sarà necessario aggiornare un indice su una colonna crittografata per eseguire la query, indica al driver client di fornire all'enclave la chiave di crittografia di colonna richiesta tramite un canale sicuro.Once SQL Server Engine parses the application query and determines it will need to update an index on an encrypted column to execute the query, it instructs the client driver to release the required column encryption key to the enclave over a secure channel. Si tratta esattamente dello stesso meccanismo usato per fornire all'enclave le chiavi di crittografia di colonna per l'elaborazione di tutte le altre query che non usano indici,This is exactly the same mechanism that is used to provide the enclave with column encryption keys for processing any other queries that don't use indexes. ad esempio la crittografia sul posto o le query che usano criteri di ricerca e confronti di intervalli.For example, in-place encryption or queries using pattern matching and range comparisons.

Questo metodo è utile per garantire che la presenza di indici su colonne crittografate sia trasparente per le applicazioni già connesse al database con Always Encrypted e i calcoli dell'enclave abilitati.This method is useful to ensure the presence of indexes on encrypted columns is transparent to applications that are already connected to the database with Always Encrypted and enclave computations enabled. La connessione dell'applicazione può usare l'enclave per l'elaborazione delle query.The application connection can use the enclave for query processing. Dopo aver creato un indice su una colonna, il driver all'interno dell'app fornirà in modo trasparente le chiavi di crittografia della colonna all'enclave per le operazioni di indicizzazione.After you create an index on a column, the driver inside your app will transparently provide column encryption keys to the enclave for indexing operations. La creazione di indici può aumentare il numero di query che richiedono all'applicazione di inviare all'enclave le chiavi di crittografia della colonna.Creating indexes may increase the number of queries that require the application to send the column encryption keys to the enclave.

Per usare questo metodo, seguire le indicazioni generali per l'esecuzione di istruzioni usando un'enclave sicura in Eseguire istruzioni Transact-SQL con enclave sicure.To use this method, follow the general guidance for running statements using a secure enclave in - Run Transact-SQL statements using secure enclaves.

Per istruzioni dettagliate su come usare questo metodo, vedere Esercitazione: Creazione e uso di indici sulle colonne abilitate per l'enclave tramite la crittografia casuale.For step-by-step instructions on how to use this method, see Tutorial: Creating and using indexes on enclave-enabled columns using randomized encryption.

Richiamare operazioni di indicizzazione mediante chiavi di crittografia di colonna memorizzate nella cacheInvoke indexing operations using cached column encryption keys

Una volta che un'applicazione client invia all'enclave una chiave di crittografia di colonna per l'elaborazione di qualsiasi query che richiede i calcoli dell'enclave, l'enclave memorizza la chiave di crittografia di colonna in una cache interna.Once a client application sends a column encryption key to the enclave for processing any query that requires enclave computations, the enclave caches the column encryption key in an internal cache. Questa cache si trova all'interno dell'enclave e non è accessibile dall'esterno.This cache is located inside the enclave and inaccessible from the outside.

Se la stessa o un'altra applicazione client usata dallo stesso o da un altro utente attiva un'operazione su un indice senza specificare direttamente la crittografia della colonna richiesta, l'enclave cerca la chiave di crittografia di colonna nella cache.If the same or another client application used by the same or a different user triggers an operation on an index without providing the required column encryption directly, the enclave will look up the column encryption key in the cache. Di conseguenza, l'operazione sull'indice ha esito positivo, anche se l'applicazione client non ha fornito la chiave.As a result, the operation on the index succeeds, although the client application hasn't provided the key.

Per il corretto funzionamento di questo metodo di richiamo delle operazioni di indicizzazione, l'applicazione deve connettersi al database senza Always Encrypted abilitato per la connessione e la chiave di crittografia della colonna richiesta deve essere disponibile nella cache all'interno dell'enclave.For this method of invoking indexing operations to work, the application must connect to the database without Always Encrypted enabled for the connection and the required column encryption key must be available in the cache inside the enclave.

Questo metodo di chiamata delle operazioni è supportato solo per le query che non richiedono chiavi di crittografia di colonna per le altre operazioni non correlate agli indici.This method of invoking operations is supported only for queries that don't require column encryption keys for other operations, not related to indexes. Ad esempio, un'applicazione che inserisce una riga tramite un'istruzione INSERT in una tabella che contiene una colonna crittografata deve connettersi al database con Always Encrypted abilitato nella stringa di connessione e deve avere accesso alle chiavi, indipendentemente dal fatto che la colonna crittografata contenga un indice o meno.For example, an application inserting a row using an INSERT statement to a table that contains an encrypted column, is required to connect to the database with Always Encrypted enabled in the connection string and it must have access to the keys, regardless if the encrypted column has an index or not.

Questo metodo è utile per:This method is useful to:

  • Assicurare che la presenza di indici sulle colonne abilitate per l'enclave con crittografia casuale sia trasparente per le applicazioni e gli utenti che non hanno accesso alle chiavi e ai dati come testo non crittografato.Ensure the presence of indexes on enclave-enabled columns using randomized encryption is transparent to applications and users that don't have access to the keys and the data in plaintext.

  • Garantire che la creazione di un indice in una colonna crittografata non rallenti le query esistenti.It ensures creating an index on an encrypted column doesn't brake existing queries. Se un'applicazione esegue una query su una tabella contenente colonne crittografate senza la necessità di avere accesso alle chiavi, l'applicazione può continuare a essere eseguita senza aver accesso alle chiavi dopo che un amministratore di database crea un indice.If an application issues a query on a table containing encrypted columns without having to have access to the keys, the application can continue to run without having access to the keys after a DBA creates an index. Ad esempio, si consideri un'applicazione che esegue la query seguente sulla tabella Employees che contiene colonne crittografate.For example, consider an application that runs the below query on the Employees table that contains encrypted columns. L'amministratore di database non ha creato un indice su nessuna colonna crittografata.The DBA hasn't created an index on any encrypted column.

    DELETE FROM [dbo].[Employees] WHERE [EmployeeID] = 1;
    GO
    

    Se l'applicazione invia la query tramite una connessione senza Always Encrypted e i calcoli dell'enclave abilitati, la query avrà esito positivo.If the application submits the query over a connection without Always Encrypted and enclave computations enabled, the query will succeed. La query non attiva alcun calcolo sulle colonne crittografate.The query does not trigger any computations on encrypted columns. Dopo che un amministratore di database crea un indice su colonne crittografate, la query attiva la rimozione dagli indici delle chiavi di indice.After a DBA creates an index on any encrypted columns, the query triggers the removal of index keys from indexes. In questa situazione, l'enclave necessita delle chiavi di crittografia di colonna.The enclave needs the column encryption keys in this situation. L'applicazione sarà comunque in grado di continuare a eseguire questa query tramite la stessa connessione, purché il proprietario dei dati abbia fornito all'enclave le chiavi di crittografia della colonna.However, the application will be able to continue to run this query over the same connection, as long as a data owner has supplied the column encryption keys to the enclave.

  • Per ottenere la separazione dei ruoli durante la gestione degli indici, perché consente agli amministratori di database di creare e modificare gli indici su colonne crittografate senza dover accedere ai dati sensibili.To achieve role separation when managing indexes, as it enables DBAs to create and alter indexes on encrypted columns, without having access to sensitive data.

Suggerimento

sp_enclave_send_keys (Transact-SQL) consente di inviare facilmente all'enclave tutte le chiavi di crittografia di colonna abilitate per l'enclave usate per gli indici e di popolare la cache delle chiavi.sp_enclave_send_keys (Transact-SQL) allows you to easily send all enclave-enabled column encryption keys used for indexes to the enclave, and populate the key cache.

Per istruzioni dettagliate su come usare questo metodo, vedere Esercitazione: Creazione e uso di indici sulle colonne abilitate per l'enclave tramite la crittografia casuale.For step-by-step instructions on how to use this method, see Tutorial: Creating and using indexes on enclave-enabled columns using randomized encryption.

Passaggi successiviNext Steps

Vedere ancheSee Also