Configurer des clés gérées par le client pour le chiffrement des données dans le service Azure AI Search

Par défaut, le service de recherche Azure AI chiffre automatiquement les données au repos avec des clés gérées par le service. Si vous avez besoin de davantage de protection, vous pouvez compléter le chiffrement par défaut avec une couche de chiffrement supplémentaire à l’aide de clés que vous créez et gérez dans Azure Key Vault.

Cet article vous guide tout au long des étapes de configuration du chiffrement à l’aide de clés gérées par le client (CMK) ou à l’aide de vos propres clés (BYOK).

Remarque

Si un index est chiffré par CMK, il est accessible uniquement si le service de recherche a accès à la clé. Si l’accès est révoqué, l’index est inutilisable et le service ne peut pas être mis à l’échelle tant que l’index n’est pas supprimé ou que l’accès à la clé n’est pas restauré.

Objets chiffrés avec clé gérée par le client

Le chiffrement CMK est utilisé sur des objets individuels. Si vous avez besoin d’une clé CMK dans votre service de recherche, définissez une stratégie d’application.

Le chiffrement avec clé gérée par le client devient opérationnel lorsqu’un objet est créé. Vous ne pouvez pas chiffrer des objets qui existent déjà. Le chiffrement avec clé gérée par le client se produit chaque fois qu’un objet est enregistré sur le disque, que ce soit des données au repos pour un stockage à long terme ou des données temporaires pour un stockage à court terme. Avec la clé gérée par le client, le disque ne voit jamais de données non chiffrées.

Les objets qui peuvent être chiffrés incluent des index, des listes de synonymes, des indexeurs, des sources de données et des ensembles de compétences. Le chiffrement étant coûteux à déchiffrer en termes de ressources informatiques, seul le contenu sensible est chiffré.

Le chiffrement est effectué sur le contenu suivant :

  • Tout le contenu des index et des listes de synonymes.

  • Contenu sensible dans les indexeurs, les sources de données, les ensembles de compétences et les vecteurs. Ce contenu se compose uniquement des champs qui stockent les chaînes de connexion, les descriptions, les identités, les clés et les entrées de l’utilisateur(-trice). Par exemple, les ensembles de compétences ont des clés Azure AI services et certaines compétences acceptent les entrées utilisateur, telles que les entités personnalisées. Dans les deux cas, les clés et les entrées utilisateur dans les compétences sont chiffrées. Toutes les références à des ressources externes (telles que les sources de données Azure ou les modèles Azure OpenAI) sont également chiffrées.

Double chiffrement complet

Lorsque vous introduisez le chiffrement avec clé gérée par le client, vous chiffrez le contenu deux fois. Pour les objets et les champs indiqués dans la section précédente, le contenu est d’abord chiffré avec votre clé gérée par le client, puis avec la clé gérée par Microsoft. Le contenu est doublement chiffré sur les disques de données pour le stockage à long terme et sur les disques temporaires utilisés pour le stockage à court terme.

L’activation du chiffrement par CMK a pour effet d’augmenter la taille de l’index et de dégrader les performances des requêtes. Sur la base des observations effectuées à ce jour, vous pouvez vous attendre à une augmentation de 30 à 60 % des temps de requête, même si les performances réelles varient en fonction de la définition d’index et des types de requêtes. En raison de la baisse des performances, nous vous recommandons d’activer cette fonctionnalité uniquement sur les objets qui en ont réellement besoin.

Bien que le double chiffrement soit désormais disponible dans toutes les régions, la prise en charge a été déployée en deux phases :

  • Le premier déploiement a eu lieu le 1er août 2020 et incluait les cinq régions répertoriées ci-dessous. Les services de recherche créés dans les régions suivantes ont pris en charge la clé gérée par le client pour les disques de données, mais pas les disques temporaires :

    • USA Ouest 2
    • USA Est
    • États-Unis - partie centrale méridionale
    • Gouvernement américain - Virginie
    • Gouvernement des États-Unis – Arizona
  • Le deuxième déploiement a eu lieu le 13 mai 2021 et a ajouté le chiffrement pour les disques temporaires et le chiffrement avec clé gérée par le client étendu à toutes les régions prises en charge.

    Si vous utilisez la clé CMK d’un service créé lors du premier déploiement et que vous souhaitez également le chiffrement par CMK sur les disques temporaires, vous devez créer un service de recherche dans la région de votre choix et redéployer votre contenu. Pour déterminer la date de création de votre service, voir Comment vérifier la date de création du service.

Prérequis

Limites

  • Pas de prise en charge du modèle de sécurité matériel (HSM) managé par Azure Key Vault.

  • Pas de prise en charge des abonnements croisés. Azure Key Vault et Recherche Azure AI doivent faire partie du même abonnement.

Conseils Key Vault

Si vous débutez avec Azure Key Vault, consultez ce guide de démarrage rapide pour en savoir plus sur les tâches de base : Définir et récupérer un secret depuis Azure Key Vault à l’aide de PowerShell.

Voici quelques conseils pour l’utilisation de Key Vault :

  • Utilisez autant de coffres de clés que vous le souhaitez. Les clés gérées peuvent se trouver dans différents coffres de clés. Un service de recherche peut posséder plusieurs objets chiffrés, chacun chiffré avec des clés de chiffrement gérées par le client et stockées dans différents coffres de clés.

  • Utilisez le même locataire afin de pouvoir récupérer votre clé managée en vous connectant par le biais d’une identité managée par le système ou l’utilisateur(-trice). Ce comportement nécessite que les deux services partagent le même locataire. Pour plus d’informations sur la création d’un locataire, voir Créer un locataire.

  • Activer la protection contre le vidage et l’effacement progressif. En raison de la nature du chiffrement avec des clés gérées par le client, personne ne peut récupérer vos données en cas de suppression de votre clé Azure Key Vault. Pour éviter la perte de données résultant de suppressions accidentelles d’Azure Key Vault, vous devez activer la suppression réversible et la protection contre le vidage sur le coffre de clés. La suppression réversible étant activée par défaut, vous ne rencontrerez des problèmes que si vous l’avez désactivée intentionnellement. Par défaut, la protection contre le vidage n’est pas activée, mais elle est requise pour le chiffrement avec clé gérée par le client dans la recherche Azure AI.

  • Activez la journalisation sur le coffre-fort des clés afin de pouvoir contrôler l’utilisation des clés.

  • Activer l’autorotation des clés ou suivre des procédures strictes lors de la rotation de routine des clés du coffre-fort, des secrets d’application et de l’enregistrement. Mettez toujours à jour tout le contenu chiffré pour utiliser les nouveaux secrets et les nouvelles clés avant de supprimer les anciens et les anciennes. Si vous omettez cette étape, votre contenu ne peut pas être déchiffré.

Étape 1 : Créer une clé dans Key Vault

Ignorez la génération de clé si vous avez déjà une clé dans Azure Key Vault que vous souhaitez utiliser, mais collectez l’identificateur de clé. Vous avez besoin de ces informations lors de la création d’un objet chiffré.

Avant d’ajouter la clé, assurez-vous que vous vous êtes attribué le rôle Agent de chiffrement Key Vault.

Le chiffrement d’Azure AI Search prend en charge les clés RSA de taille 2048, 3072 et 4096. Pour plus d’informations sur les types de clés pris en charge, consultez À propos des clés.

  1. Connectez-vous au portail Azure et ouvrez la page de présentation de votre coffre de clés.

  2. Sélectionnez Objects>Keys sur la gauche, puis sélectionnez Generate/Import.

  3. Dans le volet Créer une clé, dans la liste des options, sélectionnez Générer pour créer une nouvelle clé.

  4. Saisissez un nom pour votre clé et acceptez les valeurs par défaut pour les autres propriétés de la clé.

  5. Si vous le souhaitez, définissez une stratégie de rotation de clé pour activer la rotation automatique.

  6. Sélectionnez Créer pour démarrer le déploiement.

  7. Sélectionnez la clé, sélectionnez la version actuelle, puis notez l’identificateur de clé. Il se compose de l’URI de la valeur de la clé, du nom de la cléet de la version de la clé. Vous avez besoin de l’identificateur pour définir un index chiffré dans Recherche Azure AI.

    Créer une clé de coffre de clés

Étape 2 : Créer un principal de sécurité

Vous avez plusieurs options pour configurer l’accès Recherche Azure AI à la clé de chiffrement au moment de l’exécution. L’approche la plus simple consiste à récupérer la clé à l’aide de l’identité managée de votre service de recherche. Vous pouvez utiliser une identité managée par le système ou l’utilisateur. Cela vous permet d’omettre les étapes relatives à l’enregistrement de la demande et aux secrets de la requête. Vous pouvez également créer et inscrire une application Microsoft Entra et avoir le service de recherche fournir l’ID d’application sur les demandes.

Nous vous recommandons d’utiliser une identité managée. Une identité managée permet à votre service de recherche de s’authentifier auprès d’Azure Key Vault, sans stocker d’informations d’identification (ApplicationID ou ApplicationSecret) dans le code. Le cycle de vie de ce type d’identité gérée est lié au cycle de vie de votre service de recherche, qui ne peut avoir qu’une seule identité managée attribuée par le système. Pour plus d’informations sur le fonctionnement des identités managées, consultez Que sont les identités managées pour les ressources Azure ?

Activez l’identité gérée attribuée par le système pour votre service de recherche.

Capture d’écran de l’activation de l’identité gérée attribuée au système.

Étape 3 : Accorder des autorisations

Azure Key Vault prend en charge l’autorisation à l’aide de contrôles d’accès en fonction du rôle. Nous vous recommandons cette approche sur les stratégies d’accès au coffre de clés. Pour plus d’informations, voir Fournir un accès aux clés, certificats et secrets de Key Vault à l’aide des rôles Azure.

Dans cette étape, attribuez le rôle d’utilisateur(-trice) de chiffrement du service Crypto Key Vault à votre service de recherche. Si vous effectuez des tests localement, attribuez-vous également ce rôle.

  1. Connectez-vous au portail Azure et recherchez votre coffre-fort à clés.

  2. Sélectionnez Contrôle d’accès (IAM) et Ajouter une attribution de rôle.

  3. Sélectionnez Key Vault Crypto Service Encryption User, puis cliquez sur Suivant.

  4. Sélectionnez des identités managées, sélectionnez des membres, puis sélectionnez l’identité managée de votre service de recherche.

  5. Sélectionnez Vérifier + attribuer.

Attendez quelques minutes pour que l’attribution des rôles devienne opérationnelle.

Étape 4 : Chiffrement du contenu

Des clés de chiffrement sont ajoutées lorsque vous créez un objet. Pour ajouter une clé gérée par le client sur un index, une carte de synonymes, un indexeur, une source de données ou des ensembles de compétences, utilisez le portail Azure, une API REST de recherche ou un kit de développement logiciel (SDK) Azure pour créer un objet pour lequel le chiffrement est activé. Pour ajouter le chiffrement à l’aide du Kit de développement logiciel (SDK) Azure, consultez l’exemple Python dans cet article.

  1. Appelez la création des API pour spécifier la propriété encryptionKey :

  2. Insérez la construction encryptionKey dans la définition de l’objet. Cette propriété est une propriété de premier niveau, sur le même niveau que le nom et la description. Si vous utilisez le même coffre, la même clé et la même version, vous pouvez coller la même construction encryptionKey dans chaque définition d’objet.

    Le premier exemple montre une propriété encryptionKey pour un service de recherche qui se connecte à l’aide d’une identité managée :

    {
      "encryptionKey": {
        "keyVaultUri": "<YOUR-KEY-VAULT-URI>",
        "keyVaultKeyName": "<YOUR-ENCRYPTION-KEY-NAME>",
        "keyVaultKeyVersion": "<YOUR-ENCRYPTION-KEY-VERSION>"
      }
    }
    

    Le deuxième exemple comprend une propriété accessCredentials. Celle-ci est nécessaire si vous avez inscrit une application dans Microsoft Entra ID :

    {
      "encryptionKey": {
        "keyVaultUri": "<YOUR-KEY-VAULT-URI>",
        "keyVaultKeyName": "<YOUR-ENCRYPTION-KEY-NAME>",
        "keyVaultKeyVersion": "<YOUR-ENCRYPTION-KEY-VERSION>",
        "accessCredentials": {
          "applicationId": "<YOUR-APPLICATION-ID>",
          "applicationSecret": "<YOUR-APPLICATION-SECRET>"
        }
      }
    }
    
  3. Vérifiez que la clé de chiffrement existe en émettant un GET sur l’objet.

  4. Vérifiez que l’objet est opérationnel en effectuant une tâche, comme interroger un index chiffré.

Une fois que vous avez créé l’objet chiffré sur le service de recherche, vous pouvez l’utiliser comme n’importe quel autre objet de ce type. Le chiffrement est transparent pour l’utilisateur et le développeur.

Aucune de ces informations sur le coffre de clés n’est considérée comme secrète et peut être facilement récupérée en accédant à la page Azure Key Vault appropriée dans le Portail Azure.

Important

Le contenu chiffré dans la recherche Azure AI est configuré pour utiliser une clé Azure Key Vault spécifique avec une version spécifique. Si vous modifiez la clé ou la version, l’objet doit être mis à jour pour l’utiliser avant que vous ne supprimiez l’ancien. L’échec de cette opération restitue l’objet inutilisable. Vous ne pourrez pas déchiffrer le contenu si la clé est perdue.

Étape 5 : Tester le chiffrement

Pour vérifier que le chiffrement fonctionne, révoquez la clé de chiffrement, interrogez l’index (il doit être inutilisable), puis rétablissez la clé de chiffrement.

Utilisez le portail Azure pour cette tâche.

  1. Dans la page Azure Key Vault, sélectionnez Objects>Keys.

  2. Sélectionnez la clé que vous venez de créer, puis sélectionnez Supprimer.

  3. Dans la page Recherche d’IA Azure, sélectionnez gestion de recherche>Index.

  4. Sélectionnez votre index et utilisez l’Explorateur de recherche pour exécuter une requête. Une erreur doit apparaître.

  5. Revenez à la page Azure Key Vault Objects>Keys.

  6. Sélectionnez Gérer les clés supprimées.

  7. Sélectionnez votre clé, puis sélectionnez Récupérer.

  8. Revenez à votre index dans Recherche IA Azure et réexécutez la requête. Vous devez voir les résultats de la recherche. Si vous ne voyez pas de résultats immédiats, attendez une minute et réessayez.

Configurer une stratégie pour appliquer la conformité CMK

Les stratégies Azure aident à appliquer les normes organisationnelles et à évaluer la conformité à grande échelle. La recherche Azure AI dispose d’une stratégie intégrée facultative pour l’application de CMK à l’échelle du service.

Dans cette section, vous définissez la stratégie qui définit une norme CMK pour votre service de recherche. Ensuite, vous configurez votre service de recherche pour appliquer cette stratégie.

  1. Accédez à la stratégie intégrée dans votre navigateur web. Sélectionnez Attribuer.

    Capture d’écran de l’attribution de stratégie CMK intégrée.

  2. Configurez l’étendue de la stratégie. Dans la section Paramètres, décochez Afficher uniquement les paramètres... et définissez Effet sur Refuser.

    Lors de l’évaluation de la requête, une requête qui correspond à une définition de stratégie de refus est marquée comme non conforme. En supposant que la norme de votre service est le chiffrement par CMK, « refus » signifie que les requêtes qui ne spécifient pas le chiffrement par CMK ne sont pas conformes.

    Capture d’écran de la définition de l’effet de la stratégie CMK intégrée sur refuser.

  3. Terminez la création de la stratégie.

  4. Appelez Services - Mettre à jour l’API pour activer l’application de la stratégie CMK au niveau du service.

PATCH https://management.azure.com/subscriptions/<your-subscription-Id>/resourceGroups/<your-resource-group-name>/providers/Microsoft.Search/searchServices/<your-search-service-name>?api-version=2023-11-01

{
    "properties": {
        "encryptionWithCmk": {
            "enforcement": "Enabled"
        }
    }
}

Effectuer ou mettez à jour la rotation des clés de chiffrement

Nous vous recommandons d’utiliser les fonctionnalités d’autorisation d’Azure Key Vault, mais vous pouvez également faire pivoter les clés manuellement.

Lorsque vous modifiez une clé ou sa version, tout objet qui utilise la clé doit d’abord être mis à jour pour utiliser les nouvelles valeurs avant vous supprimez les anciennes valeurs. Sinon, l’objet devient inutilisable, car il ne peut pas être déchiffré.

  1. Déterminez la clé utilisée par un index ou un mappage de synonyme.

  2. Créez une clé dans le coffre de clés, mais gardez la clé d’origine disponible.

  3. Mettez à jour les propriétés encryptionKey sur un index ou un mappage de synonymes pour utiliser les nouvelles valeurs. Seuls des objets créés à l’origine avec cette propriété peuvent être mis à jour pour utiliser une autre valeur.

  4. Désactivez ou supprimez la clé précédente dans le coffre de clés. Surveillez l’accès à la clé pour vérifier que la nouvelle clé est utilisée.

Pour des raisons de performances, le service de recherche met en cache la clé pendant plusieurs heures. Si vous désactivez ou supprimez la clé sans en fournir de nouvelle, les requêtes continuent de fonctionner sur une base temporaire jusqu’à ce que le cache expire. Toutefois, une fois que le service de recherche ne peut plus déchiffrer le contenu, vous obtenez le message suivant : « Accès interdit. La clé de requête utilisée a peut-être été révoquée. Réessayez. »

Utiliser des colonnes chiffrées

Avec le chiffrement par clé gérée par le client, vous risquez de remarquer une latence pour l’indexation et les requêtes en raison du travail de chiffrement/déchiffrement supplémentaire. La recherche Azure AI ne journalise pas l’activité de chiffrement, mais vous pouvez surveiller l’accès aux clés par le biais de la journalisation du coffre de clés.

Nous vous recommandons d’activer la journalisation dans le cadre de la configuration du coffre de clés.

  1. Créer un espace de travail Log Analytics.

  2. Ajouter un paramètre de diagnostic dans le coffre de clés qui utilise l’espace de travail pour la conservation des données.

  3. Sélectionnez audit ou tous les journaux pour la catégorie, donnez un nom au paramètre de diagnostic, puis enregistrez-le.

Exemple Python de configuration de clé de chiffrement

Cette section montre la représentation Python d’un encryptionKey dans une définition d’objet. La même définition s’applique aux index, aux sources de données, aux compétences, aux indexeurs et aux mappages de synonymes. Pour essayer cet exemple sur votre service de recherche et votre coffre de clés, téléchargez le notebook à partir de azure-search-python-samples.

Installez certains packages.

! pip install python-dotenv
! pip install azure-core
! pip install azure-search-documents==11.5.1
! pip install azure-identity

Créez un index qui a une clé de chiffrement.

from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import (
    SimpleField,
    SearchFieldDataType,
    SearchableField,
    SearchIndex,
    SearchResourceEncryptionKey
)
from azure.identity import DefaultAzureCredential

endpoint="<PUT YOUR AZURE SEARCH SERVICE ENDPOINT HERE>"
credential = DefaultAzureCredential()

index_name = "test-cmk-index"
index_client = SearchIndexClient(endpoint=endpoint, credential=credential)  
fields = [
        SimpleField(name="Id", type=SearchFieldDataType.String, key=True),
        SearchableField(name="Description", type=SearchFieldDataType.String)
    ]

scoring_profiles = []
suggester = []
encryption_key = SearchResourceEncryptionKey(
    key_name="<PUT YOUR KEY VAULT NAME HERE>",
    key_version="<PUT YOUR ALPHANUMERIC KEY VERSION HERE>",
    vault_uri="<PUT YOUR KEY VAULT ENDPOINT HERE>"
)

index = SearchIndex(name=index_name, fields=fields, encryption_key=encryption_key)
result = index_client.create_or_update_index(index)
print(f' {result.name} created')

Obtenez la définition d’index pour vérifier que la configuration de la clé de chiffrement existe.

index_name = "test-cmk-index-qs"
index_client = SearchIndexClient(endpoint=AZURE_SEARCH_SERVICE, credential=credential)  

result = index_client.get_index(index_name)  
print(f"{result}")  

Chargez l’index avec quelques documents. Tout le contenu de champ est considéré comme sensible et est chiffré sur le disque à l’aide de votre clé gérée par le client.

from azure.search.documents import SearchClient

# Create a documents payload
documents = [
    {
    "@search.action": "upload",
    "Id": "1",
    "Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities."
    },
    {
    "@search.action": "upload",
    "Id": "2",
    "Description": "The hotel is situated in a  nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts."
    },
    {
    "@search.action": "upload",
    "Id": "3",
    "Description": "The hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel's restaurant services."
    },
    {
    "@search.action": "upload",
    "Id": "4",
    "Description": "The hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 1800 palace."
    }
]

search_client = SearchClient(endpoint=AZURE_SEARCH_SERVICE, index_name=index_name, credential=credential)
try:
    result = search_client.upload_documents(documents=documents)
    print("Upload of new document succeeded: {}".format(result[0].succeeded))
except Exception as ex:
    print (ex.message)

    index_client = SearchClient(endpoint=AZURE_SEARCH_SERVICE, credential=credential)

Exécutez une requête pour vérifier que l’index est opérationnel.

from azure.search.documents import SearchClient

query = "historic"  

search_client = SearchClient(endpoint=AZURE_SEARCH_SERVICE, credential=credential, index_name=index_name)
  
results = search_client.search(  
    query_type='simple',
    search_text=query, 
    select=["Id", "Description"],
    include_total_count=True
    )
  
for result in results:  
    print(f"Score: {result['@search.score']}")
    print(f"Id: {result['Id']}")
    print(f"Description: {result['Description']}")

La requête doit produire des résultats similaires à ceux de l’exemple suivant.

Score: 0.6130029
Id: 4
Description: The hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 1800 palace.
Score: 0.26286605
Id: 1
Description: The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.

Étant donné que le contenu chiffré est déchiffré avant l’actualisation des données ou les requêtes, vous ne verrez pas de preuve visuelle du chiffrement. Pour vérifier que le chiffrement fonctionne, vérifiez les journaux des ressources.

Étapes suivantes

Si vous n’êtes pas familiarisé avec l’architecture de sécurité Azure, passez en revue la documentation sur la sécurité Azure, et en particulier cet article :