Always Encrypted

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

Always Encrypted

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

Always Encrypted предоставляет возможности конфиденциальных вычислений, позволяя Компонент Database Engine обрабатывать некоторые запросы к зашифрованным данным, при этом сохраняя конфиденциальность данных и предоставляя указанные выше преимущества безопасности. В SQL Server 2016 (13.x);, SQL Server 2017 (14.x); и База данных SQL Azure Always Encrypted поддерживает сравнение на равенство через детерминированное шифрование. См. раздел Выбор детерминированного или случайного шифрования.

Примечание

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

Постоянное шифрование делает шифрование прозрачным для приложений. Драйвер с поддержкой постоянного шифрования, установленный на клиентском компьютере, реализует это за счет автоматического шифрования и расшифровки конфиденциальных данных в клиентском приложении. Драйвер шифрует данные из конфиденциальных столбцов перед их передачей в Компонент Database Engineи автоматически переписывает запросы, чтобы сохранить семантику приложения. Аналогичным образом драйвер прозрачно расшифровывает данные, которые хранятся в зашифрованных столбцах базы данных в результатах запроса.

Always Encrypted доступен во всех выпусках База данных SQL Azure, начиная с SQL Server 2016 (13.x);, и всех уровней служб База данных SQL. (До версии SQL Server 2016 (13.x); SP1 шифрование Always Encrypted было ограничено выпуском Enterprise Edition.) Презентацию с описанием постоянного шифрования на канале 9 см. на странице Безопасное хранение конфиденциальных данных с помощью постоянного шифрования.

Типичные сценарии

Клиент и данные в локальной среде

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

Клиент в локальной среде, а данные в Azure

У клиента есть локальное клиентское приложение, развернутое на предприятии. Приложение работает с конфиденциальными данными, хранящимися в базе данных, которая размещена в Azure (База данных SQL или SQL Server , выполняемом на виртуальной машине в Microsoft Azure). Клиент использует постоянное шифрование и хранит ключи в локальном доверенном хранилище ключей, чтобы у администраторов облака Microsoft не было доступа к конфиденциальным данным.

Клиент и данные в Azure

У клиента есть клиентское приложение, размещенное в Microsoft Azure (например, рабочая роль или веб-роль), которое работает с конфиденциальными данными, хранящимися в базе данных, размещенной в Azure (базе данных SQL или SQL Server в виртуальной машине Microsoft Azure). Несмотря на то, что Always Encrypted не обеспечивает полной изоляции данных от облачных администраторов, поскольку и данные, и ключи доступны администраторам облака на платформе, где размещен клиентский уровень, клиент все равно извлекает преимущества из уменьшения площади поверхности атак на систему безопасности (данные в базе данных всегда зашифрованы).

Принцип работы

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

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

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

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

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

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

Дополнительные сведения о разработке приложений с помощью Always Encrypted с определенными клиентскими драйверами см. в разделе Разработка приложений с помощью Always Encrypted.

Remarks

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

  • копирование данных из одного столбца в другой с помощью операций UPDATE, BULK INSERT(T-SQL), SELECT INTO, INSERT..SELECT;
  • триггеры, темпоральные таблицы, разреженные столбцы, полнотекстовые запросы, выполняющаяся в памяти OLTP и отслеживание измененных данных (CDC).

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

update dbo.Patients set testssn = SSN

Если SSN — столбец с шифрованием Always Encrypted, инструкция "update", приведенная выше, не сработает и выдаст следующую ошибку:

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

Чтобы обновить столбец, сделайте следующее.

  1. Выберите (SELECT) данные в столбце SSN и сохраните их в приложении как результирующий набор. Это позволит приложению (драйвер клиента) расшифровать столбец.
  2. Вставьте (INSERT) данные из результирующего набора в SQL Server.

Важно!

В этом сценарии при обратной отправке на сервер данные будут расшифрованы, так как целевой столбец имеет обычный тип "varchar" и не принимает зашифрованные данные.

Выбор детерминированного или случайного шифрования

Database Engine никогда не работает с данными в виде обычного текста, хранимыми в зашифрованных столбцах, но поддерживает определенные запросы, адресованные зашифрованным данным, в зависимости от типа шифрования для столбца. Постоянное шифрование поддерживает два типа шифрования: случайное и детерминированное.

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

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

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

Настройка постоянного шифрования

Первоначальная настройка постоянного шифрования в базе данных подразумевает создание ключей постоянного шифрования и метаданных этих ключей, настройку свойств шифрования столбцов выбранной базы данных и (или) шифрование данных, которые, возможно, уже существуют в столбцах, которые требуется зашифровать. Обратите внимание, что некоторые из этих задач не поддерживаются в Transact-SQL и требуют использования клиентских средств. Поскольку ключи постоянного шифрования и защищенные конфиденциальные данные никогда не открываются серверу в виде обычного текста, Database Engine невозможно использовать для подготовки ключей и шифрования или расшифровки данных. Для выполнения этих задач можно использовать SQL Server Management Studio или PowerShell.

Задача SSMS PowerShell T-SQL
Подготовка главных ключей столбца, ключей шифрования столбцов и ключей шифрования зашифрованных столбцов с соответствующими главными ключами столбца. Да Да нет
Создание ключа метаданных в базе данных. Да Да Да
Создание новых таблиц с зашифрованными столбцами Да Да Да
Шифрование существующих данных в выбранных столбцах базы данных Да Да нет

Примечание

Always Encrypted с безопасными анклавами, представленными в SQL Server 2019 (15.x), поддерживает шифрование существующих данных с помощью Transact-SQL. Это также избавляет от необходимости перемещать данные за пределы базы данных для выполнения криптографических операций.

Примечание

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

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

Приступая к работе с постоянным шифрованием

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

Примечание

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

  1. Подключитесь к существующей базе данных, которая содержит таблицы со столбцами, которые требуется зашифровать, с помощью обозревателя объектов в составе Management Studio или создайте новую базу данных, одну или несколько таблиц со столбцами, которые необходимо зашифровать, и подключитесь к ней.
  2. Щелкните правой кнопкой мыши базу данных, наведите курсор на пункт Задачи, а затем щелкните Зашифровать столбцы, чтобы открыть мастер Always Encrypted.
  3. Прочитайте страницу Введение , а затем нажмите кнопку Далее.
  4. На странице Выбор столбцов разверните таблицы и выберите столбцы, которые необходимо зашифровать.
  5. В каждом шифруемом столбце для параметра Тип шифрования выберите значение Детерминированное или Случайное.
  6. Для каждого столбца, выбранного для шифрования, выберите ключ шифрования. Если вам раньше не приходилось создавать ключи шифрования для этой базы данных, выберите параметр по умолчанию для автоматического создания ключа и нажмите Далее.
  7. На странице Конфигурация главного ключа выберите расположение для сохранения нового ключа и источник главного ключа, а затем нажмите кнопку Далее.
  8. На странице Проверка выберите, требуется ли немедленно запустить сценарий, или создайте сценарий PowerShell и нажмите кнопку Далее.
  9. На странице Сводка просмотрите выбранные параметры и нажмите кнопку Готово. Закройте мастер после завершения.

Сведения о возможностях

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

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

Примечание

Always Encrypted с безопасными анклавами, представленными в SQL Server 2019 (15.x), устраняет описанное выше ограничение, включая сопоставление шаблонов, операторы сравнения и индексирование столбцов с использованием случайного шифрования.

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

  • Для детерминированного шифрования к столбцу необходимо применять один из параметров сортировки binary2.

  • После изменения определения для зашифрованного объекта выполнение процедуру sp_refresh_parameter_encryption для обновления метаданных постоянного шифрования.

Always Encrypted не поддерживается для столбцов с указанными ниже характеристиками. Например, если какое-либо из следующих условий применяется к столбцу, предложение ENCRYPTED WITH нельзя использовать в CREATE TABLE/ALTER TABLE для столбца:

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

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

  • FOR XML
  • FOR JSON PATH

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

  • транзакции, слияние или репликация моментальных снимков;
  • распределенные запросы (связанные серверы, OPENROWSET(T-SQL), OPENDATASOURCE(T-SQL)).

Требования к средствам

  • Рекомендуется SQL Server Management Studio версии 18 или более поздних версий для выполнения запросов, которые расшифровывают результаты, полученные из зашифрованных столбцов, или операций вставки, обновления или фильтрации для зашифрованных столбцов.
  • Требуется sqlcmd версии 13.1 или более поздней, который доступен в Центре загрузки.

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

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

  • 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 VIEW ANY COLUMN MASTER KEY DEFINITION VIEW ANY COLUMN ENCRYPTION KEY DEFINITION
Управление ключами (создание, изменение или просмотр метаданных ключа в базе данных) X X X X
Отправка запросов в зашифрованные столбцы X X

Важные примечания.

  • Разрешения распространяются на действия, которые выполняются с использованием Transact-SQL, Среда Management Studio (диалоговые окна и мастер) или PowerShell.

  • Два разрешения VIEW требуются при выборе зашифрованных столбцов, даже если у пользователя нет разрешения на расшифровку столбцов.

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

  • В База данных SQL разрешения VIEW не предоставляются по умолчанию для фиксированной роли базы данных public. Благодаря этому некоторые существующие (устаревшие) инструменты, в работе которых используются более старые версии DacFx, функционируют нормально. Следовательно, для работы с зашифрованными столбцами (даже если не расшифровывать их) администратор базы данных должен явно предоставить два разрешения VIEW .

Пример

Следующая операция Transact-SQL создает метаданные главного ключа столбца, метаданные ключа шифрования столбца и таблицу с зашифрованными столбцами. Сведения о создании ключей, на которые ссылаются метаданные, см. в следующих разделах.

CREATE COLUMN MASTER KEY MyCMK  
WITH (  
     KEY_STORE_PROVIDER_NAME = 'MSSQL_CERTIFICATE_STORE',   
     KEY_PATH = 'Current User/Personal/f2260f28d909d21c642a3d8e0b45a830e79a1420'  
   );  
---------------------------------------------  
CREATE COLUMN ENCRYPTION KEY MyCEK   
WITH VALUES  
(  
    COLUMN_MASTER_KEY = MyCMK,   
    ALGORITHM = 'RSA_OAEP',   
    ENCRYPTED_VALUE = 0x01700000016C006F00630061006C006D0061006300680069006E0065002F006D0079002F003200660061006600640038003100320031003400340034006500620031006100320065003000360039003300340038006100350064003400300032003300380065006600620063006300610031006300284FC4316518CF3328A6D9304F65DD2CE387B79D95D077B4156E9ED8683FC0E09FA848275C685373228762B02DF2522AFF6D661782607B4A2275F2F922A5324B392C9D498E4ECFC61B79F0553EE8FB2E5A8635C4DBC0224D5A7F1B136C182DCDE32A00451F1A7AC6B4492067FD0FAC7D3D6F4AB7FC0E86614455DBB2AB37013E0A5B8B5089B180CA36D8B06CDB15E95A7D06E25AACB645D42C85B0B7EA2962BD3080B9A7CDB805C6279FE7DD6941E7EA4C2139E0D4101D8D7891076E70D433A214E82D9030CF1F40C503103075DEEB3D64537D15D244F503C2750CF940B71967F51095BFA51A85D2F764C78704CAB6F015EA87753355367C5C9F66E465C0C66BADEDFDF76FB7E5C21A0D89A2FCCA8595471F8918B1387E055FA0B816E74201CD5C50129D29C015895CD073925B6EA87CAF4A4FAF018C06A3856F5DFB724F42807543F777D82B809232B465D983E6F19DFB572BEA7B61C50154605452A891190FB5A0C4E464862CF5EFAD5E7D91F7D65AA1A78F688E69A1EB098AB42E95C674E234173CD7E0925541AD5AE7CED9A3D12FDFE6EB8EA4F8AAD2629D4F5A18BA3DDCC9CF7F352A892D4BEBDC4A1303F9C683DACD51A237E34B045EBE579A381E26B40DCFBF49EFFA6F65D17F37C6DBA54AA99A65D5573D4EB5BA038E024910A4D36B79A1D4E3C70349DADFF08FD8B4DEE77FDB57F01CB276ED5E676F1EC973154F86  
);  
---------------------------------------------  
CREATE TABLE Customers (  
    CustName nvarchar(60)   
        COLLATE  Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = MyCEK,  
        ENCRYPTION_TYPE = RANDOMIZED,  
        ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'),   
    SSN varchar(11)   
        COLLATE  Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = MyCEK,  
        ENCRYPTION_TYPE = DETERMINISTIC ,  
        ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'),   
    Age int NULL  
);  
GO  
  

См. также: