Обмеження даних у SQL Server


43

Яка найкраща практика обтурації даних у SQL Server?

Ми хотіли б використовувати дані маскування виробництва в нашій системі UAT.

Якщо ми хочемо це зробити швидко і з більш високим рівнем затемнення, який підхід слід використовувати? Я замислююся над тим, щоб розбирати персонажів за іменем та прізвищем людей, але як? Чи повинен я сам створити функцію чи доступні для використання певні визначені функції? Я не хочу витрачати час на винахід колеса :)

Як щодо полів дати? Наприклад, чи слід дата народження вибирати випадковим чином з усієї таблиці та присвоювати запис, чи є кращий спосіб зробити це?

Відповіді:


25

Я б хотів, щоб я міг набрати вам 100 балів лише за те, щоб подумати над цим! Я бачив цю тему, яку я не помічав стільки разів, що це неправда - так добре зроблено. З того, що я розумію, ви насправді хочете зашифрувати дані в самих полях, і хоча я розумію, що ви намагаєтеся досягти, це може бути не зовсім необхідним для цього, хоча це слід розглядати у кожному конкретному випадку.

Більшість законів про захист даних поширюється на здатність правильно пов’язувати частину даних з особою - наприклад, дата народження або номер телефону. Ви можете відповідати вимогам закону, гарантуючи, що коли ви переміщуєте свої дані з виробництва в UAT, вони змішуються вгору, так що їх не легко переглядати на оригінальну особу, особливо коли ви змішуєте прізвище та прізвища.

Однак це не стосується цього питання, наприклад, скажімо, контактні дані. Ви можете відповідати вимогам закону, поєднуючи дані, але номери телефонів все ще справжні, електронні листи все ще справжні тощо. Вони просто не присвоєні правильній особі. Для цього я рекомендую, якщо взагалі можливо очистити ці дані, перш ніж передати їх в UAT, Red Gate зробить програмне забезпечення під назвою Генератор даних, яке може створити для вас випадкові дані тестування, щоб ви могли переповнити поля тими даними, на які можна перевірити.

Що стосується шифрування даних: існує багато додатків, які роблять це за вас, і, чесно, ви правильно не хочете винаходити колесо. Ми використовуємо в нашій компанії продукт, який називається Data Masker від компанії Net2000. Ліцензія досить дешева, вона працює надзвичайно швидко, і вам не доведеться турбуватися про необхідність вимкнення всіх обмежень перед тим, як скремблірувати базу даних.

Звичайно, ви можете розгорнути власне рішення, якщо ви не знайдете нічого, що відповідає вашим вимогам - якщо ви все-таки вирішите це зробити, я настійно рекомендую використовувати процедури CLR, оскільки це набагато гнучкіше, ніж чистий TSQL (не кажучи про те, що ви не вдається використовувати TSQL див. тут ).

Після того, як ви вибрали програму, щоб виконати це для вас, наступне, що вам потрібно вирішити, це те, що ви насправді хочете / потребуєте, щоб скрутити? Чесно кажучи, ваш найкращий ресурс для цього - юридична команда вашої компанії та аудитори компанії. Я знаю, що іноді нам може не подобатися працювати з ними, але вони будуть вам набагато приємнішими, якщо ви звертаєтесь до них і ставите їм запитання, а не намагаєтесь зробити це самостійно і зрозуміти це неправильно, з проханням про допомогу абсолютно нічого поганого. - особливо коли це так важливо, як це.

Я сподіваюся, що це допоможе вам і бажаю удачі у ваших пошуках ... ;-)


1
Якби я міг, я б дав додаткову пропозицію щодо згадування політики компанії.
dezso

Юридичні вимоги визначаються зацікавленими сторонами. Я маю це зараз реалізувати.
Небо

Містер Боунстоун, ваше пояснення чудово, як завжди. Дякую. Я збираюся перевірити функцію CLR для цього і також придивитись до T-SQL. Подивіться, який з них підходить краще і швидше будувати.
Небо

10

Містер Браунстоун вдарив цвяхом прямо по голові. Тепер, щоб трохи допомогти вам, ось моя функція "garble", яка використовується для придушення рядків (смішні результати з іменами!). Передаючи рядок, вона повертає пом'ятану рядок. Включіть його в оператори оновлення проти стовпців-рядків. Змініть довжину даних, як вважаєте за потрібне.

---------------------
-- Garble Function --
---------------------
-- Make a function to slightly garble the strings
IF (object_id('fn_Garble') is not null)
  drop function fn_Garble
go
create function fn_Garble
(
  @String varchar(255)
)  
returns varchar(255)
as
BEGIN
  select @String = replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@String,'o','e'),'a','o'),'i','a'),'u','i'),'t','p'),'c','k'),'d','th'),'ee','e'),'oo','or'),'ll','ski')
  return @String
END
go

3
Звучить знайомо? (Просто ілюстрація вашої точки зору.) Про SQL Server thBo a eppowo konotho. a om phe presathenp ef Meprepelas Thorоооооооооооооооооооооооооооооо SQL. Ми попередньо thpobose kensilponps pe voraeis piblak onth pravope sekper ergonazopaens. a o o pekhnakol ethaper fer SQL Server Mogozane on theph oipher ef phe p-SQL 101 seraes ef orpakles / e-bek. за допомогою SQL-сервера, який не може використовувати SQL 4.2.
дезсо

1
хе ... знадобилося мені час, щоб визнати це. Здається, там багато непослушних слів. Я лише коли-небудь використовував його проти імен, прізвищ, назв міст. Просто безглузда функція. Я б не ставлю на це свою кар’єру.
datagod

Я ціную цей підхід - простий, але працюючий. І плюсом є те, що текст все ще розбірливий. Я не міг цього зрозуміти :)
dezso

7

Мені довелося це зробити для своїх клієнтів даних роздрібних продажів. Щодо імен, я перейшов до перепису і завантажив усі імена та прізвища, провів їх через цикл, щоб приєднатися кожен перший до кожного останнього, додав сексуальний код і завантажив його в таблицю у верхньому регістрі. Тоді я мав таблицю з приблизно 400 мільйонами унікальних імен. Я використовував верхній регістр, оскільки наших поточних даних не було у верхньому регістрі, тому я міг легше повідомити дані, які були вичищені.

Коли я перечищав свої дані користувачів, я поміняв імена, на день народження я поклав усіх на 1 січня року, коли вони насправді народились та оновили будь-які телефонні номери зі своїм поштовим індексом (мої дані були лише для США). Адреси електронної пошти стали першими першими плюс прізвищем @ mycompany.co. Поштова адреса доставила мені найбільше горя, але я зберігав місто, штат та поштовий індекс, тому що я вважаю, що це не буде проблемою, якщо адресу буде змінено. У мене був колега, який мав якусь програму, яка генерувала шалені листи та оновлювала рядок адреси з цим.

У будь-якому місці я копіював дані, але все-таки мав ФК для основного користувача (поганий дизайн так, але не мій). Я також оновив ці дані, щоб ім'я було узгодженим у базі даних для користувача x.

В цілому мої дані були все ще дуже читабельні, хоча адреса не мала жодного сенсу. На це мені знадобилося пару днів, але як тільки це було зроблено, і було створено роботу агента sql, я міг скрупувати дані всього за 15 хвилин.


Мені подобається ваш підхід. Щодо даного імені та прізвища, я думаю, якщо набір даних досить великий, з хорошим рівнем варіацій, ми можемо використовувати його як джерело, а не завантажувати імена з веб-сайту перепису. Запит на дані SELECT DISTICT скаже нам багато унікальних цінностей, з якими ми маємо грати.
Небо

0

Як обмацувати одне поле, як щодо використання функції HASHBYTES (у SQL 2008+)? Ви можете вибрати свій алгоритм (MD5, мабуть, достатньо) за умови солі даних. Тому замість того, SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD>) щоб просто переконатися, що ви робите, SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD> + '<my salt string>')і тепер у вас є хеш, який не можна легко примусити.

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


Ви не повинні використовувати MD5 в цей день і в віці, це невиправдано небезпечно.
Philᵀᴹ

Гаразд ... ось ваш вибір з HASHBYTES: MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 Щось для кожного !! (включаючи, так, ті, які ви не повинні використовувати). Отже, скажімо, ми використовуємо SHA2_512 ... ще щось проблематичне при такому підході?
cmcapellan

-1

Погляньте на модуль dbatools PowerShell, щоб отримати безкоштовний варіант для статичного маскування даних, написаний Кріссі Лемер (@ chrissy-lemaire) та її командою. Всі їх інструменти чудові, тому я впевнений, що це варто подивитися.

Дві команди для пошуку в dbatools є: New-DbaDbMaskingConfig Invoke-DbaDbDataMasking

Погляньте на повідомлення в блозі, де це оголошення: автоматичне маскування даних


2
Відповіді лише на посилання не дуже корисні. Ви можете покращити свою відповідь, наводячи приклади використання командлетів тощо.
Ерік Дарлінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.