Always Encrypted

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance

Diagramme d’Always Encrypted.

Always Encrypted et Always Encrypted avec enclaves sécurisées sont des fonctionnalités conçues pour protéger les informations sensibles, notamment les numéros de carte de crédit et les numéros d’identification nationaux ou régionaux (tels que les numéros de sécurité sociale des États-Unis), dans Azure SQL Database, Azure SQL Managed Instance et les bases de données SQL Server. Elles permettent aux clients de chiffrer des données sensibles dans les applications clientes, ce qui garantit que les clés de chiffrement ne sont jamais exposées au moteur de base de données. Cela permet de séparer ceux qui possèdent les données et peuvent les consulter de ceux qui les gèrent, mais ne doivent pas y accéder : les administrateurs de base de données locales, les opérateurs de base de données cloud ou les autres utilisateurs non autorisés à privilège élevé. Par conséquent, Always Encrypted permet aux clients de stocker leurs données sensibles dans le cloud en toute sécurité et de réduire le risque de vol de données par des utilisateurs internes malveillants.

Always Encrypted a certaines restrictions, telles que l’incapacité à effectuer des opérations sur des données chiffrées, notamment le tri, le filtrage (à l’exception des recherches par points à l’aide du chiffrement déterministe), etc. Cela signifie que certaines requêtes et applications peuvent ne pas être compatibles avec Always Encrypted ou nécessiter des modifications importantes de la logique d’application.

Pour résoudre ces limitations, Always Encrypted avec enclaves sécurisées permet au moteur de base de données de traiter les données chiffrées au sein d’une zone de mémoire protégée appelée enclave sécurisée. Les enclaves sécurisées améliorent les fonctionnalités de calcul confidentiel d’Always Encrypted grâce à la prise en charge de la mise en correspondance des modèles, différents opérateurs de comparaison et le chiffrement en place.

Always Encrypted garantit un chiffrement sans accroc pour les applications. Côté client, le pilote assisté par Always Encrypted chiffre les données sensibles avant de les envoyer au moteur de base de données et réécrit automatiquement les requêtes pour gérer la sémantique de l’application. Par ailleurs il déchiffre automatiquement les résultats des requêtes provenant des colonnes de bases de données chiffrées.

Configurer Always Encrypted

Remarque

Pour les applications qui doivent effectuer des correspondances de modèles, utiliser des opérateurs de comparaison, trier et indexer sur des colonnes chiffrées, vous devez implémenter Always Encrypted avec enclaves sécurisées.

Cette section fournit une vue d’ensemble de la configuration d’Always Encrypted. Pour plus d’informations et pour commencer, consultez Tutoriel : prise en main d’Always Encrypted.

Pour configurer Always Encrypted dans votre base de données, procédez comme suit :

  1. Provisionnez des clés de chiffrement pour protéger vos données. Always Encrypted utilise deux types de clés :

    • Clés de chiffrement de colonne
    • Clés principales de colonne

    Une clé de chiffrement de colonne sert à chiffrer les données qui se trouvent dans une colonne chiffrée. Une clé principale de colonne est une clé de protection de clé qui chiffre une ou plusieurs clés de chiffrement de colonne.

    Vous devez stocker les clés principales de colonne dans un magasin de clés approuvé, comme Azure Key Vault, le magasin de certificats Windows ou un module de sécurité matériel. Après cela, vous devriez fournir les clés de chiffrement de colonnes et chiffrer chacune d’entre elles avec une clé principale de colonne.

    Enfin, enregistrez les métadonnées relatives aux clés dans votre base de données. Les métadonnées de clé principale de colonne incluent l’emplacement de la clé principale de colonne. Les métadonnées de clé de chiffrement de colonne contiennent la valeur chiffrée de la clé de chiffrement de colonne. Le moteur de base de données ne stocke ni n’utilise aucune clé en texte en clair.

    Pour plus d’informations sur la gestion des clés Always Encrypted, consultez Vue d’ensemble de la gestion de clés pour Always Encrypted.

  2. Configurez le chiffrement pour des colonnes de base de données spécifiques qui incluent des informations sensibles pour garantir la protection. Cela peut nécessiter de créer des nouvelles tables avec des colonnes chiffrées ou de chiffrer les colonnes et les données existantes. Lorsque vous configurez le chiffrement pour une colonne, vous devez spécifier les informations sur l’algorithme de chiffrement, une clé de chiffrement de colonne destinée à protéger les données et le type de chiffrement. Always Encrypted prend en charge deux types de chiffrement :

    • Le chiffrement déterministe génère toujours la même valeur chiffrée pour une valeur en texte clair donnée. Le chiffrement déterministe permet d’effectuer des recherches de point, des jointures d’égalité, ainsi que des regroupements et une indexation sur les colonnes chiffrées. Toutefois, il peut également permettre aux utilisateurs non autorisés de deviner des informations sur des valeurs chiffrées en examinant les modèles dans la colonne chiffrée, en particulier en cas de petit ensemble de valeurs chiffrées possibles, par exemple, Vrai/Faux ou la région Nord/Sud/Est/Ouest.

    • Le chiffrement aléatoire utilise une méthode qui chiffre les données de manière imprévisible. Les entrées en texte brut identiques produisent un résultat chiffré différent. Cela améliore la sécurité du chiffrement aléatoire.

Pour effectuer des correspondances de modèles à l’aide d’opérateurs de comparaison, trier et indexer sur des colonnes chiffrées, vous devez utiliser Always Encrypted avec enclaves sécurisées et appliquer un chiffrement aléatoire. Le chiffrement aléatoire Always Encrypted (sans enclaves sécurisées) ne prend pas en charge la recherche, le regroupement, l’indexation ou la jointure sur des colonnes chiffrées. Au lieu de cela, pour les colonnes destinées à la recherche ou au regroupement, il est essentiel d’utiliser le chiffrement déterministe. Cela permet des opérations telles que les recherches de points, les jointures d’égalité, le regroupement et l’indexation sur les colonnes chiffrées.

Étant donné que le système de base de données n’a pas accès aux clés de chiffrement, tout chiffrement de colonne nécessite le déplacement et le chiffrement des données en dehors de la base de données. Cela signifie que ce processus de chiffrement peut prendre beaucoup de temps et est vulnérable en cas d’interruption du réseau. En outre, si vous devez rechiffrer une colonne ultérieurement, par exemple lors de la rotation de la clé de chiffrement ou de la modification des types de chiffrement, vous rencontrerez à nouveau les mêmes difficultés. L’utilisation d’Always Encrypted avec enclaves sécurisées élimine la nécessité de déplacer les données hors de la base de données. Étant donné que l’enclave est approuvée, un pilote de client au sein de votre application ou un outil tel qu’Azure Data Studio ou SQL Server Management Studio (SSMS) peut partager en toute sécurité les clés avec l’enclave pendant les opérations de chiffrement. L’enclave peut ensuite chiffrer ou rechiffrer des colonnes en place, réduisant considérablement le temps nécessaire pour ces actions.

Pour plus d’informations sur les algorithmes de chiffrement Always Encrypted, consultez Chiffrement Always Encrypted.

Vous pouvez effectuer les étapes ci-dessus en utilisant des outils SQL :

Pour garantir que les clés Always Encrypted et les données sensibles protégées ne sont jamais révélées en texte clair au serveur, le moteur de base de données ne peut pas participer au provisionnement des clés ni effectuer d’opérations de chiffrement ou de déchiffrement des données. Par conséquent, Transact-SQL (T-SQL) ne prend pas en charge le provisionnement de clés ni les opérations de chiffrement. Pour la même raison, le chiffrement des données existantes ou leur rechiffrement (avec un type de chiffrement différent ou une clé de chiffrement de colonne) doit être effectué en dehors de la base de données (des outils SQL peuvent automatiser cela).

Après avoir modifié la définition d’une colonne chiffrée, exécutez sp_refresh_parameter_encryption pour mettre à jour les métadonnées Always Encrypted de l’objet.

Limites

Les limitations suivantes s’appliquent aux requêtes sur les colonnes chiffrées :

  • Aucun calcul sur les colonnes chiffrées avec un chiffrement aléatoire n’est autorisé. Le chiffrement déterministe prend en charge les opérations suivantes impliquant des comparaisons d’égalité – aucune autre opération n’est autorisée.

    Remarque

    Pour les applications qui doivent effectuer des correspondances de modèles, utiliser des opérateurs de comparaison, trier et indexer sur des colonnes chiffrées, vous devez implémenter Always Encrypted avec enclaves sécurisées.

  • Les instructions de requête qui déclenchent des calculs impliquant à la fois du texte en clair et des données chiffrées ne sont pas autorisées. Par exemple :

    • Comparaison d’une colonne chiffrée à une colonne en texte clair ou à un littéral.
    • Copie de données d’une colonne en texte clair vers une colonne chiffrée (ou l’inverse) UPDATE, BULK INSERT, SELECT INTO ou INSERT..SELECT.
    • Insertion de littéraux dans des colonnes chiffrées.

    Ces instructions entraînent des erreurs de conflit d’opérandes comme celle-ci :

    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
    

    Les applications doivent utiliser des paramètres de requête pour fournir des valeurs pour les colonnes chiffrées. Par exemple, lorsque vous insérez des données dans des colonnes chiffrées ou que vous les filtrez à l’aide du chiffrement déterministe, des paramètres de requête doivent être utilisés. Le passage de littéraux ou de variables T-SQL correspondant à des colonnes chiffrées n’est pas pris en charge. Pour plus d’informations spécifiques à un pilote de client que vous utilisez, consultez Développer des applications en utilisant Always Encrypted.

    Dans Azure Data Studio ou SSMS, il est essentiel d’appliquer une paramétrisation pour les variables Always Encrypted afin d’exécuter des requêtes qui gèrent les valeurs associées aux colonnes chiffrées. Cela inclut des scénarios tels que l’insertion de données dans des colonnes chiffrées ou l’application de filtres sur ces dernières (dans les cas où le chiffrement déterministe est utilisé).

  • Les paramètres tabulaires ciblant des colonnes chiffrées ne sont pas pris en charge.

  • Les requêtes utilisant les clauses suivantes ne sont pas prises en charge :

  • Always Encrypted n’est pas pris en charge pour les colonnes avec les caractéristiques suivantes :

    • Colonnes utilisant l’un des types de données suivants : xml, timestamp, rowversion, image, ntext, text, sql_variant, hierarchyid, geography, geometry, alias, types définis par l’utilisateur.
    • Colonnes FILESTREAM
    • Colonnes avec la propriété IDENTITY.
    • Colonnes avec la propriété ROWGUIDCOL.
    • Colonnes de type chaîne (varchar, char, etc.) avec des classements autres que des classements de point de code binaire (_BIN2) lors de l’utilisation du chiffrement déterministe.
    • Colonnes qui sont des clés pour des index cluster et non-cluster lors de l’utilisation du chiffrement aléatoire (les index sur les colonnes utilisant un chiffrement déterministe sont pris en charge).
    • Colonnes incluses dans des index de recherche en texte intégral (Always Encrypted ne prend pas en charge la recherche en texte intégral).
    • Spécifier les colonnes calculées dans une table.
    • Colonnes référencées par des colonnes calculées (quand l’expression effectue des opérations non prises en charge pour Always Encrypted).
    • Utiliser des colonnes éparses.
    • Colonnes référencées par des statistiques lors de l’utilisation du chiffrement aléatoire (le chiffrement déterministe est pris en charge).
    • Colonnes de partitionnement.
    • Colonnes avec des contraintes par défaut.
    • Colonnes référencées par des contraintes uniques en cas d’utilisation du chiffrement aléatoire (le chiffrement déterministe est pris en charge).
    • Colonnes de clé primaire en cas d’utilisation du chiffrement aléatoire (le chiffrement déterministe est pris en charge).
    • Colonnes de référence dans les contraintes de clé étrangère en cas d’utilisation du chiffrement aléatoire ou déterministe, si les colonnes de référence et référencées utilisent des clés ou algorithmes différents.
    • Colonnes référencées par des contraintes de validation.
    • Colonnes capturées/suivies à l’aide de la capture des données modifiées.
    • Colonnes de clé primaire sur des tables avec suivi des changements.
    • Colonnes masquées (à l’aide de Dynamic Data Masking).
    • Colonnes dans les tables Stretch Database. (Les tables comportant des colonnes chiffrées avec Always Encrypted peuvent être activées pour l’extension.)

    Important

    Stretch Database est déprécié dans SQL Server 2022 (16.x) et Azure SQL Database. Cette fonctionnalité sera supprimée dans une version future de moteur de base de données. Évitez d'utiliser cette fonctionnalité dans de nouveaux travaux de développement, et prévoyez de modifier les applications qui utilisent actuellement cette fonctionnalité.

    • Colonnes de tables externes (PolyBase) (remarque : l’utilisation de tables externes et de tables avec des colonnes chiffrées dans la même requête est prise en charge).
  • Les fonctionnalités suivantes ne fonctionnent pas sur les colonnes chiffrées :

Informations de référence sur Transact-SQL Always Encrypted

Always Encrypted utilise les instructions, vues de catalogue système, procédures stockées système et autorisations Transact-SQL suivantes.

Relevés

Instruction DDL Description
CREATE COLUMN MASTER KEY Crée un objet de métadonnées de clé principale de colonne dans une base de données
DROP COLUMN MASTER KEY Supprime une clé principale de colonne d’une base de données.
CREATE COLUMN ENCRYPTION KEY Crée un objet de métadonnées de clé de chiffrement de colonne.
ALTER COLUMN ENCRYPTION KEY Modifie une clé de chiffrement de colonne dans une base de données, en ajoutant ou en supprimant une valeur chiffrée.
DROP COLUMN ENCRYPTION KEY Supprime une clé de chiffrement de colonne d’une base de données.
CREATE TABLE (ENCRYPTED WITH) Spécifie les colonnes de chiffrement

Vues de catalogue système et procédures stockées

Vues de catalogue système et procédures stockées Description
sys.column_encryption_keys Retourne des informations sur les clés de chiffrement de colonne (CEK)
sys.column_encryption_key_values Retourne des informations sur les valeurs chiffrées des clés de chiffrement de colonne (CEK)
sys.column_master_keys Retourne une ligne pour chaque clé principale de base de données
sp_refresh_parameter_encryption Met à jour les métadonnées Always Encrypted pour les paramètres de la procédure stockée non liée au schéma, fonction définie par l'utilisateur, vue, déclencheur DML, déclencheur DDL au niveau de la base de données ou déclencheur DDL au niveau du serveur
sp_describe_parameter_encryption Analyse l’instruction Transact-SQL spécifiée et ses paramètres pour déterminer quels paramètres correspondent aux colonnes de base de données protégées à l’aide de la fonctionnalité Always Encrypted.

Consultez également sys.columns pour plus d’informations sur les métadonnées de chiffrement stockées pour chaque colonne.

Autorisations de base de données

Il existe quatre autorisations de base de données pour Always Encrypted :

Vues de catalogue système et procédures stockées Description
ALTER ANY COLUMN MASTER KEY Obligatoire pour créer et supprimer les métadonnées de clé principale de colonne.
ALTER ANY COLUMN ENCRYPTION KEY Obligatoire pour créer et supprimer les métadonnées de clé de chiffrement de colonne.
VIEW ANY COLUMN MASTER KEY DEFINITION Obligatoire pour accéder aux métadonnées de clé principale de colonne et les lire, ce qui est nécessaire pour interroger des colonnes chiffrées.
VIEW ANY COLUMN ENCRYPTION KEY DEFINITION Obligatoire pour accéder aux métadonnées de clé de chiffrement principale de colonne et les lire, ce qui est nécessaire pour interroger des colonnes chiffrées.

Le tableau suivant récapitule les autorisations nécessaires pour effectuer des actions courantes.

Scénario ALTER ANY COLUMN MASTER KEY ALTER ANY COLUMN ENCRYPTION KEY VIEW ANY COLUMN MASTER KEY DEFINITION VIEW ANY COLUMN ENCRYPTION KEY DEFINITION
Gestion de clés (création/modification/examen des métadonnées de clé dans la base de données) X X X X
Interrogation de colonnes chiffrées X X

Remarques importantes

  • Les autorisations VIEW ANY COLUMN MASTER KEY DEFINITION et VIEW ANY COLUMN ENCRYPTION KEY DEFINITION sont requises lors de la sélection de colonnes chiffrées, même si l’utilisateur n’a pas l’autorisation pour les clés principales de colonne (dans leurs magasins de clés) protégeant les colonnes et n’accède pas aux tentatives en texte clair.

  • Dans SQL Server, les autorisations VIEW ANY COLUMN MASTER KEY DEFINITION et VIEW ANY COLUMN ENCRYPTION KEY DEFINITION sont accordées par défaut au rôle de base de données fixe public. Un administrateur de base de données peut choisir de révoquer (ou de refuser) les autorisations au rôle public, et les accorder à des rôles ou des utilisateurs spécifiques pour implémenter un contrôle plus restreint.

  • Dans SQL Server, les autorisations VIEW ANY COLUMN MASTER KEY DEFINITION et VIEW ANY COLUMN ENCRYPTION KEY DEFINITION ne sont pas accordées par défaut au rôle de base de données fixe public. Ceci permet à certains outils hérités existants (utilisant des versions antérieures de DacFx) de fonctionner correctement. Pour utiliser des colonnes chiffrées (même sans les déchiffrer), un administrateur de base de données doit accorder explicitement les autorisations VIEW ANY COLUMN MASTER KEY DEFINITION et VIEW ANY COLUMN ENCRYPTION KEY DEFINITION.

Étape suivante