Recommander quand utiliser Azure SQL Database Always Encrypted

Effectué

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/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 à 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. Always Encrypted fournit une séparation entre 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é. Il s’agit, par exemple, des recherches de point ou les comparaisons d’égalité. Ces requêtes utilisent le chiffrement déterministe.

Diagramme montrant un exemple de base de données toujours chiffrée.

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.

Always Encrypted rend le chiffrement transparent pour les applications. Un pilote compatible 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 des colonnes sensibles avant de transmettre les données au moteur de base de données. Ensuite, le pilote réécrit automatiquement les requêtes afin 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 des colonnes de base de données chiffrées, contenues dans les résultats de requête.

Configurer Always Encrypted

Pour configurer Always Encrypted dans votre base de données, vous devez :

  1. Déployez 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 est utilisée pour chiffrer des données 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. Les emplacements de stockage les plus courants sont Azure Key Vault, le magasin de certificats Windows ou un module de sécurité matériel. Ensuite, vous devez déployer des clés de chiffrement de colonne et chiffrer chacune d’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.
  2. Configurez le chiffrement pour les colonnes de base de données sélectionnées qui contiennent des données sensibles à protéger. Vous pouvez créer de nouvelles tables avec des colonnes chiffrées ou chiffrer 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. L’utilisation du chiffrement déterministe permet de rechercher des points, des jointures d’égalité, du regroupement et de l’indexation sur des colonnes chiffrées. Toutefois, il peut également permettre aux utilisateurs non autorisés de deviner des informations sur les valeurs chiffrées en examinant des modèles dans la colonne chiffrée, en particulier s’il existe un petit ensemble de valeurs chiffrées possibles, telles que True/False, ou la région Nord/Sud/Est/Ouest.
    • Le chiffrement 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 empêche la recherche, le regroupement, l’indexation et la jointure sur des colonnes chiffrées.

    Utilisez le chiffrement déterministe pour les colonnes utilisées comme paramètres de recherche ou de regroupement. Par exemple, un numéro d’ID de gouvernement. Utilisez le chiffrement aléatoire pour les données telles que les commentaires d’investigation confidentiels, qui ne sont pas regroupés avec d’autres enregistrements et ne sont pas utilisés 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, le moteur de base de données ne peut pas être impliqué 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 prennent 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).

Fonctionnement des requêtes sur les colonnes chiffrées

Un ensemble de conditions préalables doit être remplie, si l’utilisateur doit effectuer l’une de ces actions :

  • 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 clair à partir de colonnes chiffrées
  • Effectuer des opérations prises en charge (par exemple, rechercher des points) sur des colonnes à l’aide du chiffrement déterministe

Un utilisateur ou une application émettrice de la requête doit respecter les conditions préalables suivantes :

  • Avoir accès à la clé principale de la 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.
  • 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 d’Always Encrypted pour les connexions de base de données.

Remarque

Si l’utilisateur dispose des autorisations de base de données requises pour lire les données, mais qu’aucun accès aux clés protégeant ces actions n’est possible. L’utilisateur peut récupérer des données de texte chiffré (chiffré) 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, 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 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 traitement.
  5. Le moteur de base de données exécute la requête, qui peut impliquer des comparaisons d’égalité sur des colonnes à l’aide du 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 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 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 de client interagit avec un magasin de clés contenant une clé principale de colonne, en utilisant un fournisseur de magasin de clés principales de colonne, à savoir un composant logiciel côté client qui encapsule un magasin de clés contenant la clé principale de colonne. Les fournisseurs pour les types courants d'entrepôts de clés sont disponibles dans les bibliothèques de pilotes côté client de Microsoft ou en tant que téléchargements autonomes. Vous pouvez également implémenter votre propre fournisseur. Les fonctionnalités de Always Encrypted, y compris 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 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..SELECT.
    • Insertion de littéraux dans des colonnes chiffrées.

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

Output
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 de type chaîne (varchar, char, etc.) utilisant des interclassements autres que les interclassements basés sur le 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 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 (lorsque 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 clés primaires lors de l’utilisation d’un 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 contraintes de vérification.
    • Colonnes capturées/suivies à l’aide de la capture des 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 Stretch Database. (Les tables avec des colonnes chiffrées avec Always Encrypted peuvent être activées pour Stretch.)

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 du 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é.

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.

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 : 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.
  • Afficher toute définition de clé de chiffrement de colonne : nécessaire pour accéder aux métadonnées de la clé maître de colonne et les lire, ce qui est requis pour interroger des colonnes chiffrées.

Le tableau suivant récapitule les autorisations requises pour les actions courantes.

Scénario MODIFIER TOUTE CLÉ MAÎTRE DE COLONNE MODIFIER UNE CLÉ DE CHIFFREMENT DE COLONNE AFFICHER TOUTE DÉFINITION DE CLÉ MAÎTRE DE COLONNE AFFICHER TOUTE DÉFINITION DE CLÉ DE CHIFFREMENT DE COLONNE
Gestion des clés (création/modification/révision 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 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 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 la base de données SQL, 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. Pour travailler avec des colonnes chiffrées (même sans les déchiffrer), il est nécessaire qu'un administrateur de base de données accorde explicitement les permissions techniques « VIEW ANY COLUMN MASTER KEY DEFINITION » et « VIEW ANY COLUMN ENCRYPTION KEY DEFINITION ».