Динамическое маскирование данных

Применимо к: даSQL Server 2016 (13.x); и более поздние версии ДаБаза данных SQL Azure ДаУправляемый экземпляр SQL Azure даAzure Synapse Analytics

Динамическое маскирование данных

Динамическое маскирование данных (DDM) ограничивает возможность раскрытия конфиденциальных данных за счет маскирования этих данных для непривилегированных пользователей. Оно позволяет значительно упростить проектирование и написание кода для системы безопасности в приложении.

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

  • Центральная политика маскирования данных применяется непосредственно к конфиденциальным полям в базе данных.
  • Вы можете назначать привилегированных пользователей или роли, которые имеют доступ к конфиденциальным данным.
  • DDM включает функции полного и частичного маскирования, а также возможность использования случайной маски для числовых данных.
  • Назначение и использование масок осуществляется простыми командами Transact-SQL.

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

Динамическое маскирование данных доступно в SQL Server 2016 (13.x); и База данных SQL Azureи настраивается с помощью команд Transact-SQL . Дополнительные сведения о настройке динамического маскирования данных с помощью портала Azure см. в разделе Приступая к работе с динамическим маскированием данных в базах данных SQL (портал Azure).

Определение маски для динамического маскирования данных

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

Компонент Описание Примеры
По умолчанию Полное маскирование в соответствии с типами данных назначенных полей.

Для строковых типов данных используйте XXXX или меньшее количество X, если размер поля меньше 4 символов (char, nchar, varchar, nvarchar, text, ntext).

Для числовых данных типов используйте нулевое значение (bigint, bit, decimal, int, money, numeric, smallint, smallmoney, tinyint, float, real).

Для типов данных даты и времени используйте 01.01.1900 00:00:00.0000000 (date, datetime2, datetime, datetimeoffset, smalldatetime, time).

Для двоичных типов данных используйте однобайтовое значение 0 ASCII (binary, varbinary, image).
Пример синтаксиса для определения столбца: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL

Пример синтаксиса для изменения: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')
Email Метод маскирования, который раскрывает первую букву адреса электронной почты и постоянный суффикс .com, в формате адреса электронной почты. aXXX@XXXX.com. Пример определения синтаксиса: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL

Пример синтаксиса для изменения: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')
Случайные Функция случайного маскирования для использования с любым числовым типом, которая маскирует исходное значение случайным значением в указанном диапазоне. Пример определения синтаксиса: Account_Number bigint MASKED WITH (FUNCTION = 'random([start range], [end range])')

Пример синтаксиса для изменения: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')
Пользовательская строка Метод маскирования, который раскрывает первую и последнюю буквы и добавляет пользовательскую строку заполнения в середине. prefix,[padding],suffix

Примечание. Если исходное значение слишком короткое для заполнения всей маски, часть префикса или суффикса не раскрывается.
Пример определения синтаксиса: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULL

Пример синтаксиса для изменения: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)')

Дополнительный пример:

ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(5,"XXXXXXX",0)')

Разрешения

Для создания таблицы с динамическим маскированием данных не требуется специальных разрешений — только стандартные разрешения CREATE TABLE и ALTER для схемы.

Для добавления, замены или удаления маски столбца требуется разрешение ALTER ANY MASK и разрешение ALTER для таблицы. Разрешение ALTER ANY MASK может быть выдано директору по безопасности.

Пользователи с разрешением SELECT для таблицы могут просматривать данные таблицы. В столбцах, определенных как маскированные, будут отображаться маскированные данные. Предоставьте разрешение UNMASK для пользователя, чтобы он смог получать немаскированные данные из столбцов, для которых определено маскирование.

Разрешение CONTROL для базы данных включает разрешения ALTER ANY MASK и UNMASK .

Примечание

Разрешение UNMASK не влияет на видимость метаданных. При его предоставлении никакие метаданные не раскрываются. Разрешение UNMASK будет действовать только совместно с разрешением SELECT. Пример. Если предоставить разрешение UNMASK для области базы данных, а разрешение SELECT — для отдельной таблицы, то в результате пользователь сможет просматривать только метаданные конкретной таблицы, в которой ему разрешено выполнять SELECT, и никаких других таблиц. Дополнительные сведения: Настройка видимости метаданных.

Рекомендации и распространенные примеры

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

  • Используйте SELECT INTO или INSERT INTO для копирования данных из маскированного столбца в результаты для другой таблицы в маскированных данных в целевой таблице.

  • Динамическое маскирование данных применяется при запуске импорта и экспорта SQL Server . Файл экспортированных данных для базы данных с маскированными столбцами будет содержать маскированные данные (при условии, что она была экспортирована пользователем без привилегий UNMASK ), а импортированная база данных будет содержать статически маскированные данные.

Запрос данных для маскированных столбцов

Используйте представление sys.masked_columns для запроса данных для столбцов таблицы, к которым применена функция маскирования. Это представление наследуется из представления sys.columns . Оно возвращает все столбцы в представлении sys.columns , а также столбцы is_masked и masking_function , указывающие, маскирован ли столбец, и если да, то какая функция маскирования определена. В этом представлении отображаются только столбцы, к которым применена функция маскирования.

SELECT c.name, tbl.name as table_name, c.is_masked, c.masking_function  
FROM sys.masked_columns AS c  
JOIN sys.tables AS tbl   
    ON c.[object_id] = tbl.[object_id]  
WHERE is_masked = 1;  

Ограничения

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

  • Зашифрованные столбцы (постоянное шифрование)

  • FILESTREAM

  • Набор столбцов (COLUMN_SET) или разреженный столбец, который является частью набора столбцов.

  • Маскирование невозможно настроить для вычисляемого столбца, но если вычисляемый столбец зависит от столбца с маской (MASK), то вычисляемый столбец будет возвращать маскированные данные.

  • Столбец с маскированием данных не может использоваться в качестве ключа для полнотекстового (FULLTEXT) индекса.

  • Столбец во внешней таблице PolyBase.

Для пользователей без разрешения UNMASK устаревшие инструкции READTEXT, UPDATETEXT и WRITETEXT будут работать неправильно для столбца, для которого настроено динамическое маскирование данных.

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

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

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

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

Например, рассмотрим субъект базы данных, который обладает достаточными правами для выполнения нерегламентированных запросов к базе данных и пытается "подобрать" базовые данные, чтобы в конечном счете получить фактические значения. Предположим, что мы задали маску для столбца [Employee].[Salary] , а этот пользователь подключается непосредственно к базе данных и начинает подбор значений, стремясь получить значение [Salary] для набора сотрудников:

SELECT ID, Name, Salary FROM Employees
WHERE Salary > 99999 and Salary < 100001;
Идентификатор Имя Salary
62543 Jane Doe 0
91245 John Smith 0

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

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

Примеры

Создание маски для динамического маскирования данных

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


-- schema to contain user tables
CREATE SCHEMA Data;
GO

-- table with masked columns
CREATE TABLE Data.Membership(
    MemberID        int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
    FirstName        varchar(100) MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
    LastName        varchar(100) NOT NULL,
    Phone            varchar(12) MASKED WITH (FUNCTION = 'default()') NULL,
    Email            varchar(100) MASKED WITH (FUNCTION = 'email()') NOT NULL,
    DiscountCode    smallint MASKED WITH (FUNCTION = 'random(1, 100)') NULL
    );

-- inserting sample data
INSERT INTO Data.Membership (FirstName, LastName, Phone, Email, DiscountCode)
VALUES   
('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com', 10),  
('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co', 5),  
('Shakti', 'Menon', '555.123.4570', 'SMenon@contoso.net', 50),  
('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net', 40);  

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

CREATE USER MaskingTestUser WITHOUT LOGIN;  

GRANT SELECT ON SCHEMA::Data TO MaskingTestUser;  
  
  -- impersonate for testing:
EXECUTE AS USER = 'MaskingTestUser';  

SELECT * FROM Data.Membership;  

REVERT;  

Результат демонстрирует маски путем изменения данных из

1 Roberto Tamburello 555.123.4567 RTamburello@contoso.com 10

into

1 Rxxxxxo Tamburello xxxx RXXX@XXXX.com 91

где число в DiscountCode случайно для каждого результата запроса

Добавление или изменение маски для существующего столбца

Используйте инструкцию ALTER TABLE для добавления маски к существующему столбцу в таблице или для изменения маски для этого столбца.
В следующем примере функция маскирования добавляется к столбцу LastName:

ALTER TABLE Data.Membership  
ALTER COLUMN LastName ADD MASKED WITH (FUNCTION = 'partial(2,"xxxx",0)');  

В следующем примере функция маскирования для столбца LastName изменяется:

ALTER TABLE Data.Membership  
ALTER COLUMN LastName varchar(100) MASKED WITH (FUNCTION = 'default()');  

Предоставление разрешений на просмотр немаскированных данных

Предоставление разрешения UNMASK позволяет MaskingTestUser просматривать немаскированные данные.

GRANT UNMASK TO MaskingTestUser;  

EXECUTE AS USER = 'MaskingTestUser';  

SELECT * FROM Data.Membership;  

REVERT;    
  
-- Removing the UNMASK permission  
REVOKE UNMASK TO MaskingTestUser;  

Удаление маски для динамического маскирования данных

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

ALTER TABLE Data.Membership   
ALTER COLUMN LastName DROP MASKED;  

См. также:

CREATE TABLE (Transact-SQL)
ALTER TABLE (Transact-SQL)
column_definition (Transact-SQL)
sys.masked_columns (Transact-SQL)
Приступая к работе с динамическим маскированием данных в базах данных SQL (портал Azure)