Always Encrypted

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

Diagram of Always Encrypted.

Always Encrypted est une fonctionnalité conçue pour protéger les données sensibles, telles que les numéros de crédit carte ou les numéros d’identification nationaux/régionaux (par exemple, les numéros de sécurité sociale des États-Unis), stockées dans Azure SQL Database, Azure SQL Managed Instance et les bases de données SQL Server. Always Encrypted permet aux clients de chiffrer des données sensibles dans les 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 afficher, ainsi que ceux qui gèrent les données, mais qui ne doivent pas avoir accès - administrateurs de base de données locaux, opérateurs de base de données cloud ou autres utilisateurs non autorisés à privilège élevé. Par conséquent, Always Encrypted permet aux clients de stocker en toute confiance leurs données sensibles dans le cloud et de réduire la probabilité de vol de données par des initiés malveillants.

Always Encrypted peut être configuré pour prendre en charge des requêtes confidentielles limitées sur des données chiffrées, les requêtes qui impliquent des comparaisons d’égalité. Par exemple, effectuez des recherches de point ou des jointures d’égalité. Ces requêtes tirent parti du chiffrement déterministe.

Remarque

Les enclaves sécurisées étendent les fonctionnalités d’informatique confidentielle d’Always Encrypted avec des critères correspondants, d’autres opérateurs de comparaison et un 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 des clés principales de colonne dans un magasin de clés approuvé en dehors du système de base de données, tel qu’Azure Key Vault, le magasin de certificats Windows ou un module de sécurité matériel.

    Ensuite, vous avez besoin d’approvisionner des clés de chiffrement de colonne et de chiffrer chacune d’entre elles avec une clé principale de colonne.

    Enfin, vous devez stocker les métadonnées sur les clés de 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 jamais ou utilise les clés de l’un ou l’autre type en texte brut.

    Pour plus d’informations sur la gestion des clés Always Encrypted, consultez Vue d’ensemble de la gestion des 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 impliquer la création de tables avec des colonnes chiffrées ou le chiffrement des colonnes de base de données existantes et des données existantes. Lors de la configuration du chiffrement d’une colonne, vous spécifiez les informations relatives à un algorithme de chiffrement, une clé de chiffrement de colonne pour protéger les données de 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 à l’aide d’outils SQL :

Pour vous assurer que les clés Always Encrypted et les données sensibles protégées ne sont jamais révélées en texte clair dans l’environnement de base de données, les Moteur de base de données ne peuvent pas être impliquées dans le provisionnement de clés et le chiffrement des données, ou les opérations de déchiffrement. Par conséquent, Transact-SQL (T-SQL) ne prend pas en charge l’approvisionnement de clés ou les opérations de chiffrement. Pour la même raison, le chiffrement des données existantes ou le 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 (les 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 à l’aide de 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 des 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 à partir de colonnes chiffrées ou effectuer des opérations prises en charge (par exemple, des recherches de recherche de point) sur des colonnes à l’aide du chiffrement déterministe, d’un utilisateur ou d’une application qui émet la requête doit respecter les conditions préalables suivantes :

  • 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, telles que SELECT sur la table contenant les données.
  • 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 clients SQL prennent en charge l’activation d’Always Encrypted pour les connexions de base de données.

Remarque

Si l’utilisateur a besoin d’autorisations de base de données pour lire les données, mais qu’aucun accès aux clés ne les protège, l’utilisateur peut toujours récupérer des données cyphertext (chiffré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. Lorsqu’une application émet une requête paramétrable, le pilote client SQL au sein de l’application contacte de manière 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 colonne chiffrée et l’emplacement de sa clé principale de colonne correspondante.
  2. Le pilote appelle le magasin de clés, contenant les clés principales de colonne afin de déchiffrer les valeurs de clé de chiffrement de colonne chiffrées. Les clés de chiffrement de colonne en texte clair résultant sont mises en cache pour réduire le nombre d’allers-retours vers 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 et envoie la requête au Moteur de base de données pour le traitement.
  5. La Moteur de base de données exécute la requête, qui peut impliquer des comparaisons d’égalité sur les colonnes à l’aide du chiffrement déterministe.
  6. Si les résultats de la requête incluent des données provenant de colonnes chiffrées, le Moteur de base de données attache 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é au jeu de résultats.
  7. Le Moteur de base de données envoie le jeu de résultats à l’application cliente.
  8. Pour chaque colonne chiffrée dans le 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 effectue uniquement un aller-retour vers un magasin de clés contenant la clé principale de colonne si elle 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. Les fournisseurs pour les types courants de magasins de clés sont disponibles dans les bibliothèques de pilotes côté client à partir de Microsoft ou en tant que 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 à l’aide d’un chiffrement aléatoire n’est autorisé.

    Remarque

    Always Encrypted avec 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 à l’aide d’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 de l’autre façon) UPDATE, BULK INSERT, SELECT INTO ou INSERT.. SÉLECTIONNEZ.
    • Insertion de littéraux dans des colonnes chiffrées.

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

    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 aux colonnes chiffrées. Par exemple, lors de l’insertion de données dans des colonnes chiffrées ou du filtrage par 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 client que vous utilisez, consultez Développer des applications à l’aide d’Always Encrypted.

  • Vous devez utiliser Parameterization for Always Encrypted variables in Azure Data Studio ou SSMS pour émettre des requêtes qui transmettent 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 colonnes chiffrées (lors de l’utilisation du chiffrement déterministe).

  • Les paramètres table 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 pour l’objet.

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

    • 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 string (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 les index cluster et non cluster lors de l’utilisation d’un chiffrement aléatoire (les index sur les colonnes utilisant le chiffrement déterministe sont pris en charge).
    • Colonnes incluses dans les 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 d’un chiffrement aléatoire (le chiffrement déterministe est pris en charge).
    • Partitionnement de colonnes.
    • Colonnes avec des contraintes par défaut.
    • Colonnes référencées par des contraintes uniques lors de l’utilisation d’un 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).
    • Référencement de colonnes dans des contraintes de clé étrangère lors de l’utilisation d’un chiffrement aléatoire ou lors de l’utilisation d’un chiffrement déterministe, si les colonnes référencées et référençant utilisent des clés ou algorithmes différents.
    • Colonnes référencées par des contraintes de case activée.
    • Colonnes capturées/suivies à l’aide de la capture de données modifiées.
    • Colonnes clés primaires sur les tables qui ont un suivi des modifications.
    • Colonnes masquées (à l’aide du masquage dynamique des données).
    • Colonnes dans des tables de base de données stretch. (Les tables comportant des colonnes chiffrées avec Always Encrypted peuvent être activées pour l’extension.)

    Important

    Stretch Database est déconseillé dans SQL Server 2022 (16.x) et Azure SQL Database. Cette fonctionnalité sera supprimée dans une version ultérieure de la 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 Transact-SQL suivantes, les vues de catalogue système, les procédures stockées système et les autorisations.

Instructions

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 : nécessaire pour créer et supprimer des métadonnées de clé principale de colonne.

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

  • VIEW ANY COLUMN MASTER KEY DEFINITION : requis 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 : requis 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 MODIFIER N’IMPORTE QUELLE CLÉ PRINCIPALE DE COLONNE MODIFIER UNE CLÉ DE CHIFFREMENT DE COLONNE AFFICHER UNE DÉFINITION DE CLÉ PRINCIPALE DE COLONNE AFFICHER UNE DÉFINITION DE CLÉ DE CHIFFREMENT DE COLONNE
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

Considérations 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 d’accéder aux clés principales de colonne (dans leurs magasins de clés), en protégeant les colonnes et n’accède pas aux tentatives de 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 refuser) les autorisations au rôle public et de les accorder à des rôles ou utilisateurs spécifiques pour implémenter un contrôle plus restreint.

  • Dans SQL Database, 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 . Cela permet à certains outils hérités existants (à l’aide d’anciennes versions de DacFx) de fonctionner correctement. Par conséquent, pour utiliser des colonnes chiffrées (même si elles ne les déchiffrent pas), 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 .

Étapes suivantes

Voir aussi