Always Encrypted

S’applique à : SQL Server (toutes les versions prises en charge) Azure SQL Database Azure SQL Managed Instance

Diagramme de 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 nationaux (par exemple, les numéros de sécurité sociale américains), stockées dans Azure SQL Base de données, Azure SQL Managed Instance et SQL Server bases de données. Always Encrypted permet aux clients de chiffrer des données sensibles à l’intérieur des applications clientes et de ne jamais révéler les clés de chiffrement au moteur de base de données. Cela permet une séparation entre ceux qui possèdent les données et peuvent les afficher et ceux qui gèrent les données, mais qui ne doivent pas y accéder ( administrateurs de base de données locaux, opérateurs de base de données cloud ou autres utilisateurs non autorisés à privilèges élevés). Par conséquent, Always Encrypted permet aux clients de stocker en toute confiance leurs données sensibles dans le cloud et de réduire le risque de vol de données par des personnes malveillantes.

Always Encrypted peuvent être configurés 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, recherche-recherche de points ou jointures d’égalité. Ces requêtes tirent parti du chiffrement déterministe.

Remarque

Les enclaves sécurisées étendent les fonctionnalités de calcul confidentiel de Always Encrypted avec la correspondance de modèle, 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 de Always Encrypted. Pour plus d’informations et pour commencer, consultez Tutoriel : Prise en main de 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é en dehors du système de base de données, comme Azure Key Vault, un magasin de certificats Windows ou un module de sécurité matériel.

    Ensuite, vous devez provisionner des 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 relatives aux clés dans votre base de données.

    • Les métadonnées de la 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 n’utilise jamais 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 de colonnes de base de données existantes et de 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 de texte en 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 des 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 à l’environnement de base de données, le moteur de base de données ne peut pas être impliqué dans l’approvisionnement de clés et le chiffrement des données, ni dans 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 leur rechiffrage (avec un autre type de chiffrement 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 lève 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 de texte clair à partir de colonnes chiffrées ou effectuer des opérations prises en charge (par exemple, des recherches de recherche de point) sur des colonnes utilisant un chiffrement déterministe, un utilisateur ou une application qui émet la requête doit remplir 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, par SELECT exemple sur la table contenant les données.
  • Connectez-vous à 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 de 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’il n’a pas accès aux clés qui les protègent, il 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 les colonnes chiffrées :

  1. Lorsqu’une application émet une requête paramétrable, le pilote client SQL au sein de l’application contacte en toute transparence 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 qui doit ê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, qui contient 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ésultantes sont mises en cache pour réduire le nombre d’allers-retours vers le magasin de clés lors des utilisations ultérieures 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 de 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 traitement.
  5. Le moteur de base de données exécute la requête, ce qui peut impliquer des comparaisons d’égalité sur les colonnes à l’aide d’un 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 joint les 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 s’il ne trouve pas la clé dans le cache.
  9. Le pilote déchiffre les résultats et retourne des valeurs de 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 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 de Always Encrypted pour obtenir la liste des pilotes clients prenant en charge les 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 des 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 mise en correspondance des modèles, les opérateurs de comparaison, le tri et l’indexation sur les colonnes à l’aide du 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 de 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.

    De telles instructions entraînent des erreurs de conflit d’opérandes telles que celles-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 colonnes chiffrées (lors de l’utilisation d’un chiffrement déterministe). La transmission de littéraux ou de variables T-SQL correspondant à des colonnes chiffrées n’est pas prise en charge. Pour plus d’informations spécifiques à un pilote client que vous utilisez, consultez Développer des applications à l’aide de Always Encrypted.

  • Vous devez utiliser le paramétrage pour Always Encrypted variables dans Azure Data Studio ou SSMS afin d’é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 colonnes chiffrées (lors de l’utilisation d’un chiffrement déterministe).

  • Les paramètres table ciblant les 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 présentant 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 de chaîne (varchar, char, etc.) avec des classements autres que des classements de point de code binaire (_BIN2) lors de l’utilisation d’un 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 des 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 d’un chiffrement déterministe, si les colonnes référencées et référencées utilisent des clés ou des algorithmes différents.
    • Colonnes référencées par des contraintes de vérification.
    • 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 les 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éprécié dans SQL Server 2022 (16.x). Cette fonctionnalité sera supprimée dans une prochaine version de Microsoft SQL Server. É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 :

Always Encrypted référence Transact-SQL

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

Instructions

Affichages 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 les métadonnées de clé de chiffrement de colonne.

  • AFFICHER N’IMPORTE QUELLE DÉFINITION DE CLÉ PRINCIPALE DE COLONNE : nécessaire pour accéder aux métadonnées de clé principale de colonne et les lire, qui sont nécessaires pour interroger les colonnes chiffrées.

  • AFFICHER N’IMPORTE QUELLE DÉFINITION DE CLÉ DE CHIFFREMENT DE COLONNE : nécessaire pour accéder aux métadonnées de clé principale de colonne et les lire, qui sont nécessaires pour interroger les 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

Points importants à prendre en compte

  • 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 ses magasins de clés), protège les colonnes et n’accède pas aux tentatives de texte en 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 sur le rôle public et de les accorder à des rôles ou des 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 (utilisant des versions antérieures de DacFx) de fonctionner correctement. Par conséquent, pour utiliser des colonnes chiffrées (même s’il ne les déchiffre 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