Always Encrypted

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di Azure

Diagram of Always Encrypted.

Always Encrypted è una funzionalità progettata per proteggere i dati sensibili, ad esempio i numeri di carta di credito o i numeri di identificazione nazionale/regionale, come i codici fiscali, archiviati in Database SQL di Azure, in Istanza gestita di SQL di Azure o nei database di SQL Server. Always Encrypted permette ai client di crittografare i dati sensibili nelle applicazioni client senza mai rivelare le chiavi di crittografia 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 può essere configurato per supportare query riservate limitate sui dati crittografati, ovvero le query che coinvolgono confronti di uguaglianza. Ad esempio, ricerche di punti e join di uguaglianza. Tali query sfruttano la crittografia deterministica.

Nota

Le enclave sicure estendono le funzionalità di computing riservato di Always Encrypted con criteri di ricerca, altri operatori di confronto e crittografia sul posto. Per altre informazioni, vedere Always Encrypted con enclave sicuri.

Crittografia sempre attiva esegue la crittografia trasparente alle applicazioni. A questo scopo, un driver abilitato per Crittografia sempre attiva installato nel computer client esegue automaticamente la crittografia e la decrittografia dei dati sensibili nell'applicazione client. Il driver crittografa i dati nelle colonne sensibili prima di passarli al motore di database e riscrive automaticamente le query in modo da mantenere la semantica per l'applicazione. Analogamente, il driver decrittografa in modo trasparente i dati, archiviati nelle colonne di database crittografate, contenuti nei risultati delle query.

Configurare Always Encrypted

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, è necessario:

  1. 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, è necessario archiviare i metadati relativi alle chiavi nel database.

    • I metadati della chiave master della colonna acquisiscono 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 né usa mai le chiavi di entrambi i tipi in testo non crittografato.

    Per ulteriori informazioni sulla gestione delle chiavi Always Encrypted, vedere Informazioni generali sulla gestione delle chiavi per Always Encrypted

  2. Configurare la crittografia per le colonne di database selezionate che contengono dati sensibili da proteggere. 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 gli schemi presenti nella colonna crittografata, soprattutto in presenza di un set di possibili valori crittografati di dimensioni ridotte, ad esempio True/False o Nord/Sud/Est/Ovest.

    • La crittografia casuale usa un metodo di crittografia dei dati meno prevedibile. La crittografia casuale è più sicura, ma impedisce le ricerche, il raggruppamento, l'indicizzazione e il join su colonne crittografate.

    La crittografia deterministica è consigliata per le colonne che verranno usate come parametri di ricerca o di raggruppamento. Ad esempio un numero identificativo rilasciato da un ente pubblico. Usare la crittografia casuale per dati quali i commenti di analisi riservate, che non sono raggruppati con altri record e non vengono usati per il join di tabelle.

Per informazioni dettagliate sugli algoritmi di crittografia di Always Encrypted, vedere Crittografia Always Encrypted.

È possibile eseguire i passaggi precedenti usando gli strumenti SQL:

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).

Nota

Always Encrypted con enclave sicure solleva alcune delle restrizioni precedenti consentendo operazioni di crittografia sui dati esistenti usando T-SQL ed elimina la necessità di spostare i dati all'esterno del database.

Come eseguire query su lavori di colonne crittografate

Per eseguire una query sulle colonne di database crittografate, inserire dati in colonne crittografate, riprendere valori di testo non crittografato da colonne crittografate o eseguire operazioni supportate (ad esempio ricerche di punti) su colonne che usano la crittografia deterministica, un utente o un'applicazione che esegue la query deve soddisfare i prerequisiti seguenti:

  • Avere accesso alla chiave master della colonna che protegge i dati. L'accesso alla chiave è necessario oltre alle autorizzazioni a livello di database, ad esempio SELECT nella tabella contenente i dati.
  • Connettersi al database con Always Encrypted abilitato nella connessione di database. La maggior parte degli strumenti SQL e dei driver client SQL supporta l'abilitazione di Always Encrypted per le connessioni di database.

Nota

Se l'utente dispone delle autorizzazioni di database necessarie per leggere i dati, ma non ha accesso alle chiavi che li proteggono, può comunque riprendere i dati cifrati (crittografati) connettendosi al database senza abilitare Always Encrypted nella connessione di database.

Ecco come funzionano le query sulle colonne crittografate:

  1. Quando un'applicazione esegue una query con parametri, il driver client SQL all'interno dell'applicazione contatta in modo trasparente il motore di database (chiamando sp_describe_parameter_encryption (Transact-SQL) per determinare quali parametri hanno come destinazione colonne crittografate e devono essere crittografati. Per ogni parametro che deve essere crittografato, il driver riceve l'algoritmo di crittografia, il tipo di crittografia e i metadati della chiave, inclusa la chiave di crittografia della colonna crittografata e la posizione della chiave master della colonna corrispondente.
  2. Il driver chiama l'archivio di chiavi contenente la chiave master della colonna per decriptare i valori della chiave di crittografia di colonna crittografati. Le chiavi di crittografia della colonna in testo non crittografato risultanti vengono memorizzate nella cache per ridurre il numero di round trip all'archivio di chiavi negli usi successivi delle stesse chiavi di crittografia delle colonne.
  3. Il driver usa le chiavi di crittografia della colonna in testo non crittografato ottenute per crittografare i parametri di query corrispondenti alle colonne crittografate.
  4. Il driver sostituisce i valori in testo non crittografato dei parametri destinati alle colonne crittografate con i relativi valori crittografati e invia la query al motore di database per l'elaborazione.
  5. Il motore di database esegue la query, il che può comportare confronti di uguaglianza su colonne che usano la crittografia deterministica.
  6. Se i risultati della query includono i dati delle colonne crittografate, il motore di database allega i metadati di crittografia per ogni colonna, incluse le informazioni sull'algoritmo di crittografia, il tipo di crittografia e i metadati della chiave al set di risultati.
  7. Il motore di database invia il set di risultati all'applicazione client.
  8. Per ogni colonna crittografata nel set di risultati ricevuto, il driver tenta innanzitutto di trovare la chiave di crittografia della colonna in testo non crittografato nella cache locale ed effettua un round trip nell'archivio di chiavi in cui si trova la chiave master della colonna solo se non riesce a trovare la chiave nella cache.
  9. Il driver decripta i risultati e restituisce i valori in testo non crittografato all'applicazione.

Un driver client interagisce con un archivio di chiavi, contenente una chiave master di colonna, utilizzando un provider dell'archivio delle chiavi master delle colonne, che è un componente software lato client che incapsula un archivio di chiavi contenente la chiave master delle colonne. I provider per i tipi comuni di archivi di chiavi sono disponibili nei cataloghi dei driver lato client di Microsoft o come download autonomi. È anche possibile implementare il proprio provider. Le funzionalità di Always Encrypted, inclusi i provider di archivio delle chiavi master delle colonne predefiniti, variano in base a una libreria di driver e alla relativa versione.

Vedere Sviluppare applicazioni usando Always Encrypted per ottenere l'elenco dei driver client che supportano Always Encrypted e per avere informazioni su come sviluppare applicazioni che eseguono query su colonne crittografate.

È anche possibile eseguire query su colonne crittografate usando strumenti SQL, ad esempio Azure Data Studio o SSMS.

Limiti

Le limitazioni seguenti si applicano alle query sulle colonne crittografate:

  • La crittografia deterministica supporta le operazioni seguenti che includono confronti di uguaglianza e non permette altre operazioni.

  • Non sono consentiti calcoli sulle colonne crittografate tramite crittografia casuale.

    Nota

    Always Encrypted con enclave sicure spiega la limitazione precedente consentendo l'uso di criteri di ricerca, operatori di confronto, ordinamento e indicizzazione nelle colonne che usano la crittografia casuale.

  • 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 passare valori corrispondenti alle colonne crittografate. Ad esempio, quando si inseriscono dati in colonne crittografate o si filtrano in base alle colonne crittografate (quando si usa la crittografia deterministica). 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.

  • È necessario usare Parametrizzazione per le variabili Always Encrypted in Azure Data Studio o SSMS per eseguire query che passano valori corrispondenti alle colonne crittografate in questi strumenti. Ad esempio, quando si inseriscono dati in colonne crittografate o si filtrano in base alle colonne crittografate (quando si usa 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:

  • Dopo aver modificato la definizione di una colonna crittografata, eseguire sp_refresh_parameter_encryption per aggiornare i metadati di Always Encrypted per l'oggetto.

  • 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.
    • Colonne di stringhe (varchar, char e così via) con regole di confronto diverse dalle regole di confronto del punto di codice binario (_BIN2) quando si usa la crittografia deterministica.
    • 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).
    • Colonne calcolate.
    • Colonne a cui fanno riferimento colonne calcolate (quando l'espressione esegue operazioni non supportate per Always Encrypted).
    • Set di 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 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 nel database SQL di Azure. Questa caratteristica 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:

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

Vistedel catalogo e stored procedure di sistema

Vedere anche sys.columns (Transact-SQL) per informazioni sui metadati di crittografia archiviati per ogni colonna.

Autorizzazioni per il database

Esistono quattro autorizzazioni per database per Always Encrypted:

  • ALTER ANY COLUMN MASTER KEY: richiesta per creare ed eliminare i metadati della chiave master della colonna.

  • ALTER ANY COLUMN ENCRYPTION KEY: richiesta per creare ed eliminare metadati per la 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 public 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. Di conseguenza, 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.

Passaggi successivi

Vedi anche