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


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

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

Ключи можно хранить с помощью Azure Key Vault или Azure Key Vault Managed HSM (аппаратного модуля безопасности). Управляемый модуль HSM в Azure Key Vault — это проверенный модуль HSM FIPS 140-2 уровня 3. Поддержка HSM является новой в Службе поиска ИИ Azure. Чтобы перейти на HSM, измените ключи и выберите управляемый HSM для хранилища.

Внимание

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

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

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

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

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

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

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

Если требуется CMK в службе поиска, задайте политику применения.

Предварительные условия

  • Поиск по искусственному интеллекту Azure на оплачиваемом уровне (базовый или более высокий) в любом регионе.

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

  • Возможность настройки разрешений для доступа к ключам и назначения ролей. Чтобы создать ключи, необходимо быть специалистом по шифрованию Key Vault в Azure Key Vault или специалистом по управляемому шифрованию HSM в Управляемом HSM Azure Key Vault.

    Чтобы назначить роли, необходимо быть владельцем подписки, администратором доступа пользователей, администратором управления доступом на основе ролей или назначить настраиваемую роль с разрешениями Microsoft.Authorization/roleAssignments/write .

Шаг 1. Создание ключа шифрования

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

Перед началом работы рекомендуется ознакомиться с этими советами .

Обязательные операции: оболочка, распаковка, шифрование и расшифровка.

Вы можете создать хранилище ключей с помощью портал Azure, Azure CLI или Azure PowerShell.

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

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

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

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

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

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

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

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

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

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

Мы рекомендуем использовать управляемую идентификацию и роли. Вы можете использовать управляемое системой удостоверение или управляемое пользователем удостоверение. Управляемое удостоверение позволяет службе поиска проходить проверку подлинности с помощью идентификатора Microsoft Entra, не сохраняя учетные данные (ApplicationID или ApplicationSecret) в коде. Жизненный цикл этого типа управляемого удостоверения привязан к жизненному циклу службы поиска, который может иметь только одно управляемое удостоверение, назначаемое системой. Дополнительные сведения о работе управляемых удостоверений см. в статье Что такое управляемые удостоверения для ресурсов Azure?

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

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

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

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

Контроль доступа на основе ролей рекомендуется вместо модели разрешений политики доступа. Для получения дополнительных сведений или шагов миграции начните с управления доступом на основе ролей Azure (Azure RBAC) и политиками доступа (устаревшими версиями).

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

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

  3. Выберите роль:

    • В Azure Key Vault выберите пользователя шифрования службы Key Vault Crypto.
    • В управляемой HSM выберите пользователя шифрования службы криптошифрования.
  4. Выберите управляемые удостоверения, выберите участников и выберите управляемое удостоверение службы поиска. Если вы тестируете локально, назначьте эту роль себе, а также.

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

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

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

Шифрование происходит при создании или обновлении объекта. Портал Azure можно использовать для выбранных объектов. Для любого объекта используйте REST API поиска или пакет SDK Azure. Ознакомьтесь с примером Python в этой статье, чтобы узнать, как содержимое шифруется программным способом.

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

  • Индексы
  • Источники данных
  • Индексаторы

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

В портале Azure наборы навыков определяются в виде JSON. Используйте JSON, показанный в примерах REST API, чтобы использовать ключ, управляемый клиентом, в контексте набора навыков.

  1. Войдите на портал Azure и откройте страницу службы поиска.

  2. В разделе "Управление поиском" выберите индексы, индексаторы или источники данных.

  3. Добавьте новый объект. В определении объекта выберите управляемое корпорацией Майкрософт шифрование.

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

Снимок экрана страницы ключа шифрования на портале Azure.

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

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

Используйте портал Azure для этой задачи. Убедитесь, что у вас есть назначение роли, которое предоставляет доступ на чтение к ключу.

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

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

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

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

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

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

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

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

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

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

Эффект Эффект, если включен
AuditIfNotExists Проверяет соответствие политике: у объектов определен ключ, управляемый клиентом, и содержимое зашифровано. Этот эффект применяется к существующим службам с содержимым. Он вычисляется каждый раз при создании или обновлении объекта или в соответствии с расписанием оценки. Подробнее...
Отрицать Проверяет применение политик: имеет ли служба поиска значение SearchEncryptionWithCmkEnabled. Этот эффект применяется только к новым службам, которые должны быть созданы с включенным шифрованием. Существующие службы остаются операционными, но их нельзя обновить, если только вы не исправите эту службу. Ни один из средств, используемых для подготовки служб, не предоставляет это свойство, поэтому следует учитывать, что настройка политики ограничивает настройку программными средствами.

Назначить политику

  1. На портале Azure перейдите к встроенной политике и нажмите кнопку "Назначить".

    Ниже приведен пример политики AuditIfExists на портале Azure:

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

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

  3. Примите или измените значения по умолчанию. Выберите "Проверить +создать", а затем создать.

Включение принудительного применения политик CMK

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

Создание соответствующей службы поиска

Для новых служб поиска создайте их с параметром SearchEncryptionWithCmk, установленным в Enabled.

Ни портал Azure, ни средства командной строки (Azure CLI и Azure PowerShell) изначально не предоставляют это свойство, но вы можете использовать REST API управления для подготовки службы поиска с определением политики CMK.

В этом примере используется служба "Управление службой поиска ИИ Azure с помощью REST API", измененная для включения свойства SearchEncryptionWithCmk .

### Create a search service (provide an existing resource group)
@resource-group = my-rg
@search-service-name = my-search
PUT https://management.azure.com/subscriptions/{{subscriptionId}}/resourceGroups/{{resource-group}}/providers/Microsoft.Search/searchServices/{{search-service-name}}?api-version=2023-11-01 HTTP/1.1
     Content-type: application/json
     Authorization: Bearer {{token}}

    {
        "location": "North Central US",
        "sku": {
            "name": "basic"
        },
        "properties": {
            "replicaCount": 1,
            "partitionCount": 1,
            "hostingMode": "default",
            "encryptionWithCmk": {
                "enforcement": "Enabled"
        }
      }
    }

Обновление существующей службы поиска

Для существующих служб поиска, которые теперь не соответствуют требованиям, исправьте их с помощью служб — обновление API или команды Azure CLI az resource update . Исправление служб восстанавливает возможность обновления свойств службы поиска.

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 в модель безопасности оборудования (HSM).

Для ротации ключей рекомендуется использовать возможности автоматической ротации Azure Key Vault. Если вы используете автоповорот, не указывайте версию ключа в определениях объектов. Используется последний ключ, а не определенная версия.

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

Помните, что ключи кэшируются в течение 60 минут. Помните это при тестировании и ротации ключей.

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

  2. Создайте новый ключ в хранилище ключей, но не удаляйте исходный ключ. На этом шаге можно перейти из хранилища ключей в HSM.

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

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

По соображениям производительности служба поиска кэширует ключ на несколько часов. Если вы отключите или удалите ключ без предоставления нового, запросы продолжают работать на временной основе до истечения срока действия кэша. Однако после того как служба поиска больше не сможет расшифровать содержимое, вы получите следующее сообщение: "Access forbidden. The query key used might have been revoked - please retry."

Советы по Key Vault

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

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

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

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

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

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

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

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

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

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

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

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

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

В этом разделе показано Python-представление encryptionKey в определении объекта. То же определение применяется к индексам, источникам данных, навыкам, индексаторам и сопоставлениям синонимов. Чтобы попробовать этот пример в службе поиска и хранилище ключей, скачайте записную книжку из 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 Palace 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 Palace 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 и, в частности, этой статьей: