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

ОБЛАСТЬ ПРИМЕНЕНИЯ: ДаSQL Server ДаБаза данных SQL Azure ДаAzure Synapse Analytics (Хранилище данных SQL) НетParallel Data Warehouse APPLIES TO: YesSQL Server YesAzure SQL Database YesAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

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

Динамическое маскирование данных (DDM) ограничивает возможность раскрытия конфиденциальных данных за счет маскирования этих данных для непривилегированных пользователей.Dynamic data masking (DDM) limits sensitive data exposure by masking it to non-privileged users. Оно позволяет значительно упростить проектирование и написание кода для системы безопасности в приложении.It can be used to greatly simplify the design and coding of security in your application.

Динамическое маскирование данных помогает предотвратить несанкционированный доступ к конфиденциальным данным, позволяя клиентам задать объем раскрываемых конфиденциальных данных с минимальным влиянием на уровень приложения.Dynamic data masking helps prevent unauthorized access to sensitive data by enabling customers to specify how much sensitive data to reveal with minimal impact on the application layer. DDM можно настроить для отдельных полей базы данных, чтобы скрыть конфиденциальные данные в результирующих наборах запросов.DDM can be configured on designated database fields to hide sensitive data in the result sets of queries. При использовании DDM данные в базе данных не изменяются.With DDM the data in the database is not changed. Динамическое маскирование данных легко использовать с существующими приложениями, поскольку правила маскирования применяются к результатам запроса.Dynamic data masking is easy to use with existing applications, since masking rules are applied in the query results. Многие приложения могут маскировать конфиденциальные данные без изменения существующих запросов.Many applications can mask sensitive data without modifying existing queries.

  • Центральная политика маскирования данных применяется непосредственно к конфиденциальным полям в базе данных.A central data masking policy acts directly on sensitive fields in the database.
  • Вы можете назначать привилегированных пользователей или роли, которые имеют доступ к конфиденциальным данным.Designate privileged users or roles that do have access to the sensitive data.
  • DDM включает функции полного и частичного маскирования, а также возможность использования случайной маски для числовых данных.DDM features full masking and partial masking functions, and a random mask for numeric data.
  • Назначение и использование масок осуществляется простыми командами Transact-SQLTransact-SQL.Simple Transact-SQLTransact-SQL commands define and manage masks.

Например, специалист службы поддержки в центре вызовов может идентифицировать абонентов по нескольким цифрам номера социального страхования или кредитной карты,As an example, a call center support person may identify callers by several digits of their social security number or credit card number. при этом эти номера не должны предоставляться полностью.Social security numbers or credit card numbers should not be fully exposed to the support person. Можно определить правило маскирования, которое маскирует все цифры номера социального страхования или кредитной карты за исключением последних четырех в результирующем наборе любого запроса.A masking rule can be defined that masks all but the last four digits of any social security number or credit card number in the result set of any query. Другой пример — с помощью соответствующей маски для защиты персональных данных разработчик может отправлять запросы к рабочей среде для устранения неполадок, не нарушая правил соответствия.For another example, by using the appropriate data mask to protect personally identifiable information (PII) data, a developer can query production environments for troubleshooting purposes without violating compliance regulations.

Назначение динамического маскирования данных — ограничение раскрытия конфиденциальных данных, при котором пользователи, у которых нет доступа к данным, не смогут их просматривать.The purpose of dynamic data masking is to limit exposure of sensitive data, preventing users who should not have access to the data from viewing it. Динамическое маскирование данных не сможет помешать пользователям подключиться к базе данных напрямую и выполнить запросы для получения фрагментов конфиденциальных данных.Dynamic data masking does not aim to prevent database users from connecting directly to the database and running exhaustive queries that expose pieces of the sensitive data. Динамическое маскирование данных дополняет другие функции безопасности SQL ServerSQL Server (аудит, шифрование, безопасность на уровне строк...). Настоятельно рекомендуется использовать маскирование вместе с этими функциями для лучшей защиты конфиденциальных данных в базе данных.Dynamic data masking is complementary to other SQL ServerSQL Server security features (auditing, encryption, row level security...) and it is highly recommended to use this feature in conjunction with them in addition in order to better protect the sensitive data in the database.

Динамическое маскирование данных доступно в SQL Server 2016 (13.x);SQL Server 2016 (13.x) и База данных SQL AzureAzure SQL Databaseи настраивается с помощью команд Transact-SQLTransact-SQL .Dynamic data masking is available in SQL Server 2016 (13.x);SQL Server 2016 (13.x) and База данных SQL AzureAzure SQL Database, and is configured by using Transact-SQLTransact-SQL commands. Дополнительные сведения о настройке динамического маскирования данных с помощью портала Azure см. в разделе Приступая к работе с динамическим маскированием данных в базах данных SQL (портал Azure).For more information about configuring dynamic data masking by using the Azure portal, see Get started with SQL Database Dynamic Data Masking (Azure portal).

Определение маски для динамического маскирования данныхDefining a Dynamic Data Mask

Правило маскирования можно задать для столбца в таблице, чтобы замаскировать данные в этом столбце.A masking rule may be defined on a column in a table, in order to obfuscate the data in that column. Доступны четыре типа маскирования.Four types of masks are available.

КомпонентFunction DescriptionDescription ПримерыExamples
По умолчаниюDefault Полное маскирование в соответствии с типами данных назначенных полей.Full masking according to the data types of the designated fields.

Для строковых типов данных используйте XXXX или меньшее количество X, если размер поля меньше 4 символов (char, nchar, varchar, nvarchar, text, ntext).For string data types, use XXXX or fewer Xs if the size of the field is less than 4 characters (char, nchar, varchar, nvarchar, text, ntext).

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

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

Для двоичных типов данных используйте однобайтовое значение 0 ASCII (binary, varbinary, image).For binary data types use a single byte of ASCII value 0 (binary, varbinary, image).
Пример синтаксиса для определения столбца: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULLExample column definition syntax: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL

Пример синтаксиса для изменения: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')Example of alter syntax: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')
EmailEmail Метод маскирования, который раскрывает первую букву адреса электронной почты и постоянный суффикс .com, в формате адреса электронной почты.Masking method that exposes the first letter of an email address and the constant suffix ".com", in the form of an email address. aXXX@XXXX.com.aXXX@XXXX.com. Пример определения синтаксиса: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULLExample definition syntax: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL

Пример синтаксиса для изменения: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')Example of alter syntax: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')
СлучайныеRandom Функция случайного маскирования для использования с любым числовым типом, которая маскирует исходное значение случайным значением в указанном диапазоне.A random masking function for use on any numeric type to mask the original value with a random value within a specified range. Пример определения синтаксиса: Account_Number bigint MASKED WITH (FUNCTION = 'random([start range], [end range])')Example definition syntax: Account_Number bigint MASKED WITH (FUNCTION = 'random([start range], [end range])')

Пример синтаксиса для изменения: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')Example of alter syntax: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')
Пользовательская строкаCustom String Метод маскирования, который раскрывает первую и последнюю буквы и добавляет пользовательскую строку заполнения в середине.Masking method that exposes the first and last letters and adds a custom padding string in the middle. prefix,[padding],suffix

Примечание. Если исходное значение слишком короткое для заполнения всей маски, часть префикса или суффикса не раскрывается.Note: If the original value is too short to complete the entire mask, part of the prefix or suffix will not be exposed.
Пример определения синтаксиса: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULLExample definition syntax: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULL

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

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

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

ALTER COLUMN [Social Security Number] ADD MASKED WITH (FUNCTION = 'partial(0,"XXX-XX-",4)')

РазрешенияPermissions

Для создания таблицы с динамическим маскированием данных не требуется специальных разрешений — только стандартные разрешения CREATE TABLE и ALTER для схемы.You do not need any special permission to create a table with a dynamic data mask, only the standard CREATE TABLE and ALTER on schema permissions.

Для добавления, замены или удаления маски столбца требуется разрешение ALTER ANY MASK и разрешение ALTER для таблицы.Adding, replacing, or removing the mask of a column, requires the ALTER ANY MASK permission and ALTER permission on the table. Разрешение ALTER ANY MASK может быть выдано директору по безопасности.It is appropriate to grant ALTER ANY MASK to a security officer.

Пользователи с разрешением SELECT для таблицы могут просматривать данные таблицы.Users with SELECT permission on a table can view the table data. В столбцах, определенных как маскированные, будут отображаться маскированные данные.Columns that are defined as masked, will display the masked data. Предоставьте разрешение UNMASK для пользователя, чтобы он смог получать немаскированные данные из столбцов, для которых определено маскирование.Grant the UNMASK permission to a user to enable them to retrieve unmasked data from the columns for which masking is defined.

Разрешение CONTROL для базы данных включает разрешения ALTER ANY MASK и UNMASK .The CONTROL permission on the database includes both the ALTER ANY MASK and UNMASK permission.

Рекомендации и распространенные примерыBest Practices and Common Use Cases

  • Создание маски для столбца не запрещает обновление этого столбца.Creating a mask on a column does not prevent updates to that column. Поэтому хотя при опросе маскированного столбца пользователи получают маскированные данные, те же пользователи могут обновлять данные, если у них есть разрешения на запись.So although users receive masked data when querying the masked column, the same users can update the data if they have write permissions. Поэтому необходимо применить подходящую политику контроля доступа для ограничения разрешений на обновление.A proper access control policy should still be used to limit update permissions.

  • Используйте SELECT INTO или INSERT INTO для копирования данных из маскированного столбца в результаты для другой таблицы в маскированных данных в целевой таблице.Using SELECT INTO or INSERT INTO to copy data from a masked column into another table results in masked data in the target table.

  • Динамическое маскирование данных применяется при запуске импорта и экспорта SQL ServerSQL Server .Dynamic Data Masking is applied when running SQL ServerSQL Server Import and Export. Файл экспортированных данных для базы данных с маскированными столбцами будет содержать маскированные данные (при условии, что она была экспортирована пользователем без привилегий UNMASK ), а импортированная база данных будет содержать статически маскированные данные.A database containing masked columns will result in an exported data file with masked data (assuming it is exported by a user without UNMASK privileges), and the imported database will contain statically masked data.

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

Используйте представление sys.masked_columns для запроса данных для столбцов таблицы, к которым применена функция маскирования.Use the sys.masked_columns view to query for table-columns that have a masking function applied to them. Это представление наследуется из представления sys.columns .This view inherits from the sys.columns view. Оно возвращает все столбцы в представлении sys.columns , а также столбцы is_masked и masking_function , указывающие, маскирован ли столбец, и если да, то какая функция маскирования определена.It returns all columns in the sys.columns view, plus the is_masked and masking_function columns, indicating if the column is masked, and if so, what masking function is defined. В этом представлении отображаются только столбцы, к которым применена функция маскирования.This view only shows the columns on which there is a masking function applied.

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;  

ОграниченияLimitations and Restrictions

Правило маскирования невозможно определить для следующих типов столбцов:A masking rule cannot be defined for the following column types:

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

  • FILESTREAMFILESTREAM

  • Набор столбцов (COLUMN_SET) или разреженный столбец, который является частью набора столбцов.COLUMN_SET or a sparse column that is part of a column set.

  • Маскирование невозможно настроить для вычисляемого столбца, но если вычисляемый столбец зависит от столбца с маской (MASK), то вычисляемый столбец будет возвращать маскированные данные.A mask cannot be configured on a computed column, but if the computed column depends on a column with a MASK, then the computed column will return masked data.

  • Столбец с маскированием данных не может использоваться в качестве ключа для полнотекстового (FULLTEXT) индекса.A column with data masking cannot be a key for a FULLTEXT index.

Для пользователей без разрешения UNMASK устаревшие инструкции READTEXT, UPDATETEXTи WRITETEXT будут работать неправильно для столбца, для которого настроено динамическое маскирование данных.For users without the UNMASK permission, the deprecated READTEXT, UPDATETEXT, and WRITETEXT statements do not function properly on a column configured for Dynamic Data Masking.

Добавление маски динамических данных реализовано как изменение схемы в базовой таблице и поэтому невозможно для столбца с зависимостями.Adding a dynamic data mask is implemented as a schema change on the underlying table, and therefore cannot be performed on a column with dependencies. Чтобы обойти это ограничение, можно сначала удалить зависимость, далее добавить маску динамических данных и затем повторно создать зависимость.To work around this restriction, you can first remove the dependency, then add the dynamic data mask and then re-create the dependency. Например, если зависимость обусловлена индексом, зависимым от этого столбца, можно удалить индекс, добавить маску и затем повторно создать зависимый индекс.For example, if the dependency is due to an index dependent on that column, you can drop the index, then add the mask, and then re-create the dependent index.

Примечание о безопасности. Обход маскировки с помощью статистической атака или атаки путем подбораSecurity Note: Bypassing masking using inference or brute-force techniques

Динамическое маскирование данных предназначено для упрощения разработки приложений путем ограничения возможности раскрытия данных в рамках набора предопределенных запросов, используемых приложением.Dynamic Data Masking is designed to simplify application development by limiting data exposure in a set of pre-defined queries used by the application. Хотя динамическое маскирование данных позволяет предотвратить случайное раскрытие конфиденциальных данных при прямом доступе к рабочей базе данных, следует отметить, что непривилегированные пользователи с разрешениями на нерегламентированные запросы могут воспользоваться определенными методиками для получения доступа к фактическим данным.While Dynamic Data Masking can also be useful to prevent accidental exposure of sensitive data when accessing a production database directly, it is important to note that unprivileged users with ad-hoc query permissions can apply techniques to gain access to the actual data. В случае, когда необходимо предоставить такой нерегламентированный доступ, следует использовать аудит для отслеживания всех операций с базой данных и избежания описанной ситуации.If there is a need to grant such ad-hoc access, Auditing should be used to monitor all database activity and mitigate this scenario.

Например, рассмотрим субъект базы данных, который обладает достаточными правами для выполнения нерегламентированных запросов к базе данных и пытается "подобрать" базовые данные, чтобы в конечном счете получить фактические значения.As an example, consider a database principal that has sufficient privileges to run ad-hoc queries on the database, and tries to 'guess' the underlying data and ultimately infer the actual values. Предположим, что мы задали маску для столбца [Employee].[Salary] , а этот пользователь подключается непосредственно к базе данных и начинает подбор значений, стремясь получить значение [Salary] для набора сотрудников:Assume that we have a mask defined on the [Employee].[Salary] column, and this user connects directly to the database and starts guessing values, eventually inferring the [Salary] value of a set of Employees:

SELECT ID, Name, Salary FROM Employees
WHERE Salary > 99999 and Salary < 100001;
ИдентификаторId ИмяName SalarySalary
6254362543 Jane DoeJane Doe 00
9124591245 John SmithJohn Smith 00

Это показывает, что динамическое маскирование данных не следует использовать в качестве изолированной меры защиты конфиденциальных данных от пользователей, выполняющих нерегламентированные запросы к базе данных.This demonstrates that Dynamic Data Masking should not be used as an isolated measure to fully secure sensitive data from users running ad-hoc queries on the database. Данная функция подходит для предотвращения случайного раскрытия конфиденциальных данных, но не защищает от вредоносных намерений получить базовые данные.It is appropriate for preventing accidental sensitive data exposure, but will not protect against malicious intent to infer the underlying data.

Очень важно правильно управлять разрешениями для базы данных и всегда следовать принципу минимально достаточных разрешений.It is important to properly manage the permissions on the database, and to always follow the minimal required permissions principle. Кроме того, не забывайте включать аудит, чтобы отслеживать все действия в базе данных.Also, remember to have Auditing enabled to track all activities taking place on the database.

ПримерыExamples

Создание маски для динамического маскирования данныхCreating a Dynamic Data Mask

В следующем примере создается таблица, в которой используется три различных типа динамического маскирования данных.The following example creates a table with three different types of dynamic data masks. В примере заполняется таблица, затем выполняется запрос выборки для отображения результатов.The example populates the table, and selects to show the result.

CREATE TABLE Membership  
  (MemberID int IDENTITY PRIMARY KEY,  
   FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)') NULL,  
   LastName varchar(100) NOT NULL,  
   Phone varchar(12) MASKED WITH (FUNCTION = 'default()') NULL,  
   Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL);  
  
INSERT Membership (FirstName, LastName, Phone, Email) VALUES   
('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com'),  
('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co'),  
('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net');  
SELECT * FROM Membership;  

Новый пользователь создается, и ему предоставляется разрешение SELECT для таблицы.A new user is created and granted SELECT permission on the table. Запросы, выполняемые как TestUser , возвращают маскированные данные.Queries executed as the TestUser view masked data.

CREATE USER TestUser WITHOUT LOGIN;  
GRANT SELECT ON Membership TO TestUser;  
  
EXECUTE AS USER = 'TestUser';  
SELECT * FROM Membership;  
REVERT;  

Результат демонстрирует маски путем изменения данных изThe result demonstrates the masks by changing the data from

1 Roberto Tamburello 555.123.4567 RTamburello@contoso.com

intointo

1 RXXXXXXX Tamburello xxxx RXXX@XXXX.com

Добавление или изменение маски для существующего столбцаAdding or Editing a Mask on an Existing Column

Используйте инструкцию ALTER TABLE для добавления маски к существующему столбцу в таблице или для изменения маски для этого столбца.Use the ALTER TABLE statement to add a mask to an existing column in the table, or to edit the mask on that column.
В следующем примере функция маскирования добавляется к столбцу LastName :The following example adds a masking function to th LastName column:

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

В следующем примере функция маскирования для столбца LastName изменяется:The following example changes a masking function on the LastName column:

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

Предоставление разрешений на просмотр немаскированных данныхGranting Permissions to View Unmasked Data

Предоставление разрешения UNMASK позволяет TestUser просматривать немаскированные данные.Granting the UNMASK permission allows TestUser to see the data unmasked.

GRANT UNMASK TO TestUser;  
EXECUTE AS USER = 'TestUser';  
SELECT * FROM Membership;  
REVERT;   
  
-- Removing the UNMASK permission  
REVOKE UNMASK TO TestUser;  

Удаление маски для динамического маскирования данныхDropping a Dynamic Data Mask

Следующая инструкция удаляет маску для столбца LastName , созданного в предыдущем примере:The following statement drops the mask on the LastName column created in the previous example:

ALTER TABLE Membership   
ALTER COLUMN LastName DROP MASKED;  

См. также:See Also

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