Configuración de claves administradas por el cliente para el cifrado de datos en Azure Cognitive Search

Azure Cognitive Search cifra automáticamente los datos en reposo con claves administradas por el servicio. Si se necesita más protección, puede complementar el cifrado predeterminado con un nivel de cifrado adicional con las claves que se crean y administran en Azure Key Vault.

En este artículo se describen los pasos necesarios para configurar el cifrado de claves administradas por el cliente (CMK) o "Bring Your Own Key" (BYOK). Estos son algunos aspectos que debe tener en cuenta:

  • El cifrado de CMK se aprueba en objetos individuales. Si necesita CMK unilateralmente en el servicio de búsqueda, establezca una directiva de cumplimiento en el nivel de servicio para que pueda recibir una notificación si el servicio no cumple.

  • El cifrado de CMK depende de Azure Key Vault. Puede crear sus propias claves de cifrado y almacenarlas en un almacén de claves, o puede usar las API de Azure Key Vault para generar las claves de cifrado.

  • El cifrado de CMK se produce cuando se crea un objeto. No se pueden cifrar los objetos que ya existen.

Compatibilidad con el cifrado CMK

Los objetos que se pueden cifrar incluyen índices, listas de sinónimos, indizadores, orígenes de datos y conjuntos de aptitudes. El cifrado es intensivo a nivel computacional de descifrar, por lo que solo se cifra el contenido confidencial.

El cifrado se realiza a través del siguiente contenido:

  • Todo el contenido de índices y listas de sinónimos, incluidas las descripciones.

  • Para indizadores, orígenes de datos y conjuntos de aptitudes, solo se cifran los campos en los que se almacenan cadenas de conexión, descripciones, claves y entradas de usuario. Por ejemplo, los conjuntos de aptitudes tienen claves de Cognitive Services y algunas aptitudes aceptan entradas de usuario, como entidades personalizadas. En ambos casos, se cifran las claves y las entradas de usuario en las aptitudes.

Doble cifrado

El cifrado doble es una extensión del cifrado de claves administradas por el cliente (CMK). El cifrado de CMK se aplica al almacenamiento a largo plazo que se escribe en un disco de datos. El término cifrado doble hace referencia al cifrado adicional del almacenamiento a corto plazo (del contenido escrito en discos temporales). No se requiere ninguna configuración. Cuando se aplica CMK a objetos, se invoca automáticamente el cifrado doble.

Aunque el cifrado doble está disponible en todas las regiones, la compatibilidad se ha implantado en dos fases. El primer lanzamiento se realizó en agosto de 2020 e incluyó las cinco regiones enumeradas a continuación. El segundo lanzamiento, realizado en mayo de 2021 extendió el cifrado doble a todas las regiones restantes. Si usa CMK en un servicio anterior y quiere un cifrado doble, deberá crear un nuevo servicio de búsqueda en la región que prefiera.

Region Fecha de creación del servicio
Oeste de EE. UU. 2 Después del 1 de agosto de 2020
Este de EE. UU. Después del 1 de agosto de 2020
Centro-sur de EE. UU. Después del 1 de agosto de 2020
US Gov - Virginia Después del 1 de agosto de 2020
US Gov: Arizona Después del 1 de agosto de 2020
Productos disponibles por región Después del 13 de mayo de 2021

Requisitos previos

En este escenario se usan los servicios y las herramientas siguientes.

Debe tener un cliente de búsqueda que pueda crear el objeto cifrado. En este código, hará referencia a una clave del almacén de claves y a la información de registro de Active Directory. Este código puede ser una aplicación de trabajo o un código de prototipo como el ejemplo de código de C# DotNetHowToEncryptionUsingCMK.

Sugerencia

Puede usar Postman, Visual Studio Code o Azure PowerShell, para llamar a las API REST que crean índices y asignaciones de sinónimos que incluyen un parámetro de clave de cifrado. También puede usar SDK de Azure. No se admite la compatibilidad del portal para agregar una clave a índices o mapas de sinónimos.

Sugerencias de Key Vault

Si no tiene experiencia con Azure Key Vault, revise este inicio rápido para obtener información sobre las tareas básicas: Establecimiento y recuperación de un secreto de Azure Key Vault mediante PowerShell. Estas son algunas sugerencias para usar Key Vault:

  • Use tantos almacenes de claves como necesite. Las claves administradas pueden estar en almacenes de claves diferentes. Un servicio de búsqueda puede tener varios objetos cifrados, cada uno cifrado con una clave de cifrado administrada por el cliente distinta, en almacenes de claves diferentes.

  • Habilite el registro en Key Vault para poder supervisar la utilización de las claves.

  • Asegúrese de seguir procedimientos estrictos durante el giro rutinario de las claves del almacén de claves y de los secretos y el registro de aplicaciones de Active Directory. Actualice siempre todo el contenido cifrado para usar nuevos secretos y claves antes de eliminar los antiguos. Si omite este paso, el contenido no se puede descifrar.

1 - Habilitación de la protección de purga

Como primer paso, asegúrese de que la eliminación temporal y la protección de purga están habilitadas en el almacén de claves. Debido a la naturaleza del cifrado con claves administradas por el cliente, nadie puede recuperar sus datos si se elimina la clave de Azure Key Vault.

Para evitar la pérdida de datos causada por las eliminaciones accidentales de claves de Key Vault, debe habilitar las opciones de eliminación temporal y de protección de purgas en el almacén de claves. La eliminación temporal está habilitada de manera predeterminada, por lo que solo tendrá problemas si la deshabilitó intencionadamente. La protección de purga no está habilitada de manera predeterminada, pero es necesaria para el cifrado de claves administradas por el cliente de Cognitive Search.

Puede establecer ambas propiedades mediante el portal, PowerShell o los comandos de la CLI de Azure.

  1. Inicie sesión en Azure Portal y abra la página de información general del almacén de claves.

  2. En la página Información general, en Información esencial, habilite Eliminación temporal y Protección de purga.

2\. Creación de una clave en Key Vault

Omita la generación de claves si ya tiene una clave en Azure Key Vault que quiere usar, pero recopile el identificador de clave. Necesitará esta información al crear un objeto cifrado.

  1. Inicie sesión en Azure Portal y abra la página de información general del almacén de claves.

  2. Seleccione Claves a la izquierda y, luego, elija + Generate/Import (+ Generar/Importar).

  3. En el panel Crear una clave, forme la lista de Opciones y elija el método que quiera usar para crear una clave. También puede generar una nueva clave, cargar una clave existente, o usar Restaurar copia de seguridad para seleccionar una copia de seguridad de una clave.

  4. Especifique un nombre para la clave y, opcionalmente, seleccione otras propiedades clave.

  5. Seleccione Crear para iniciar la implementación.

  6. Seleccione la clave, seleccione la versión actual y tome nota del identificador de clave. Se compone del URI del valor de clave, el nombre de clave y la versión de clave. Necesitará el identificador para definir un índice cifrado en Azure Cognitive Search.

    Create a new key vault key

3 - Creación de una entidad de seguridad

Tiene varias opciones para acceder a la clave de cifrado en tiempo de ejecución. El enfoque más sencillo consiste en recuperar la clave mediante la identidad administrada y los permisos del servicio de búsqueda. Puede usar una identidad administrada por el usuario o por el sistema. De esta forma, se pueden omitir los pasos para el registro de aplicaciones y los secretos de aplicación, y se simplifica la definición de la clave de cifrado.

Como alternativa, puede crear y registrar una aplicación de Azure Active Directory. El servicio de búsqueda proporcionará el id. de la aplicación en las solicitudes.

Una identidad administrada permite que el servicio de búsqueda se autentique en Azure Key Vault sin almacenar las credenciales (ApplicationID o ApplicationSecret) en el código. El ciclo de vida de este tipo de identidad administrada está ligado al ciclo de vida del servicio de búsqueda, que solo puede tener una identidad administrada. Para más información sobre cómo funcionan las identidades administradas, consulte Qué son las identidades administradas de recursos de Azure.

  1. Convierta el servicio de búsqueda en un servicio de confianza.

    Turn on system assigned managed identity

Entre las condiciones que impedirán adoptar este enfoque se incluyen las siguientes:

  • No puede conceder directamente a su servicio de búsqueda permisos de acceso al almacén de claves (por ejemplo, si el servicio de búsqueda se encuentra en un inquilino de Active Directory diferente al de Azure Key Vault).

  • Se requiere un único servicio de búsqueda para hospedar varios mapas de sinónimos o índices cifrados, cada uno de los cuales utiliza una clave diferente de un almacén de claves diferente, donde cada almacén de claves debe utilizar una identidad diferente para la autenticación. Como un servicio de búsqueda solo puede tener una identidad administrada, un requisito de varias identidades descalificará el enfoque simplificado para el escenario.

4 - Concesión de permisos

En este paso, creará una directiva de acceso en Key Vault. Esta directiva proporciona a la aplicación que registró en Active Directory permiso para usar la clave administrada por el cliente.

Los permisos de acceso se pueden revocar en cualquier momento. Una vez revocados, cualquier índice o mapa de sinónimos de servicio de búsqueda que utilice ese almacén de claves quedará inutilizable. La restauración de los permisos de acceso al almacén de claves en un momento posterior restaurará el acceso al índice o al mapa de sinónimos. Para más información, consulte Protección del acceso a un almacén de claves.

  1. Todavía en Azure Portal, abra la página Información general del almacén de claves.

  2. Seleccione las directivas de acceso de la izquierda y seleccione + Crear para iniciar el asistente Creación de una directiva de acceso.

    Create an access policy.

  3. En la página Permisos, seleccione Obtener para Permisos de las claves, Permisos de los secretos y Permisos de los certificados. Seleccione Desencapsular clave y Encapsular clave para ** operaciones criptográficas en la clave.

    Select permissions in the Permissions page.

  4. Seleccione Next (Siguiente).

  5. En la página Principle, busque y seleccione la entidad de seguridad que usa el servicio de búsqueda para acceder a la clave de cifrado. Será la identidad administrada por el sistema o por el usuario del servicio de búsqueda o la aplicación registrada.

  6. Seleccione Siguiente y Crear.

Importante

El contenido cifrado de Azure Cognitive Search está configurado para usar una clave específica de Azure Key Vault con una versión concreta. Si cambia la clave o la versión, debe actualizar el índice o el mapa de sinónimos para utilizarla antes de eliminar la anterior. Si no lo hace, el índice o el mapa de sinónimos no se podrán usar. No podrá descifrar el contenido si se pierde la clave.

5\. Cifrado del contenido

Las claves de cifrado se agregan al crear un objeto. Para agregar una clave administrada por el cliente en un índice, un mapa de sinónimos, un indizador, un origen de datos o un conjunto de aptitudes, use la API REST Search o un SDK de Azure para crear un objeto que tenga habilitado el cifrado. El portal no admite propiedades de cifrado en la creación de objetos.

  1. Llame a las API Create para especificar la propiedad encryptionKey:

  2. Inserte la construcción encryptionKey en la definición del objeto. Es una propiedad de primer nivel, el mismo que el del nombre y la descripción. En los ejemplos de REST siguientes se muestra la selección de ubicación de las propiedades. Si usa el mismo almacén, clave y versión, puede pegar la misma construcción de la propiedad "encryptionKey" en la definición de cada objeto.

    En el primer ejemplo se muestra una propiedad "encryptionKey" para un servicio de búsqueda que se conecta mediante una identidad administrada:

    {
      "encryptionKey": {
        "keyVaultUri": "https://demokeyvault.vault.azure.net",
        "keyVaultKeyName": "myEncryptionKey",
        "keyVaultKeyVersion": "eaab6a663d59439ebb95ce2fe7d5f660"
      }
    }
    

    En el segundo ejemplo se incluye la propiedad "accessCredentials", necesaria si registró una aplicación en Azure AD:

    {
      "encryptionKey": {
        "keyVaultUri": "https://demokeyvault.vault.azure.net",
        "keyVaultKeyName": "myEncryptionKey",
        "keyVaultKeyVersion": "eaab6a663d59439ebb95ce2fe7d5f660",
        "accessCredentials": {
          "applicationId": "00000000-0000-0000-0000-000000000000",
          "applicationSecret": "myApplicationSecret"
        }
      }
    }
    

Una vez que cree el objeto cifrado en el servicio de búsqueda, puede usarlo como haría con cualquier otro objeto de su tipo. El cifrado es transparente para el usuario y el desarrollador.

Nota

Ninguno de estos detalles del almacén de claves se considera secreto y se pueden recuperar fácilmente; para ello, debe ir a la página pertinente de Azure Key Vault en Azure Portal.

Ejemplos de REST

En esta sección se muestra el código JSON de varios objetos para que pueda ver dónde buscar la propiedad "encryptionKey" en la definición de un objeto.

Cifrado del índice

Los detalles de la creación de un índice a través de la API REST se pueden encontrar en Creación de un índice (API REST), donde la única diferencia aquí es especificar los detalles de la clave de cifrado como parte de la definición del índice:

{
 "name": "hotels",
 "fields": [
  {"name": "HotelId", "type": "Edm.String", "key": true, "filterable": true},
  {"name": "HotelName", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": true, "facetable": false},
  {"name": "Description", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": false, "facetable": false, "analyzer": "en.lucene"},
  {"name": "Description_fr", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": false, "facetable": false, "analyzer": "fr.lucene"},
  {"name": "Category", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true},
  {"name": "Tags", "type": "Collection(Edm.String)", "searchable": true, "filterable": true, "sortable": false, "facetable": true},
  {"name": "ParkingIncluded", "type": "Edm.Boolean", "filterable": true, "sortable": true, "facetable": true},
  {"name": "LastRenovationDate", "type": "Edm.DateTimeOffset", "filterable": true, "sortable": true, "facetable": true},
  {"name": "Rating", "type": "Edm.Double", "filterable": true, "sortable": true, "facetable": true},
  {"name": "Location", "type": "Edm.GeographyPoint", "filterable": true, "sortable": true}
 ],
  "encryptionKey": {
    "keyVaultUri": "https://demokeyvault.vault.azure.net",
    "keyVaultKeyName": "myEncryptionKey",
    "keyVaultKeyVersion": "eaab6a663d59439ebb95ce2fe7d5f660",
    "accessCredentials": {
      "applicationId": "00000000-0000-0000-0000-000000000000",
      "applicationSecret": "myApplicationSecret"
    }
  }
}

Ahora puede enviar la solicitud de creación del índice y, a continuación, empiece a usar el índice con normalidad.

Cifrado del mapa de sinónimos

Cree una asignación de sinónimos cifrada con el procedimiento de Creación de una asignación de sinónimos (API REST de Azure Cognitive Search). Use la propiedad "encryptionKey" para especificar la clave de cifrado que se va a usar.

{
  "name" : "synonymmap1",
  "format" : "solr",
  "synonyms" : "United States, United States of America, USA\n
  Washington, Wash. => WA",
  "encryptionKey": {
    "keyVaultUri": "https://demokeyvault.vault.azure.net",
    "keyVaultKeyName": "myEncryptionKey",
    "keyVaultKeyVersion": "eaab6a663d59439ebb95ce2fe7d5f660",
    "accessCredentials": {
      "applicationId": "00000000-0000-0000-0000-000000000000",
      "applicationSecret": "myApplicationSecret"
    }
  }
}

Ahora puede enviar la solicitud de creación del mapa de sinónimos y, a continuación, empiece a usarlo con normalidad.

Cifrado de origen de datos

Cree un origen de datos cifrado mediante la API REST Create Data Source (Crear origen de datos). Use la propiedad "encryptionKey" para especificar la clave de cifrado que se va a usar.

{
  "name" : "datasource1",
  "type" : "azureblob",
  "credentials" :
  { "connectionString" : "DefaultEndpointsProtocol=https;AccountName=datasource;AccountKey=accountkey;EndpointSuffix=core.windows.net"
  },
  "container" : { "name" : "containername" },
  "encryptionKey": {
    "keyVaultUri": "https://demokeyvault.vault.azure.net",
    "keyVaultKeyName": "myEncryptionKey",
    "keyVaultKeyVersion": "eaab6a663d59439ebb95ce2fe7d5f660",
    "accessCredentials": {
      "applicationId": "00000000-0000-0000-0000-000000000000",
      "applicationSecret": "myApplicationSecret"
    }
  }
}

Ahora puede enviar la solicitud de creación del origen de datos y luego empezar a usarlo con normalidad.

Cifrado de conjunto de aptitudes

Cree un conjunto de aptitudes cifrado mediante la API REST Create Skillset (Crear conjunto de aptitudes). Use la propiedad "encryptionKey" para especificar la clave de cifrado que se va a usar.

{
    "name": "skillset1",
    "skills":  [ omitted for brevity ],
    "cognitiveServices": { omitted for brevity },
      "knowledgeStore":  { omitted for brevity  },
    "encryptionKey": (optional) { 
        "keyVaultKeyName": "myEncryptionKey",
        "keyVaultKeyVersion": "eaab6a663d59439ebb95ce2fe7d5f660",
        "keyVaultUri": "https://demokeyvault.vault.azure.net",
        "accessCredentials": {
            "applicationId": "00000000-0000-0000-0000-000000000000",
            "applicationSecret": "myApplicationSecret"}
    }
}

Ahora puede enviar la solicitud de creación del conjunto de aptitudes y luego empezar a usarlo con normalidad.

Cifrado de indizador

Cree un indizador cifrado mediante la API REST Create Indexer (Crear indizador). Use la propiedad "encryptionKey" para especificar la clave de cifrado que se va a usar.

{
  "name": "indexer1",
  "dataSourceName": "datasource1",
  "skillsetName": "skillset1",
  "parameters": {
      "configuration": {
          "imageAction": "generateNormalizedImages"
      }
  },
  "encryptionKey": {
    "keyVaultUri": "https://demokeyvault.vault.azure.net",
    "keyVaultKeyName": "myEncryptionKey",
    "keyVaultKeyVersion": "eaab6a663d59439ebb95ce2fe7d5f660",
    "accessCredentials": {
      "applicationId": "00000000-0000-0000-0000-000000000000",
      "applicationSecret": "myApplicationSecret"
    }
  }
}

Ahora puede enviar la solicitud de creación del indizador y luego empezar a usarlo con normalidad.

Importante

Aunque la propiedad "encryptionKey" no se puede agregar a los índices de búsqueda ni a los mapas de sinónimos existentes, se puede actualizar si se proporcionan valores diferentes para cualquiera de los tres datos del almacén de claves (por ejemplo, mediante la actualización de la versión de la clave). Al cambiar a una nueva clave o versión de clave de Key Vault, cualquier asignación de índices de búsqueda o sinónimos que utilice la clave debe actualizarse primero para usar la nueva clave o versión antes de eliminar la clave o versión anteriores. Si no lo hace, el índice o el mapa de sinónimos quedarán inutilizables, ya que no podrá descifrar el contenido una vez que se pierda el acceso a la clave. No obstante, al restaurar los permisos de acceso al almacén de claves en un momento posterior, se restaurará el acceso al contenido.

Trabajo con contenido cifrado

Con el cifrado de claves administradas por el cliente, detectará una latencia para la indexación y las consultas debido al trabajo de cifrado o descifrado adicional. Azure Cognitive Search no registra la actividad de cifrado, pero puede supervisar el acceso a la clave mediante el registro del almacén de claves. Se recomienda habilitar el registro como parte de la configuración del almacén de claves.

Se espera que se produzca una rotación de claves con el tiempo. Cuando se realice la rotación de claves, es importante seguir esta secuencia:

  1. Determine la clave que usa un índice o asignación de sinónimos.
  2. Cree una nueva clave en el almacén de claves, pero deje la clave original disponible.
  3. Actualice las propiedades de encryptionKey en una asignación de sinónimo o índice para usar los nuevos valores. Solo se pueden actualizar los objetos que se crearon originalmente con esta propiedad para usar un valor diferente.
  4. Deshabilite o elimine la clave anterior en el almacén de claves. Supervise el acceso a la clave para comprobar que se está usando la nueva clave.

Por motivos de rendimiento, el servicio de búsqueda almacena la clave en la memoria caché durante varias horas. Si deshabilita o elimina la clave sin proporcionar una nueva, las consultas seguirán funcionando de manera temporal hasta que expire la memoria caché. Sin embargo, una vez que el servicio de búsqueda ya no pueda descifrar el contenido, verá este mensaje: "Se ha prohibido el acceso. Puede que la clave de consulta se haya revocado. Vuelva a intentarlo.”

Pasos siguientes

Si no está familiarizado con la arquitectura de seguridad de Azure, revise la documentación de Azure Security, y en particular, este artículo: