Always Encrypted
Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di Azure
Always Encrypted e Always Encrypted con enclave sicuri sono funzionalità progettate per proteggere le informazioni riservate, inclusi i numeri di carta di credito e i numeri di identificazione nazionali o regionali (ad esempio i numeri di previdenza sociale degli Stati Uniti), nei database database SQL di Azure, Istanza gestita di SQL di Azure e SQL Server. Consente ai client di crittografare i dati sensibili all'interno delle applicazioni client, assicurandosi che le chiavi di crittografia non vengano mai esposte al motore di database. Questo garantisce una separazione tra chi possiede i dati e può visualizzarli e chi gestisce i dati ma non può accedervi, ovvero amministratori di database locali, operatori di database cloud o altri utenti non autorizzati con privilegi elevati. Di conseguenza, Always Encrypted consente ai clienti di archiviare in modo sicuro i dati sensibili nel cloud e di ridurre la probabilità di furto di dati da parte di utenti malintenzionati.
Always Encrypted presenta alcune restrizioni, ad esempio l'impossibilità di eseguire operazioni sui dati crittografati, tra cui l'ordinamento, il filtro (ad eccezione delle ricerche di punti che usano la crittografia deterministica) e così via. Ciò significa che alcune query e applicazioni potrebbero non essere compatibili con Always Encrypted o potrebbero richiedere modifiche significative alla logica dell'applicazione.
Per risolvere queste limitazioni, Always Encrypted con enclave sicure consente al motore di database di elaborare i dati crittografati all'interno di un'area di memoria protetta denominata enclave sicura. Le enclave sicure migliorano le funzionalità di computing riservato di Always Encrypted con criteri di ricerca, altri operatori di confronto e crittografia sul posto.
Always Encrypted garantisce che la crittografia sia facile per le applicazioni. Sul lato client, il driver abilitato per Always Encrypted crittografa i dati sensibili prima di inviarli al motore di database e riscrive automaticamente le query per mantenere la semantica dell'applicazione. Decrittografa automaticamente anche i risultati delle query dalle colonne di database crittografate.
Configurare Always Encrypted
Nota
Per le applicazioni che devono eseguire criteri di ricerca, usare operatori di confronto, ordinamento e indice in colonne crittografate, è necessario implementare Always Encrypted con enclave sicure.
Questa sezione offre informazioni generali sulla configurazione di Always Encrypted. Per informazioni dettagliate e per iniziare, vedere Esercitazione: Introduzione a Always Encrypted.
Per configurare Always Encrypted nel database, seguire questa procedura:
Effettuare il provisioning delle chiavi crittografiche per proteggere i dati. Always Encrypted usa due tipi di chiavi:
- Chiavi di crittografia della colonna.
- Chiavi master della colonna.
Una chiave di crittografia delle colonne viene utilizzata per crittografare i dati in una colonna crittografata. Una chiave master della colonna è una chiave di protezione delle chiavi che crittografa una o più chiavi di crittografia delle colonne.
Le chiavi master della colonna devono essere archiviate in un archivio di chiavi attendibile al di fuori del sistema del database, ad esempio Azure Key Vault, archivio certificati di Windows o un modulo di protezione hardware. È quindi necessario effettuare il provisioning delle chiavi di crittografia della colonna e crittografare tutto con una chiave master della colonna.
Infine, salva i metadati relativi alle chiavi nel database. I metadati della chiave master della colonna includono la posizione della chiave master della colonna. I metadati della chiave di crittografia della colonna contengono il valore crittografato della chiave di crittografia della colonna. Il motore di database non archivia o usa chiavi in testo non crittografato.
Per ulteriori informazioni sulla gestione delle chiavi Always Encrypted, vedere Informazioni generali sulla gestione delle chiavi per Always Encrypted
Configurare la crittografia per colonne di database specifiche che includono informazioni riservate per garantire la protezione. Ciò può comportare la creazione di nuove tabelle con colonne crittografate o la crittografia delle colonne di database esistenti e dei dati esistenti. Quando si configura la crittografia per una colonna, si specificano le informazioni relative all'algoritmo di crittografia, alla chiave di crittografia della colonna usata per proteggere i dati nella colonna e al tipo di crittografia. Always Encrypted supporta due tipi di crittografia:
La crittografia deterministica genera sempre lo stesso valore crittografato un dato valore di testo non crittografato. L'uso della crittografia deterministica consente le ricerche di punti, join di uguaglianza, raggruppamento e indicizzazione di colonne crittografate. Tuttavia, può anche consentire a utenti non autorizzati di indovinare le informazioni sui valori crittografati esaminando i criteri presenti nella colonna crittografata, soprattutto in presenza di un set di possibili valori crittografati di dimensioni ridotte, ad esempio Vero/Falso o la regione Nord/Sud/Est/Ovest.
La crittografia casuale usa un metodo che crittografa i dati in maniera non prevedibile. Ogni input di testo non crittografato identico restituisce un output crittografato distinto. Ciò migliora la sicurezza della crittografia casuale.
Per eseguire criteri di ricerca, usare operatori di confronto, ordinamento e indice in colonne crittografate, è necessario implementare Always Encrypted con enclave sicure. La crittografia casuale Always Encrypted (senza enclave sicure) non supporta la ricerca, il raggruppamento, l'indicizzazione o l'unione su colonne crittografate. Per le colonne destinate a scopi di ricerca o raggruppamento, è invece essenziale usare la crittografia deterministica. In questo modo è possibile eseguire operazioni quali ricerche di punti, join di uguaglianza, raggruppamento e indicizzazione in colonne crittografate.
Poiché il sistema di database non ha accesso alle chiavi crittografiche, qualsiasi crittografia di colonna richiede lo spostamento e la crittografia dei dati all'esterno del database. Questo significa che questo processo di crittografia può richiedere molto tempo ed è vulnerabile alle interruzioni di rete. Inoltre, se è necessario crittografare nuovamente una colonna in un secondo momento, ad esempio quando si ruota la chiave di crittografia o si modificano i tipi di crittografia, si riscontrano di nuovo le stesse difficoltà. L'uso di Always Encrypted con enclave sicure elimina la necessità di spostare i dati dal database. Poiché l'enclave è attendibile, un driver client all'interno dell'applicazione o uno strumento come Azure Data Studio o SQL Server Management Studio (SSMS) può condividere in modo sicuro le chiavi con l'enclave durante le operazioni di crittografia. L'enclave può quindi crittografare o crittografare nuovamente le colonne sul posto, riducendo significativamente il tempo necessario per queste azioni.
Per informazioni dettagliate sugli algoritmi di crittografia di Always Encrypted, vedere Crittografia Always Encrypted.
È possibile eseguire i passaggi precedenti usando gli strumenti SQL:
- Effettuare il provisioning di chiavi Always Encrypted con SQL Server Management Studio
- Configurare Always Encrypted tramite PowerShell
- sqlpackage: che automatizza il processo di configurazione
Per assicurarsi che le chiavi di Always Encrypted e i dati sensibili protetti non siano mai rivelati all'ambiente di database in testo non crittografato, il motore di database non può essere coinvolto nel provisioning della chiave e nella crittografia o decrittazione dei dati. Di conseguenza, Transact-SQL (T-SQL) non supporta il provisioning delle chiavi o le operazioni di crittografia. Per lo stesso motivo, la crittografia dei dati esistenti o la ri-crittografia (con un tipo di crittografia diverso o una chiave di crittografia della colonna) devono essere eseguite all'esterno del database (gli strumenti SQL possono automatizzare l'operazione).
Dopo aver modificato la definizione di una colonna crittografata, eseguire sp_refresh_parameter_encryption per aggiornare i metadati di Always Encrypted per l'oggetto.
Limiti
Le limitazioni seguenti si applicano alle query sulle colonne crittografate:
Non sono consentiti calcoli sulle colonne crittografate tramite crittografia casuale. La crittografia deterministica supporta le operazioni seguenti che includono confronti di uguaglianza e non permette altre operazioni.
- = (Uguale a) (Transact-SQL) nelle ricerche di ricerca punto.
- IN (Transact-SQL)
- SELECT - GROUP BY- Transact-SQL
- DISTINCT.
Nota
Per le applicazioni che devono eseguire criteri di ricerca, usare operatori di confronto, ordinamento e indice in colonne crittografate, è necessario implementare Always Encrypted con enclave sicure.
Le istruzioni di query che attivano calcoli che coinvolgono dati in testo non crittografato e dati crittografati che non sono consentite. Ad esempio:
- Confronto tra una colonna crittografata e una colonna in testo non crittografato o un valore letterale.
- Copia dati da una colonna in testo non crittografato a una colonna crittografata (o al contrario) UPDATE, BULK INSERT, SELECT INTO o INSERT..SELECT.
- Inserimento di valori letterali nelle colonne crittografate.
Tali istruzioni generano errori di conflitto di tipo operando come il seguente:
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
Le applicazioni devono usare parametri di query per fornire valori per le colonne crittografate. Ad esempio, quando si inseriscono dati in colonne crittografate o li si filtra usando la crittografia deterministica, è necessario usare i parametri di query. Il passaggio di valori letterali o variabili T-SQL corrispondenti alle colonne crittografate non è supportato. Per ulteriori informazioni specifiche su un driver client in uso, vedere Sviluppare applicazioni con Always Encrypted.
In Azure Data Studio o SSMS è essenziale applicare la parametrizzazione per le variabili Always Encrypted in modo da eseguire query che gestiscono i valori associati alle colonne crittografate. Sono inclusi scenari come l'inserimento di dati in colonne crittografate o l'applicazione di filtri su di essi (nei casi in cui viene usata la crittografia deterministica).
I parametri con valori di tabella per le colonne crittografate non sono supportati.
Le query che usano le seguenti clausole non sono supportate:
Always Encrypted non è supportato per le colonne con le caratteristiche seguenti:
- Colonne che usano uno dei seguenti tipi di dati: xml, timestamp, rowversion, image, ntext, text, sql_variant, hierarchyid, geography, geometry, alias, tipo definito dall'utente (UDT).
- Colonne FILESTREAM
- Colonne con la proprietà IDENTITY.
- Colonne con proprietà ROWGUIDCOL.
- String (varchar, colonne chare così via) con regole di confronto diverse da regole di confronto binarie (_BIN2).
- Colonne che corrispondono a chiavi per indici cluster e non cluster quando si usa la crittografia casuale (gli indici sulle colonne che usano la crittografia deterministica sono supportati).
- Colonne incluse negli indici full-text (Always Encrypted non supporta la ricerca full-text).
- Specificare le colonne calcolate in una tabella.
- Colonne a cui fanno riferimento colonne calcolate (quando l'espressione esegue operazioni non supportate per Always Encrypted).
- Utilizzare colonne di tipo sparse.
- Colonne a cui fanno riferimento le statistiche quando si usa la crittografia casuale (la crittografia deterministica è supportata).
- Colonne di partizionamento.
- Colonne con vincoli predefiniti.
- Colonne a cui fanno riferimento vincoli di unicità quando si usa la crittografia casuale (la crittografia deterministica è supportata).
- Colonne di chiavi primarie quando si usa la crittografia casuale (la crittografia deterministica è supportata).
- Colonne di riferimento in vincoli di chiave esterna quando si usa la crittografia casuale o la crittografia deterministica, se le colonne a cui si fa riferimento e di riferimento usano chiavi o algoritmi diversi.
- Colonne a cui fanno riferimento vincoli CHECK.
- Colonne acquisite/rilevate con Change Data Capture.
- Colonne chiave primaria in tabelle con rilevamento modifiche.
- Colonne che vengono mascherate (con Dynamic Data Masking).
- Colonne utilizzate in stored procedure compilate in modo nativo.
- Colonne in tabelle di database con estensione. (le tabelle con colonne crittografate con Crittografia sempre attiva possono essere abilitate per l'estensione).
Importante
Stretch Database è deprecato in SQL Server 2022 (16.x) e database SQL di Azure. Questa funzionalità verrà rimossa nelle versioni future del motore di database. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.
- Colonne in tabelle esterne (PolyBase) (nota: l'uso di tabelle esterne e di tabelle con colonne crittografate nella stessa query è supportato).
Le funzionalità seguenti non sono supportate nelle colonne crittografate:
- Replica di SQL Server (replica di tipo transazionale, merge o snapshot). Le funzionalità di replica fisica, tra cui igruppi di disponibilità Always On, sono supportate.
- Query distribuite (server collegati, OPENROWSET (Transact-SQL), OPENDATASOURCE (Transact-SQL)).
- Query tra database che eseguono join su colonne crittografate da database diversi.
Informazioni di riferimento su Transact-SQL Always Encrypted
Always Encrypted usa le istruzioni Transact-SQL, le viste del catalogo di sistema, le stored procedure di sistema e le autorizzazioni seguenti.
Rendiconti
Istruzione DDL | Descrizione |
---|---|
CREATE COLUMN MASTER KEY | Crea un oggetto di metadati della chiave master della colonna in un database. |
DROP COLUMN MASTER KEY | Elimina la chiave master di una colonna da un database. |
CREATE COLUMN ENCRYPTION KEY | Crea un oggetto di metadati della chiave di crittografia della colonna. |
ALTER COLUMN ENCRYPTION KEY | Modifica una chiave di crittografia della colonna in un database, aggiungendo o eliminando un valore crittografato. |
DROP COLUMN ENCRYPTION KEY | Elimina la chiave di crittografia di una colonna da un database. |
CREATE TABLE (ENCRYPTED WITH) | Specifica la crittografia delle colonne |
Viste del catalogo e stored procedure di sistema
Viste del catalogo e stored procedure di sistema | Descrizione |
---|---|
sys.column_encryption_keys | Restituisce informazioni sulle chiavi di crittografia della colonna (CEK) |
sys.column_encryption_key_values | Restituisce informazioni sui valori crittografati delle chiavi di crittografia della colonna (CEK) |
sys.column_master_keys | Restituisce una riga per ogni chiave master del database |
sp_refresh_parameter_encryption | Aggiorna i metadati Always Encrypted per i parametri stored procedure non associati a schema specificato, funzione definita dall'utente, vista, trigger DML, trigger DDL a livello di database, o trigger DDL a livello di server nel database corrente. |
sp_describe_parameter_encryption | Analizza l'istruzione Transact-SQL specificata e i relativi parametri per determinare quali parametri corrispondono alle colonne di database protette tramite la funzionalità Always Encrypted. |
Vedere anche sys.columns per informazioni sui metadati di crittografia archiviati per ogni colonna.
Autorizzazioni per il database
Esistono quattro autorizzazioni per database per Always Encrypted.
Viste del catalogo e stored procedure di sistema | Descrizione |
---|---|
ALTER ANY COLUMN MASTER KEY | (Obbligatorio per creare ed eliminare i metadati della chiave master della colonna). |
ALTER ANY COLUMN ENCRYPTION KEY | (Obbligatorio per creare ed eliminare i metadati della chiave di crittografia della colonna). |
VIEW ANY COLUMN MASTER KEY DEFINITION | Richiesta per accedere e leggere i metadati delle chiavi master della colonna, necessari per eseguire query sulle colonne crittografate. |
VIEW ANY COLUMN ENCRYPTION KEY DEFINITION | Richiesta per accedere e leggere i metadati delle chiavi master della colonna, necessari per eseguire query sulle colonne crittografate. |
Nella tabella seguente sono riepilogate le autorizzazioni necessarie per le azioni comuni.
Scenario | ALTER ANY COLUMN MASTER KEY | ALTER ANY COLUMN ENCRYPTION KEY | VIEW ANY COLUMN MASTER KEY DEFINITION | VIEW ANY COLUMN ENCRYPTION KEY DEFINITION |
---|---|---|---|---|
Gestione delle chiavi (creazione/modifica/revisione metadati delle chiavi nel database) | X | X | X | X |
Esecuzione di query in colonne crittografate | X | X |
Considerazioni importanti
Le autorizzazioni VIEW ANY COLUMN MASTER KEY DEFINITION e VIEW ANY COLUMN ENCRYPTION KEY DEFINITION sono necessarie quando si selezionano colonne crittografate, anche se l'utente non dispone dell'autorizzazione per le chiavi master della colonna (nei relativi archivi di chiavi), proteggendo le colonne e non accedendo ai tentativi di testo non crittografato.
In SQL Server, entrambe le autorizzazioni VIEW ANY COLUMN MASTER KEY DEFINITION e VIEW ANY COLUMN ENCRYPTION KEY DEFINITION vengono concesse per impostazione predefinita al ruolo predefinito del database pubblico. Un amministratore di database può scegliere di revocare (o negare) le autorizzazioni per il ruolo pubblico e assegnarle a specifici ruoli o utenti per implementare un controllo con maggiori restrizioni.
Nel database SQL, entrambe le autorizzazioni VIEW ANY COLUMN MASTER KEY DEFINITION e VIEW ANY COLUMN ENCRYPTION KEY DEFINITION vengono concesse per impostazione predefinita al ruolo predefinito del database pubblico. In questo modo, specifici strumenti esistenti (che usano le versioni precedenti di DacFx) funzionano correttamente. Per usare le colonne crittografate (anche senza decriptarle), un amministratore di database deve concedere esplicitamente le autorizzazioni VIEW ANY COLUMN MASTER KEY DEFINITION e VIEW ANY COLUMN ENCRYPTION KEY DEFINITION.