Share via


Always Encrypted

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Diagramme d’Always Encrypted.

Always Encrypted est une fonctionnalité conçue pour protéger les données sensibles, telles que les numéros de carte de crédit ou les numéros d’identification (comme les numéros de sécurité sociale), stockées dans les bases de données Azure SQL Database, Azure SQL Managed Instance et SQL Server. Always Encrypted permet aux clients de chiffrer des données sensibles dans des applications clientes et de ne jamais révéler les clés de chiffrement 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 (à savoir les administrateurs de base de données locaux, les opérateurs de base de données cloud ou les 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 confiance et de réduire la probabilité de vol de données par des utilisateurs internes malveillants.

Always Encrypted peut être configuré pour prendre en charge les requêtes confidentielles limitées sur des données chiffrées et les requêtes qui impliquent des comparaisons d’égalité. Il s’agit, par exemple, des recherches de point ou les comparaisons d’égalité. Ces requêtes utilisent le chiffrement déterministe.

Remarque

Les enclaves sécurisées étendent les fonctionnalités de calcul confidentiel d’Always Encrypted avec la correspondance à des modèles, d’autres opérateurs de comparaison et le chiffrement sur place. Pour plus d’informations, consultez Always Encrypted avec enclaves sécurisées.

Always Encrypted rend le chiffrement transparent pour les applications. À cette fin, un pilote Always Encrypted installé sur l’ordinateur client chiffre et déchiffre automatiquement les données sensibles dans l’application cliente. Le pilote chiffre les données dans les colonnes sensibles avant de les transmettre au Moteur de base de donnéeset il réécrit automatiquement les requêtes pour que la sémantique de l’application soit conservée. De même, le pilote déchiffre de manière transparente les données stockées dans les colonnes de base de données chiffrées contenues dans les résultats de requête.

Configurer Always Encrypted

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, vous devez :

  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.

    Vous devez ensuite approvisionner les clés de chiffrement de colonne et chiffrer chacune d’entre elles avec une clé principale de colonne.

    Enfin, vous devez stocker les métadonnées sur les clés dans votre base de données.

    • Les métadonnées de clé principale de colonne capturent 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 jamais les clés de l’un ou l’autre type sous forme de 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 les colonnes de base de données sélectionnées qui contiennent des données sensibles à protéger. Cela peut consister à créer des tables avec des colonnes chiffrées ou à chiffrer des colonnes de base de données et des 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 dan la colonne et un 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.

    • Lechiffrement aléatoire utilise une méthode qui chiffre les données de manière moins prévisible. Le chiffrement aléatoire est plus sécurisé, mais il empêche la recherche, le regroupement, l’indexation et la jointure sur des colonnes chiffrées.

    Utilisez le chiffrement déterministe pour les colonnes que vous utilisez comme paramètres de recherche ou de regroupement. Par exemple, un numéro d’identité officiel. Utilisez le chiffrement aléatoire pour des données (par exemple, des commentaires d’enquête confidentielle) qui ne sont pas regroupées avec d’autres enregistrements et ne sont pas utilisées pour joindre des tables.

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

Remarque

Always Encrypted avec enclaves sécurisées supprime certaines des restrictions ci-dessus en autorisant les opérations de chiffrement sur les données existantes avec T-SQL et élimine la nécessité de déplacer les données en dehors de la base de données.

Fonctionnement des requêtes sur les colonnes chiffrées

Pour exécuter une requête sur des colonnes de base de données chiffrées, insérer des données dans des colonnes chiffrées, récupérer des valeurs en texte brut dans des colonnes chiffrées ou effectuer des opérations prises en charge (par exemple des recherches de points) sur des colonnes avec un chiffrement déterministe, un utilisateur ou une application émettant la requête doit respecter les prérequis suivants :

  • Avoir accès à la clé principale de colonne protégeant les données. L’accès à la clé est requis en plus des autorisations au niveau de la base de données, comme SELECT sur la table contenant les données.
  • Se connecter à la base de données avec Always Encrypted activé dans la connexion de base de données. La plupart des outils SQL et des pilotes des clients SQL prennent en charge l’activation d’Always Encrypted pour les connexions de base de données.

Remarque

Si l’utilisateur dispose des autorisations nécessaires pour lire les données, mais qu’il n’a pas accès aux clés qui les protègent, il peut toujours récupérer les données cryptées en se connectant à la base de données sans activer Always Encrypted dans la connexion de base de données.

Voici comment fonctionnent les requêtes sur des colonnes chiffrées :

  1. Quand une application émet une requête paramétrable, le pilote du client SQL au sein de l’application contacte de façon transparente le moteur de base de données (en appelant sp_describe_parameter_encryption (Transact-SQL)) pour déterminer quels paramètres ciblent les colonnes chiffrées et doivent être chiffrés. Pour chaque paramètre devant être chiffré, le pilote reçoit l’algorithme de chiffrement, le type de chiffrement et les métadonnées de clé, y compris la clé de chiffrement de la colonne chiffrée et l’emplacement de sa clé principale de colonne correspondante.
  2. Le pilote appelle le magasin de clés, qui contient la clé principale de colonne permettant de déchiffrer les valeurs des clés de chiffrement des colonnes chiffrées. Les clés de chiffrement de colonne en texte clair obtenues sont mise en cache pour réduire le nombre d’allers-retours avec le magasin de clés lors des utilisations suivantes des mêmes clés de chiffrement de colonne.
  3. Le pilote utilise les clés de chiffrement de colonne en texte clair obtenues pour chiffrer les paramètres de requête correspondant aux colonnes chiffrées.
  4. Le pilote remplace les valeurs en texte clair des paramètres ciblant les colonnes chiffrées par leurs valeurs chiffrées, puis envoie la requête au moteur de base de données pour traitement.
  5. Le moteur de base de données exécute la requête, qui peut impliquer des comparaisons d’égalité sur les colonnes en utilisant un chiffrement déterministe.
  6. Si les résultats de requête incluent des données provenant de colonnes chiffrées, le moteur de base de données attache au jeu de résultats des métadonnées de chiffrement pour chaque colonne, y compris les informations sur l’algorithme de chiffrement, le type de chiffrement et les métadonnées de clé.
  7. Le moteur de base de données envoie le jeu de résultats à l’application cliente.
  8. Pour chaque colonne chiffrée du jeu de résultats reçu, le pilote tente d’abord de trouver la clé de chiffrement de colonne en texte clair dans le cache local et il effectue un aller-retour vers un magasin de clés contenant la clé principale de colonne seulement s’il ne trouve pas la clé dans le cache.
  9. Le pilote déchiffre les résultats et retourne des valeurs en texte clair à l’application.

Un pilote client interagit avec un magasin de clés, qui contient une clé principale de colonne, à l’aide d’un fournisseur de magasins de clé principale de colonne, qui est un composant logiciel côté client qui encapsule un magasin de clé contenant la clé principale de colonne. Des fournisseurs pour les types courants de magasins de clés sont disponibles dans les bibliothèques de pilotes côté client de Microsoft ou sous forme de téléchargements autonomes. Vous pouvez également implémenter votre propre fournisseur. Les fonctionnalités d’Always Encrypted, notamment les fournisseurs de magasins de clés principales de colonne intégrés, varient en fonction de la bibliothèque de pilotes et de sa version.

Consultez Développer des applications à l’aide d’Always Encrypted pour obtenir la liste des pilotes clients prenant en charge Always Encrypted et pour plus d’informations sur le développement d’applications qui interrogent des colonnes chiffrées.

Vous pouvez également interroger des colonnes chiffrées à l’aide d’outils SQL, par exemple Azure Data Studio ou SSMS.

Limites

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

  • Le chiffrement déterministe prend en charge les opérations suivantes impliquant des comparaisons d’égalité – aucune autre opération n’est autorisée.

  • Aucun calcul sur les colonnes chiffrées avec un chiffrement aléatoire n’est autorisé.

    Remarque

    Always Encrypted avec des enclaves sécurisées assouplit la restriction ci-dessus en autorisant la correspondance à des modèles, les opérateurs de comparaison, le tri et l’indexation sur les colonnes utilisant un chiffrement aléatoire.

  • 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 passer des valeurs qui correspondent à des colonnes chiffrées. Par exemple, lors de l’insertion de données dans des colonnes chiffrées ou du filtrage par des colonnes chiffrées (lors de l’utilisation du chiffrement déterministe). 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.

  • Vous devez utiliser des variables de paramétrisation pour Always Encrypted in Azure Data Studio ou SSMS pour émettre des requêtes qui passent des valeurs correspondant à des colonnes chiffrées dans ces outils. Par exemple, lors de l’insertion de données dans des colonnes chiffrées ou du filtrage par des colonnes chiffrées (lors de l’utilisation du chiffrement déterministe).

  • 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 :

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

  • 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).
    • Colonnes calculées.
    • Colonnes référencées par des colonnes calculées (quand l’expression effectue des opérations non prises en charge pour Always Encrypted).
    • Jeu de 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

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

Consultez également sys.columns (Transact-SQL) 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 :

  • ALTER ANY COLUMN MASTER KEY : requise pour créer et supprimer des métadonnées de clé principale de colonne.

  • ALTER ANY COLUMN ENCRYPTION KEY : requise pour créer et supprimer des métadonnées de clé de chiffrement de colonne.

  • VIEW ANY COLUMN MASTER KEY DEFINITION : requise 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 : requise 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.

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