Поделиться через


Настройка ключей, управляемых клиентом, для шифрования данных в службе "Поиск ИИ Azure"

Поиск искусственного интеллекта Azure автоматически шифрует неактивных данных с помощью ключей, управляемых службой. Если требуется дополнительная защита, можно дополнить шифрование по умолчанию другим уровнем шифрования с помощью ключей, создаваемых и управляемых в Azure Key Vault.

В этой статье описаны действия по настройке ключа, управляемого клиентом (CMK) или шифрования byOK.

Примечание.

Если индекс зашифрован, он доступен только в том случае, если служба поиска имеет доступ к ключу. Если доступ отозван, индекс недоступен и служба не может быть масштабирована до тех пор, пока индекс не будет удален или доступ к ключу восстановлен.

Зашифрованные объекты CMK

Шифрование CMK принимается для отдельных объектов. Если требуется cmK в службе поиска, задайте политику принудительного применения.

Шифрование CMK становится операционным при создании объекта. Невозможно зашифровать уже существующие объекты. Шифрование CMK происходит всякий раз, когда объект сохраняется на диске, данные неактивных данных для долгосрочного хранения или временных данных для краткосрочного хранения. При использовании CMK диск никогда не видит незашифрованные данные.

К объектам, которые могут быть зашифрованы, относятся индексы, списки синонимов, индексаторы, источники данных и наборы навыков. Расшифровка требует много вычислительных ресурсов, поэтому шифрование применяется только к конфиденциальному содержимому.

Шифрование выполняется по следующему содержимому:

  • Все содержимое в индексах и списках синонимов.

  • Конфиденциальное содержимое в индексаторах, источниках данных, наборах навыков и векторизаторах. Это содержимое состоит только из тех полей, которые хранят строка подключения, описания, удостоверения, ключи и входные данные пользователя. Например, наборы навыков имеют ключи служб искусственного интеллекта Azure, а некоторые навыки принимают пользовательские входные данные, такие как пользовательские сущности. В обоих случаях ключи и входные данные пользователей в навыки шифруются. Все ссылки на внешние ресурсы (например, источники данных Azure или модели Azure OpenAI) также шифруются.

Полное двойное шифрование

При вводе шифрования CMK вы шифруете содержимое дважды. Для объектов и полей, указанных в предыдущем разделе, содержимое сначала шифруется с помощью CMK, а во-вторых, с помощью ключа, управляемого корпорацией Майкрософт. Содержимое шифруется на дисках данных для долгосрочного хранения и на временных дисках, используемых для краткосрочного хранения.

Включение шифрования CMK увеличивает размер индекса и снижает производительность запросов. На основе наблюдений на сегодняшний день вы можете ожидать увеличения на 30–60 процентов запросов, хотя фактическая производительность зависит от определения индекса и типов запросов. Так как производительность уменьшается, мы рекомендуем включить эту функцию только для объектов, которые действительно требуют его.

Хотя двойное шифрование теперь доступно во всех регионах, поддержка была развернута на двух этапах:

  • Первый выпуск был 1 августа 2020 года и включал пять регионов, перечисленных ниже. служба , созданные в следующих регионах, поддерживают CMK для дисков данных, но не временные диски:

    • западная часть США 2
    • Восточная часть США
    • Центрально-южная часть США
    • US Gov (Вирджиния)
    • US Gov (Аризона)
  • Второй выпуск 13 мая 2021 г. добавил шифрование временных дисков и расширенное шифрование CMK для всех поддерживаемых регионов.

    Если вы используете CMK из службы, созданной во время первого развертывания, а также требуется шифрование CMK на временных дисках, необходимо создать новую службу поиска в выбранном регионе и повторно развернуть содержимое. Сведения о дате создания службы см. в разделе "Как проверить дату создания службы".

Необходимые компоненты

Ограничения

  • Нет поддержки управляемой аппаратной модели безопасности Azure Key Vault (HSM).

  • Поддержка между подписками не поддерживается. Azure Key Vault и поиск Azure AI должны находиться в одной подписке.

Советы по Key Vault

Если вы не знакомы с Azure Key Vault, ознакомьтесь с этим кратким руководством, чтобы узнать о основных задачах: задайте и извлеките секрет из Azure Key Vault с помощью PowerShell.

Ниже приведены некоторые советы по использованию Key Vault.

  • Используйте столько хранилищ ключей, сколько необходимо. Управляемые ключи могут находиться в разных хранилищах ключей. Служба поиска может иметь несколько зашифрованных объектов, каждый из которых зашифрован с помощью другого ключа шифрования, управляемого клиентом, хранящегося в разных хранилищах ключей.

  • Используйте тот же клиент, чтобы получить управляемый ключ, подключився через системное или управляемое пользователем удостоверение. Для этого требуется, чтобы обе службы совместно используют один и тот же клиент. Дополнительные сведения о создании клиента см. в разделе "Настройка нового клиента".

  • Включите защиту очистки и обратимое удаление. Из-за характера шифрования с помощью ключей, управляемых клиентом, никто не сможет получить данные, если ключ Azure Key Vault удален. Чтобы предотвратить потери данных, вызванные случайным удалением ключа из хранилища ключей, в хранилище ключей должно быть включено обратимое удаление и защита от очистки. Обратимое удаление включено по умолчанию, поэтому при намеренном отключении проблемы будут возникать только проблемы. Защита от очистки не включена по умолчанию, но требуется для шифрования ключей, управляемых клиентом, в службе "Поиск ИИ Azure".

  • Включите ведение журнала в хранилище ключей, чтобы отслеживать использование ключей.

  • Включите авторотацию ключей или следуйте строгим процедурам во время обычной смены ключей хранилища ключей и секретов приложений и регистрации. Всегда обновляйте все зашифрованное содержимое для использования новых секретов и ключей перед удалением старых. Если вы пропустите этот шаг, содержимое не может быть расшифровано.

Шаг 1. Создание ключа в Key Vault

Пропустите создание ключей, если у вас уже есть ключ в Azure Key Vault, который вы хотите использовать, но соберите идентификатор ключа. Эти сведения требуются при создании зашифрованного объекта.

Прежде чем добавить ключ, убедитесь, что вы назначили себе роль офицера шифрования Key Vault.

Шифрование поиска ИИ Azure поддерживает ключи RSA размером 2048, 3072 и 4096. Дополнительные сведения о поддерживаемых типах ключей см. в статье Общие сведениях о ключах.

  1. Войдите в портал Azure и откройте страницу обзора хранилища ключей.

  2. Выберите ключи объектов>слева и нажмите кнопку "Создать или импортировать".

  3. В области "Создание ключа" в списке параметров выберите "Создать", чтобы создать новый ключ.

  4. Введите имя ключа и примите значения по умолчанию для других свойств ключей.

  5. При необходимости задайте политику смены ключей, чтобы включить автоматическую смену.

  6. Нажмите кнопку Создать, чтобы начать развертывание.

  7. Выберите ключ, выберите текущую версию и запишите идентификатор ключа. Он состоит из URI значения ключа, имени ключа и версии ключа. Вам нужен идентификатор для определения зашифрованного индекса в службе поиска искусственного интеллекта Azure.

    Создайте нового ключа в хранилище ключей

Шаг 2. Создание субъекта безопасности

У вас есть несколько вариантов настройки доступа к ключу шифрования в службе "Поиск ИИ Azure" во время выполнения. Самый простой подход — получить ключ с помощью управляемого удостоверения службы поиска. Вы можете использовать системное или управляемое пользователем удостоверение. Это позволяет опустить шаги для регистрации приложений и секретов приложений. Кроме того, можно создать и зарегистрировать приложение Microsoft Entra и указать идентификатор приложения по запросам.

Рекомендуется использовать управляемое удостоверение. Управляемое удостоверение позволяет службе поиска проходить проверку подлинности в Azure Key Vault без хранения учетных данных (ApplicationID или ApplicationSecret) в коде. Жизненный цикл этого типа управляемого удостоверения привязан к жизненному циклу службы поиска, который может иметь только одно управляемое удостоверение, назначаемое системой. Дополнительные сведения о работе управляемых удостоверений см. в статье Что такое управляемые удостоверения для ресурсов Azure?

Включите управляемое удостоверение, назначенное системой для службы поиска.

Снимок экрана: включение управляемого удостоверения, назначаемого системой.

Шаг 3. Предоставление разрешений

Azure Key Vault поддерживает авторизацию с помощью элементов управления доступом на основе ролей. Мы рекомендуем использовать этот подход по политикам доступа к хранилищу ключей. Дополнительные сведения см. в статье "Предоставление доступа к ключам, сертификатам и секретам Key Vault с помощью ролей Azure".

На этом шаге назначьте роль пользователя шифрования шифрования службы шифрования key Vault службе поиска. Если вы тестируете локально, назначьте эту роль себе, а также.

  1. Войдите в портал Azure и найдите хранилище ключей.

  2. Выберите элемент управления доступом (IAM) и выберите "Добавить назначение ролей".

  3. Выберите пользователя шифрования службы шифрования key Vault и нажмите кнопку "Далее".

  4. Выберите управляемые удостоверения, выберите участников и выберите управляемое удостоверение службы поиска.

  5. Выберите Проверить и назначить.

Подождите несколько минут, пока назначение роли станет операционным.

Шаг 4. Шифрование содержимого

Ключи шифрования добавляются при создании объекта. Чтобы добавить управляемый клиентом ключ к индексу, карте синонимов, индексатору, источнику данных или набору навыков, используйте портал Azure, REST API поиска или пакет SDK Azure для создания объекта с включенным шифрованием. Сведения о добавлении шифрования с помощью пакета SDK Azure см. в примере Python в этой статье.

  1. Вызовите API создания, чтобы указать свойство encryptionKey :

  2. Вставьте конструкцию encryptionKey в определение объекта. Это свойство первого уровня, которое находится на том же уровне, что и имя и описание. Если вы используете одно и то же хранилище, ключ и версию, можно вставить в одну и ту же конструкцию encryptionKey в каждое определение объекта.

    В первом примере показан ключ шифрования для службы поиска, которая подключается с помощью управляемого удостоверения:

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

    Второй пример включает accessCredentials, необходимый для регистрации приложения в идентификаторе 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. Убедитесь, что ключ шифрования существует путем выдачи GET для объекта.

  4. Убедитесь, что объект работает, выполняя задачу, например запрос индекса, зашифрованного.

После создания зашифрованного объекта в службе "Поиска" его можно использовать так же, как любой другой объект его типа. Шифрование прозрачно для пользователя и разработчика.

Ни одна из этих сведений о хранилище ключей не считается секретом и может быть легко извлечена, перейдя на соответствующую страницу Azure Key Vault в портал Azure.

Внимание

Зашифрованное содержимое в поиске ИИ Azure настроено для использования определенного ключа Azure Key Vault с определенной версией. При изменении ключа или версии объект необходимо обновить, чтобы использовать его перед удалением предыдущего. Не удалось сделать это, отрисовывает объект непригодным для использования. Вы не сможете расшифровать содержимое, если ключ потерян.

Шаг 5. Тестирование шифрования

Чтобы проверить работу шифрования, отмените ключ шифрования, запросите индекс (он должен быть неиспользуемым), а затем восстановите ключ шифрования.

Используйте портал Azure для этой задачи.

  1. На странице Azure Key Vault выберите "Ключи объектов>".

  2. Выберите только что созданный ключ и нажмите кнопку "Удалить".

  3. На странице поиска ИИ Azure выберите индексы управления>поиском.

  4. Выберите индекс и используйте обозреватель поиска для выполнения запроса. Вы должны получить ошибку.

  5. Вернитесь на страницу ключей объектов>Azure Key Vault.

  6. Выберите " Управление удаленными ключами".

  7. Выберите ключ и нажмите кнопку "Восстановить".

  8. Вернитесь к индексу в службе "Поиск ИИ Azure" и повторно запустите запрос. Результаты поиска должны отображаться. Если вы не видите немедленные результаты, подождите минуту и повторите попытку.

Настройка политики для принудительного применения соответствия CMK

Политики Azure помогают применять стандарты организации и оценивать соответствие в масштабе. Поиск по искусственному интеллекту Azure имеет необязательную встроенную политику для принудительного применения CMK на уровне службы.

В этом разделе описана политика, которая определяет стандарт CMK для службы поиска. Затем вы настроили службу поиска, чтобы применить эту политику.

  1. Перейдите к встроенной политике в веб-браузере. Выберите Назначить.

    Снимок экрана: назначение встроенной политики CMK.

  2. Настройте область политики. В разделе "Параметры" снимите флажок "Показать только параметры" и задайте значение "Запретить".

    Во время оценки запроса запрос, соответствующий определению политики запрета, помечается как несоответствующий. Если для службы используется стандарт шифрования CMK, "запретить" означает, что запросы, не указывающие шифрование CMK, не соответствуют требованиям.

    Снимок экрана: изменение эффекта встроенной политики CMK для запрета.

  3. Завершите создание политики.

  4. Вызовите службы — обновите API, чтобы включить принудительное применение политик CMK на уровне обслуживания.

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"
        }
    }
}

Смена или обновление ключей шифрования

Мы рекомендуем использовать возможности автоматической обработки Azure Key Vault, но вы также можете повернуть ключи вручную.

При изменении ключа или его версии любой объект, использующий ключ, сначала необходимо обновить, чтобы использовать новые значения перед удалением старых значений. В противном случае объект становится непригодным для использования, так как его нельзя расшифровать.

  1. Определите ключ, используемый индексом или сопоставлением синонимов.

  2. Создайте новый ключ в хранилище ключей, но не удаляйте исходный ключ.

  3. Обновите свойства encryptionKey в индексе или сопоставлении синонимов, указав новые значения. Другие значения могут быть указаны только в объектах, которые изначально были созданы с этим свойством.

  4. Отключите или удалите предыдущий ключ в хранилище ключей. Проконтролируйте доступ к ключу и удостоверьтесь, что используется новый ключ.

По соображениям производительности служба поиска кэширует ключ на несколько часов. Если вы отключите или удалите ключ без предоставления нового, запросы продолжают работать на временной основе до истечения срока действия кэша. Однако после того, как служба поиска больше не сможет расшифровать содержимое, вы получите это сообщение: "Доступ запрещен. Возможно, используемый ключ запросов был отозван. Повторите попытку".

Работа с зашифрованным содержимым

При шифровании ключей, управляемых клиентом, можно заметить задержку как индексирования, так и запросов из-за дополнительной работы шифрования и расшифровки. Поиск по искусственному интеллекту Azure не регистрирует действия шифрования, но вы можете отслеживать доступ к ключам с помощью ведения журнала хранилища ключей.

Рекомендуется включить ведение журнала при настройке хранилища ключей.

  1. Создайте рабочую область Log Analytics.

  2. Добавьте параметр диагностики в хранилище ключей, использующего рабочую область для хранения данных.

  3. Выберите аудит или allLogs для категории, присвойте параметру диагностики имя, а затем сохраните его.

Пример python конфигурации ключа шифрования

В этом разделе показано представление encryptionKey Python в определении объекта. То же определение применяется к индексам, источникам данных, навыкам, индексаторам и сопоставлениям синонимов. Чтобы попробовать этот пример в службе поиска и хранилище ключей, скачайте записную книжку из azure-search-python-samples.

Установите некоторые пакеты.

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

Создайте индекс с ключом шифрования.

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')

Получите определение индекса для проверки наличия конфигурации ключа шифрования.

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}")  

Загрузите индекс с несколькими документами. Все содержимое поля считается конфиденциальным и шифруется на диске с помощью управляемого клиентом ключа.

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)

Выполните запрос, чтобы убедиться, что индекс работает.

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']}")

Выходные данные запроса должны создавать результаты, аналогичные следующему примеру.

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.

Так как зашифрованное содержимое расшифровывается до обновления данных или запросов, вы не увидите визуальные доказательства шифрования. Чтобы проверить работу шифрования, проверьте журналы ресурсов.

Следующие шаги

Если вы не знакомы с архитектурой безопасности Azure, ознакомьтесь с документацией по безопасности Azure и, в частности, этой статьей: