Рекомендации по использованию функции Always Encrypted для Базы данных SQL Azure

Завершено

Always Encrypted — это функция, предназначенная для защиты конфиденциальных данных, таких как номера кредитных карт или национальные или региональные идентификационные номера (например, номера социального страхования США), хранящиеся в Базе данных SQL Azure, Управляемом экземпляре SQL Azure и базах данных SQL Server. Always Encrypted позволяет клиентам шифровать конфиденциальные данные в клиентских приложениях и никогда не раскрывать ключи шифрования ядра СУБД. Always Encrypted обеспечивает разделение между теми, кто владеет данными и может просматривать их, и тех, кто управляет данными, но не должен иметь доступа — локальные администраторы базы данных, операторы облачной базы данных или другие пользователи с высоким уровнем привилегий. В результате Always Encrypted позволяет клиентам уверенно хранить конфиденциальные данные в облаке и снизить вероятность кражи данных злоумышленниками.

Always Encrypted можно настроить для поддержки ограниченных конфиденциальных запросов для зашифрованных данных, запросов, связанных с сравнением равенства. Например, точечные запросы или соединения по равенству. Такие запросы используют детерминированное шифрование.

Схема, показывающая пример всегда зашифрованной базы данных.

Замечание

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

Always Encrypted делает шифрование прозрачным для приложений. Драйвер с поддержкой Always Encrypted, установленный на клиентском компьютере, автоматически шифрует конфиденциальные данные в клиентском приложении и расшифровывает их. Драйвер шифрует данные в конфиденциальных столбцах перед передачей данных в ядро СУБД. Затем драйвер автоматически перезаписывает запросы, чтобы семантика приложения сохранялась. Аналогичным образом драйвер прозрачно расшифровывает данные, хранящиеся в зашифрованных столбцах базы данных, содержащихся в результатах запроса.

Настройка Always Encrypted

Чтобы настроить Always Encrypted в базе данных, необходимо выполнить следующие действия.

  1. Разверните криптографические ключи для защиты данных. Технологии постоянного шифрования используют два типа ключей:

    • Ключи шифрования столбцов.
    • Главные ключи столбцов.

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

    • Метаданные главного ключа столбца отражают расположение главного ключа столбца.
    • Метаданные ключа шифрования столбца содержат зашифрованное значение ключа шифрования столбца. Ядро СУБД никогда не хранит или не использует ключи любого типа в виде открытого текста.
  2. Настройте шифрование для выбранных столбцов базы данных, содержащих конфиденциальные данные, которые должны быть защищены. Можно создать новые таблицы с зашифрованными столбцами или зашифровать существующие столбцы базы данных и существующие данные. При настройке шифрования для столбца необходимо указать сведения о алгоритме шифрования, ключ шифрования столбца для защиты данных в столбце и тип шифрования. Always Encrypted поддерживает два типа шифрования:

    • Детерминированное шифрование всегда создает то же зашифрованное значение для заданного значения открытого текста. Использование детерминированного шифрования позволяет выполнять поисковые запросы по точкам, соединения на основе равенства, группировку и индексирование на зашифрованных столбцах. Однако он также может позволить несанкционированным пользователям угадать информацию о зашифрованных значениях, проверив шаблоны в зашифрованном столбце, особенно если существует небольшой набор возможных зашифрованных значений, таких как True/False, или Север/Юго-Восток/Западная область.
    • Случайное шифрование использует метод, который шифрует данные менее предсказуемым образом. Случайное шифрование более безопасно, но предотвращает поиск, группировку, индексирование и присоединение к зашифрованным столбцам.

    Используйте детерминированное шифрование для столбцов, используемых в качестве параметров поиска или группировки. Например, номер идентификатора правительства. Используйте случайное шифрование для таких данных, как комментарии к конфиденциальным исследованиям, которые не группируются с другими записями и не используются для объединения таблиц. Дополнительные сведения о алгоритмах шифрования Always Encrypted см. в статье Always Encrypted cryptography. Описанные выше действия можно выполнить с помощью средств SQL:

    Чтобы ключи Always Encrypted и защищенные конфиденциальные данные никогда не отображались в виде открытого текста в среде базы данных, ядро СУБД не могут участвовать в подготовке ключей и шифровании данных или операциях расшифровки. Поэтому Transact-SQL (T-SQL) не поддерживают подготовку ключей или криптографические операции. По той же причине необходимо выполнить шифрование существующих данных или повторное шифрование данных (с другим типом шифрования или ключом шифрования столбца) за пределами базы данных (средства SQL могут автоматизировать это).

Как работают запросы к зашифрованным столбцам

Необходимо выполнить набор необходимых компонентов, если пользователю необходимо выполнить одно из следующих действий:

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

Пользователь или приложение, выдавающее запрос, должно соответствовать следующим предварительным требованиям:

  • Получите доступ к основному ключу столбца, который защищает данные. Доступ к ключу необходим в дополнение к разрешениям на уровне базы данных, например SELECT в таблице, содержащей данные.
  • Подключитесь к базе данных с включенной функцией Always Encrypted в подключении к базе данных. Большинство средств SQL и клиентских драйверов SQL поддерживают включение Always Encrypted для подключений к базе данных.

Замечание

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

Вот как работают запросы к зашифрованным столбцам:

  1. Когда приложение выдает параметризованный запрос, драйвер клиента SQL в приложении прозрачно связывается с ядром СУБД (вызывая sp_describe_parameter_encryption (Transact-SQL) для определения целевых параметров зашифрованных столбцов и их шифрования. Для каждого параметра, необходимого для шифрования, драйвер получает алгоритм шифрования, тип шифрования и метаданные ключа, включая ключ шифрования зашифрованных столбцов и расположение соответствующего главного ключа столбца.
  2. Драйвер вызывает хранилище ключей, содержащее главные ключи столбцов для расшифровки значений ключа шифрования зашифрованного столбца. Результирующий ключ шифрования столбцов в открытом виде кэшируется для уменьшения количества циклов обхода в хранилище ключей при последующих использованиях одного и того же ключа шифрования столбцов.
  3. Драйвер использует полученные ключи шифрования столбцов обычного текста для шифрования параметров запроса, соответствующих зашифрованным столбцам.
  4. Драйвер заменяет значения открытого текста параметров, предназначенных для зашифрованных столбцов своими зашифрованными значениями, и отправляет запрос в ядро СУБД для обработки.
  5. Ядро СУБД выполняет запрос, который может включать сравнения равенства по столбцам с помощью детерминированного шифрования.
  6. Если результаты запроса включают данные из зашифрованных столбцов, ядро СУБД присоединяет метаданные шифрования для каждого столбца, включая сведения о алгоритме шифрования, типе шифрования и метаданных ключа в результирующем наборе.
  7. Ядро СУБД отправляет результирующий набор клиентскому приложению.
  8. Для каждого зашифрованного столбца в полученном результирующем наборе драйвер сначала пытается найти ключ шифрования столбца открытого текста в локальном кэше, и только отправляется в хранилище ключей, включающем главный ключ столбца, если он не может найти ключ в кэше.
  9. Драйвер расшифровывает результаты и возвращает значения открытого текста приложению.

Драйвер клиента взаимодействует с хранилищем ключей, содержащим главный ключ столбца, с помощью поставщика хранилища главных ключей столбцов, который является программным компонентом на стороне клиента, инкапсулирующего хранилище ключей с главным ключом столбца. Поставщики для распространенных типов хранилищ ключей доступны в клиентских библиотеках драйверов от Корпорации Майкрософт или как автономные загрузки. Вы также можете реализовать собственный поставщик. Возможности Always Encrypted, включая встроенные поставщики хранилища главных ключей столбцов, зависят от библиотеки драйверов и ее версии.

Сведения о разработке приложений с помощью Always Encrypted см. в разделе "Разработка приложений с помощью Always Encrypted" для списка клиентских драйверов, поддерживающих Always Encrypted, и сведения о том, как разрабатывать приложения, запрашивающие зашифрованные столбцы.

Вы также можете запрашивать зашифрованные столбцы с помощью средств SQL, например Azure Data Studio или SSMS.

Ограничения

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

  • Детерминированное шифрование поддерживает следующие операции, связанные с сравнением равенства. Другие операции не разрешены.

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

Замечание

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

  • Операторы запросов, которые активируют вычисления, связанные как с открытым текстом, так и зашифрованными данными, не допускаются. Рассмотрим пример.

    • Сравнение зашифрованного столбца с столбцом обычного текста или литерала.
    • Копирование данных из столбца обычного текста в зашифрованный столбец (или наоборот) UPDATE, BULK INSERT, SELECT INTO или INSERT.. SELECT.
    • Вставка литерала в зашифрованные столбцы.

Такие операторы приводят к ошибкам столкновения операнда следующим образом:

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












  • Приложения должны использовать параметры запроса для передачи значений, соответствующих зашифрованным столбцам. Например, при вставке данных в зашифрованные столбцы или фильтрации по зашифрованным столбцам (при использовании детерминированного шифрования). Передача литералов или переменных T-SQL, соответствующих зашифрованным столбцам, не поддерживается. Дополнительные сведения о используемом драйвере клиента см. в статье "Разработка приложений с помощью Always Encrypted".

  • Необходимо использовать параметризацию для переменных Always Encrypted в Azure Data Studio или SSMS для выдачи запросов, которые передают значения, соответствующие зашифрованным столбцам в этих средствах. Например, при вставке данных в зашифрованные столбцы или фильтрации по зашифрованным столбцам (при использовании детерминированного шифрования).

  • Параметры с табличным значением, предназначенные для зашифрованных столбцов, не поддерживаются.

  • Запросы, использующие следующие предложения, не поддерживаются:

  • После изменения определения зашифрованного столбца выполните sp_refresh_parameter_encryption , чтобы обновить метаданные Always Encrypted для объекта.

  • Always Encrypted не поддерживается для столбцов со следующими характеристиками:

    • Столбцы, использующие один из следующих типов данных: xml, timestamp, rowversion, image, ntext, text, sql_variant, hierarchyid, geography, geometry, alias, определенные пользователем типы.
    • Столбцы FILESTREAM
    • Столбцы со свойством IDENTITY
    • Столбцы с атрибутом ROWGUIDCOL.
    • Столбцы строк (varchar, char и т. д.) с параметрами сортировки, отличные от параметров сортировки точки двоичного кода (_BIN2) при использовании детерминированного шифрования.
    • Столбцы, которые являются ключами для кластеризованных и некластеризованных индексов при использовании случайного шифрования (индексы для столбцов с использованием детерминированного шифрования поддерживаются).
    • Столбцы, включенные в полнотекстовые индексы (Always Encrypted не поддерживает полнотекстовый поиск).
    • Вычисляемые столбцы.
    • Столбцы, на которые ссылаются вычисляемые столбцы (если выражение выполняет неподдерживаемые операции для постоянного шифрования).
    • Разреженный набор столбцов.
    • Столбцы, на которые ссылается статистика при использовании случайного шифрования (поддерживается детерминированное шифрование).
    • Секционирование столбцов.
    • Столбцы с ограничениями по умолчанию.
    • Столбцы, на которые ссылаются уникальные ограничения при использовании случайного шифрования (детерминированное шифрование поддерживается).
    • Столбцы первичного ключа при использовании случайного шифрования (детерминированное шифрование поддерживается).
    • Ссылки на столбцы в ограничениях внешнего ключа при использовании случайного шифрования или при использовании детерминированного шифрования, если ссылки и ссылки на столбцы используют разные ключи или алгоритмы.
    • Столбцы, на которые ссылаются ограничения проверки.
    • Столбцы, записанные или отслеживаемые с помощью отслеживания измененных данных.
    • Столбцы первичного ключа в таблицах с отслеживанием изменений.
    • Столбцы, которые маскируются (с помощью динамического маскирования данных).
    • Столбцы в таблицах растянутой базы данных. (Таблицы со столбцами, использующими постоянное шифрование, можно включить для базы данных Stretch.)

Это важно

Stretch Database считается устаревшим в SQL Server 2022 (16.x) и Azure SQL Database. Эту функцию планируется удалить в будущих версиях ядра СУБД. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.

Справочник по Always Encrypted Transact-SQL

Always Encrypted использует следующие инструкции Transact-SQL, представления системного каталога, системные хранимые процедуры и разрешения.

Заявления

Представления и хранимые процедуры системного каталога

Дополнительные сведения о метаданных шифрования, хранящихся для каждого столбца, см. в sys.columns (Transact-SQL).

Разрешения базы данных

Существует четыре разрешения базы данных для Always Encrypted:

  • ALTER ANY COLUMN MASTER KEY — необходимо для создания и удаления метаданных мастер-ключа столбца.
  • ALTER ANY COLUMN ENCRYPTION KEY — требуется для создания и удаления метаданных ключа шифрования столбцов.
  • VIEW ANY COLUMN MASTER KEY DEFINITION — требуется для доступа и чтения метаданных мастер-ключа столбца, которые необходимы для выполнения запросов к зашифрованным столбцам.
  • VIEW ANY COLUMN ENCRYPTION KEY DEFINITION — необходимо для доступа и чтения метаданных мастер-ключа столбца, что требуется для выполнения запросов к зашифрованным столбцам.

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

Сценарий ИЗМЕНИТЬ ЛЮБОЙ КЛЮЧ МАСТЕРА СТОЛБЦА ИЗМЕНИТЬ ЛЮБОЙ КЛЮЧ ШИФРОВАНИЯ СТОЛБЦА ПРОСМОТР ОПРЕДЕЛЕНИЯ КЛЮЧА ГЛАВНОЙ КОЛОНКИ ПРОСМОТР ОПРЕДЕЛЕНИЯ КЛЮЧА ШИФРОВАНИЯ ЛЮБОГО СТОЛБЦА
Управление ключами (создание, изменение или просмотр метаданных ключа в базе данных) X X X X
Отправка запросов в зашифрованные столбцы X X

Важные замечания

  • Разрешения VIEW ANY COLUMN MASTER KEY DEFINITION и VIEW ANY COLUMN ENCRYPTION KEY DEFINITION требуются для выбора зашифрованных столбцов, даже если у пользователя нет доступа к главным ключам столбцов (в хранилищах ключей). Эти разрешения защищают столбцы и предотвращают доступ к открытым данным.
  • В SQL Server разрешения VIEW ANY COLUMN MASTER KEY DEFINITION и VIEW ANY COLUMN ENCRYPTION KEY DEFINITION предоставляются по умолчанию роли общедоступной фиксированной базы данных. Администратор базы данных может отменить (или запретить) разрешения на общедоступную роль и предоставить им определенные роли или пользователи для реализации более ограниченного контроля.
  • В базе данных SQL разрешения VIEW ANY COLUMN MASTER KEY DEFINITION и VIEW ANY COLUMN ENCRYPTION KEY DEFINITION не предоставляются по умолчанию роли общедоступной фиксированной базы данных. Это позволяет некоторым существующим устаревшим средствам (с использованием старых версий DacFx) работать правильно. Чтобы работать с зашифрованными столбцами (даже если они не расшифровываются), администратор базы данных должен явно предоставить разрешения VIEW ANY COLUMN MASTER KEY DEFINITION и VIEW ANY COLUMN ENCRYPTION KEY DEFINITION.