Always Encrypted

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Diagram of 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 в базе данных, необходимо выполнить следующие действия.

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

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

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

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

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

    Наконец, необходимо сохранить метаданные о ключах в базе данных.

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

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

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

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

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

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

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

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

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

Примечание.

Always Encrypted с безопасными анклавами поднимает некоторые из указанных выше ограничений, позволяя криптографическим операциям с существующими данными с помощью T-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.
    • Вставка литерала в зашифрованные столбцы.

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

    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, user-defined types.
    • Столбцы FILESTREAM
    • Столбцы со свойством IDENTITY .
    • Столбцы со свойством ROWGUIDCOL .
    • Столбцы строк (varchar, char и т. д.) с параметрами сортировки, отличные от параметров сортировки точек двоичного кода (_BIN2) при использовании детерминированного шифрования.
    • Столбцы, которые являются ключами для кластеризованных и некластеризованных индексов при использовании случайного шифрования (индексы для столбцов с использованием детерминированного шифрования поддерживаются).
    • Столбцы, включенные в полнотекстовые индексы (Always Encrypted не поддерживает полнотекстовый поиск).
    • Вычисляемые столбцы.
    • Столбцы, на которые ссылаются вычисляемые столбцы (если выражение выполняет неподдерживаемые операции для постоянного шифрования).
    • Разреженный набор столбцов.
    • Столбцы, на которые ссылается статистика при использовании случайного шифрования (детерминированное шифрование поддерживается).
    • Секционирование столбцов.
    • Столбцы с ограничениями по умолчанию.
    • Столбцы, на которые ссылаются уникальные ограничения при использовании случайного шифрования (детерминированное шифрование поддерживается).
    • Столбцы первичного ключа при использовании случайного шифрования (детерминированное шифрование поддерживается).
    • Ссылки на столбцы в ограничениях внешнего ключа при использовании случайного шифрования или при использовании детерминированного шифрования, если ссылки и ссылки на столбцы используют разные ключи или алгоритмы.
    • Столбцы, на которые ссылаются ограничения проверка.
    • Столбцы, записанные или отслеживаемые с помощью отслеживания измененных данных.
    • Столбцы первичного ключа в таблицах с отслеживанием изменений.
    • Столбцы, которые маскируются (с помощью динамического маскирования данных).
    • Столбцы в таблицах растянутой базы данных. (Таблицы со столбцами, использующими постоянное шифрование, можно включить для базы данных Stretch.)

    Важно!

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

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

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

Справочник по 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 — требуется для доступа и чтения метаданных главного ключа столбца, необходимых для запроса зашифрованных столбцов.

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

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

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

См. также