Always Encrypted

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Схема Always Encrypted.

Always Encrypted и 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 с безопасными анклавами.

В этом разделе представлен обзор настройки Always Encrypted. Дополнительные сведения и сведения о начале работы см. в руководстве по началу работы с Always Encrypted.

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

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

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

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

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

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

    Дополнительные сведения об управлении ключами Always Encrypted см. в разделе "Обзор управления ключами для Always Encrypted".

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

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

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

Чтобы выполнить сопоставление шаблонов с помощью операторов сравнения, сортировки и индексирования в зашифрованных столбцах, необходимо применить Always Encrypted с безопасными анклавами и применить случайное шифрование. Случайное шифрование Always Encrypted (без безопасных анклавах) не поддерживает поиск, группирование, индексирование или присоединение к зашифрованным столбцам. Вместо этого для столбцов, предназначенных для поиска или группировки, необходимо использовать детерминированное шифрование. Это позволяет выполнять такие операции, как подстановка точек, соединения равенства, группирование и индексирование в зашифрованных столбцах.

Так как система базы данных не имеет доступа к криптографическим ключам, шифрование столбцов требует перемещения и шифрования данных за пределами базы данных. Это означает, что этот процесс шифрования может занять много времени и уязвим к прерываниям сети. Кроме того, если вам потребуется повторно зашифровать столбец позже, например при смене ключа шифрования или изменении типов шифрования, вы снова столкнетесь с теми же трудностями. Использование Always Encrypted с безопасными анклавами устраняет необходимость перемещения данных из базы данных. Так как анклава является доверенным, клиентский драйвер в приложении или инструмент, например Azure Data Studio или SQL Server Management Studio (SSMS), может безопасно поделиться ключами с анклава во время криптографических операций. Анклав может затем зашифровать или повторно зашифровать столбцы, значительно уменьшая время, необходимое для этих действий.

Подробные сведения об алгоритмах шифрования Always Encrypted см. в разделе Шифрование Always Encrypted.

Описанные выше действия можно выполнить с помощью средств SQL:

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

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

Ограничения

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

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

    Примечание.

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

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

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

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

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

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

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

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

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

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

    Внимание

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

    • Столбцы во внешних таблицах (PolyBase) (примечание: использование внешних таблиц и таблиц с зашифрованными столбцами в одном запросе поддерживается).
  • Следующие функции не работают для зашифрованных столбцов:

    • Репликация SQL Server (репликация транзакций, слиянием или моментальным снимком). Поддерживаются функции физической репликации, включая группу доступности AlwaysOn.
    • Распределенные запросы (связанные серверы, OPENROWSET (Transact-SQL), OPENDATASOURCE (Transact-SQL)).
    • Запросы между базами данных, выполняющие соединения с столбцами, зашифрованными из разных баз данных.

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

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

Выписки

Инструкция DDL Description
СОЗДАНИЕ ГЛАВНОГО КЛЮЧА СТОЛБЦА Создание объекта метаданных главного ключа столбца в базе данных
УДАЛЕНИЕ ГЛАВНОГО КЛЮЧА СТОЛБЦА Удаляет главный ключ шифрования столбца из базы данных.
СОЗДАНИЕ КЛЮЧА ШИФРОВАНИЯ СТОЛБЦА Создает объект метаданных ключа шифрования столбца.
ALTER COLUMN ENCRYPTION KEY Изменяет ключ шифрования столбца в базе данных, добавляя или удаляя зашифрованное значение.
УДАЛЕНИЕ КЛЮЧА ШИФРОВАНИЯ СТОЛБЦА Удаляет ключ шифрования столбца из базы данных.
CREATE TABLE (ENCRYPTED WITH) Указывает зашифрованные столбцы

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

Представления и хранимые процедуры системного каталога Description
sys.column_encryption_keys Возвращает сведения о ключах шифрования столбцов (CEKs)
sys.column_encryption_key_values Возвращает сведения о зашифрованных значениях ключей шифрования столбцов (CEKs)
sys.column_master_keys Возвращает строку для каждого главного ключа базы данных
sp_refresh_parameter_encryption Обновляет метаданные Always Encrypted для параметров указанной не привязанной к схеме хранимой процедуры, определяемой пользователем функции, представления, триггера DML, триггера DDL уровня базы данных или триггера DDL уровня сервера
sp_describe_parameter_encryption Анализирует указанную инструкцию Transact-SQL и ее параметры, чтобы определить, какие параметры соответствуют столбцам базы данных, защищенным с помощью функции Always Encrypted.

Также см. сведения о метаданных шифрования, хранящихся для каждого столбца, см . в sys.columns .

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

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

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

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

Сценарий ALTER ANY COLUMN MASTER KEY ALTER ANY COLUMN ENCRYPTION KEY ПРОСМОТР ОПРЕДЕЛЕНИЯ ГЛАВНОГО КЛЮЧА СТОЛБЦА ПРОСМОТР ОПРЕДЕЛЕНИЯ КЛЮЧА ШИФРОВАНИЯ СТОЛБЦА
Управление ключами (создание, изменение или просмотр метаданных ключа в базе данных) 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 .

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