Кибербезопасность, Шифрование

Маскируем данные

Время прочтения: 5 мин.

Довольно часто в аудиторской практике для хранения больших выгрузок из каких-либо источников данных и в дальнейшем для проверки гипотез при работе с этими данными применяется СУБД SQL Server. В таблицах баз данных могут хранится, в том числе, и персональные данные клиентов (физических лиц) или сотрудников компании, различная конфиденциальная информация организации, доступ к которой может быть защищен с помощью маскирования (обфускации) путем замены исходных данных фиктивными или наборами произвольных символов. И такое маскирование можно применить не только для того, чтобы выполнять требования нормативных документов компании, но и, таким образом, избежать «утечки» информации.

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

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

DDM строится на использовании T-SQL команд и определяет защищаемые данные по полям, настраивает подходящую функцию маскирования и скрывает данные от запросов. Это не требует кодирования, шифрования или внесения изменений в реальные данные, хранящиеся на жестком диске.

Что необходимо предварительно сделать?

Перейдем к примерам.

Допустим, в базе данных имеется таблица employees со списком сотрудников компании. В этой таблице, как видно из рисунка ниже, присутствуют данные об Имени, Фамилии сотрудника, его Дате рождения, зарплате, адресе электронной почты (все данные в данной таблице вымышленные).

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

create user demoUser without login;
grant select on employees to demoUser;

Начнем с маскирования поля firstName.

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

Выполним скрипт для этой операции:

alter table employees
alter column firstName nvarchar(255) masked with (function = 'default()');

Теперь, если «демо-пользователь» запросит данные из таблицы employees,

execute as user = 'demoUser';
select * from employees;
revert;

то он получит следующий результат:

Таким образом, изменились только данные, которые предоставляются для выбранного пользователя ‘demoUser‘. В самой базе данных изменений не произошло.

Далее продолжая маскировать данные проделаем эту операцию для поля электронной почты сотрудника компании  — Email. Используем для этих целей функцию маскирования email, которая показывает один лишь первый символ адреса электронной почты и маскирует остальную часть адреса —  nXXX@XXXX.ru.

alter table employees
alter column Email nvarchar(255) masked with (function = 'email()');

После выполнения этого скрипта, если использовать учетную запись ‘demoUser‘ для запроса данных из таблицы employees, то результат будет следующим:

execute as user = 'demoUser';
select * from employees;
revert;

Следующее поле, данные которого будем маскировать – зарплата сотрудника. В таблице employees – это поле Salary.

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

alter table employees
alter column Salary int masked with (function='random(1,9)');

В итоге demoUser после запуска скрипта

execute as user = 'demoUser';
select * from employees;
revert;

получит следующий результат:

Обратите внимание на то, что этот метод приводит к замене имеющихся значений в поле Salary случайными значениями в пределах определенного диапазона от 1 до 9, который указан в функции random.

А теперь приведу пример того, как можно выполнить маскирование данных поля lastName, используя настройки функции сustom,  в которых указывается маска для данных поля lastName (отображаются 3 первые и 3 последние буквы фамилии).

alter table employees
alter column lasttName nvarchar(255) masked with (function= 'partial(3,"xxxx",3)');

После этого, выполнив запрос данных из таблицы employees от имени  demoUser, получаем ответ, представленный на следующем рисунке:

Если учетной записи demoUser предоставить доступ UNMASK к базе данных, то можно видеть все записи в таблице employees без маскирования.

grant unmask to demoUser
execute as user = 'demoUser';
select * from employees;
revert;

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

revoke unmask to demoUser;

Если требуется отменить маскирование какого-либо поля таблицы employees, например, поля firstName, чтобы demoUser мог видеть данные этого поля в результатах запроса «открытыми», то выполним следующий скрипт

alter table employees
alter column firstName drop masked

и для проверки запросим данные от имени demoUser:

execute as user = 'demoUser';
select * from employees;
revert;

Как видно из приведенных примеров, динамическое маскирование данных таблицы employees приводило к тому, что при запросе данных из этой таблицы от имени пользователя, которому предоставлен определенный уровень доступа, выполнялась защита данных выбранных полей (firstName, lastName, Email, Salary) путем маскирования данных в результатах запроса. Изменения в данные, хранящиеся на диске, не вносились.

Советуем почитать