Obfuscation de données dans SQL Server

43

Quelle est la meilleure pratique pour l'obscurcissement des données dans SQL Server?

Nous aimerions utiliser des données de production masquées dans notre système UAT.

Si nous voulons le faire rapidement et avec un niveau d'obsolescence plus élevé, quelle approche faut-il adopter? Je pense au fait que le personnage se démène pour le prénom et le nom de famille des personnes, mais comment? Devrais-je créer moi-même une fonction ou des fonctions prédéfinies sont-elles disponibles? Je ne veux pas passer du temps à réinventer la roue :)

Que diriez-vous des champs de date? Par exemple, la date de naissance doit-elle être choisie au hasard dans l’ensemble de la table et affectée à un enregistrement, ou existe-t-il une meilleure façon de le faire?

Ciel
la source

Réponses:

25

J'aimerais pouvoir vous faire voter 100 points juste pour y penser! J'ai vu ce sujet tellement souvent négligé que c'était faux, tellement bien fait. D'après ce que j'ai compris, vous voulez réellement brouiller les données dans les champs eux-mêmes. Bien que je comprenne ce que vous essayez de réaliser, il n'est peut-être pas nécessaire de le faire - même si cela devrait être examiné au cas par cas.

La plupart des lois sur la protection des données tournent autour de la possibilité d'associer correctement une donnée à un individu, par exemple une date de naissance ou un numéro de téléphone. Vous pouvez répondre aux exigences de la loi en veillant à ce que vos données hors de la production au format UAT soient mélangées de manière à ce qu'elles ne soient pas facilement reconfigurées à la personne d'origine - en particulier lorsque vous mélangez des prénoms et des noms.

Toutefois, cela ne règle pas le problème, par exemple, des informations de contact. Vous pouvez répondre aux exigences de la loi en mélangeant les données, mais les numéros de téléphone sont toujours réels, les courriels toujours, etc. Ils ne sont tout simplement pas attribués à la bonne personne. Pour cette raison, je recommande que, dans la mesure du possible, efface ces données avant de les transmettre à UAT, Red Gate utilise un logiciel appelé Data Generator, qui peut créer des données de test aléatoires pour vous permettre de remplir à nouveau les champs avec des données sur lesquelles des tests peuvent être effectués.

En ce qui concerne le brouillage des données: il existe de nombreuses applications qui le font pour vous et honnêtement, vous avez raison de ne pas vouloir réinventer la roue. Celui que nous utilisons dans notre société est un produit appelé Data Masker par une société appelée Net2000. La licence est très bon marché, elle fonctionne extrêmement rapidement et vous n'avez pas à vous soucier de désactiver toutes vos contraintes avant de brouiller la base de données.

Vous pouvez bien sûr utiliser votre propre solution si vous ne trouvez rien qui réponde à vos exigences. Si vous décidez de le faire, je vous recommande fortement d'utiliser des procédures CLR pour le faire, car il est beaucoup plus flexible que TSQL pur (pour ne pas dire que vous ne peut pas utiliser TSQL voir ici ).

Une fois que vous avez choisi une application pour effectuer ceci pour vous, la prochaine chose que vous devez décider est ce que vous voulez / devez réellement brouiller? Honnêtement, votre meilleure ressource à cet égard est l’équipe juridique de votre entreprise et / ou ses auditeurs. Je sais que parfois nous n'aimons pas travailler avec eux, mais ils vous seront beaucoup plus agréables de les avoir approchés et de leur avoir posé la question plutôt que d'essayer de le faire vous-même et de vous tromper, il n'y a absolument rien de mal à demander de l'aide - surtout quand c'est aussi important que ça.

J'espère que cela vous aide et je vous souhaite bonne chance dans votre quête ... ;-)

Mr.Brownstone
la source
1
Si je pouvais, je donnerais un vote supplémentaire pour mentionner la politique de l'entreprise.
dezso
Les exigences légales sont déterminées par les parties prenantes. Je devrais le mettre en œuvre maintenant.
Sky
Monsieur Bownstone, votre explication est excellente, comme toujours. Merci. Je vais vérifier la fonction CLR à ce sujet et également surveiller T-SQL. Voir lequel convient mieux et est plus rapide à construire.
Sky
10

M. Brownstone a mis le doigt sur la tête. Maintenant, pour vous aider un peu, voici ma fonction "garble", utilisée pour obscurcir les chaînes (résultats amusants avec des noms!). Passer dans une chaîne, il retourne une chaîne tronquée. Incluez-le dans les instructions de mise à jour sur les colonnes de chaîne. Changez la longueur des données comme bon vous semble.

---------------------
-- 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
datagod
la source
3
Sonne familier? (Juste une illustration de votre argument.) A propos de SQL Server et d’un kiosque électronique. une om phe presathenp ef Meprepelas threomwore on kekang Waph SQL. Nous prevathe thopobose kensilponps pe voraeis piblak sur pravope sekper ergonazopaens. En savoir plus sur SQL Server Mogozane sur le code et le code sur SQL-101 101 e-mails ou logiciels / e-bek. Merci beaucoup pour SQL Server que ce soit bien avec SQL 4.2.
dezso
1
heh ... m'a pris un certain temps pour le reconnaître. Il semble y avoir beaucoup de mots non confus. Je ne l'ai jamais utilisé que contre des prénoms, des noms de famille, des noms de villes. Juste une petite fonction idiote. Je ne jetterais pas ma carrière là-dessus.
datagod
J'apprécie l'approche - restée simple mais efficace. Et un avantage est que le texte est toujours lisible. Je ne pouvais pas comprendre cependant :)
dezso
7

Je devais le faire pour les données de vente au détail de mes clients. Pour les noms, je suis allé au recensement et j'ai téléchargé tous les prénoms et noms, je les ai parcourus en boucle pour les joindre tous les premiers, ajouté un code de sexe et les ai chargés dans un tableau en majuscules. J'ai ensuite eu une table avec environ 400 millions de noms uniques. J'ai utilisé les majuscules, car nos données actuelles n'étaient pas en majuscules, ce qui m'a permis de déterminer plus facilement les données effacées.

Quand j'ai effacé mes données d'utilisateur, j'ai échangé les noms. Pour mon anniversaire, je mettais tout le monde au 1er janvier de l'année de leur naissance et mettais à jour tous les numéros de téléphone avec leur code postal (mes données étaient américaines seulement). Les adresses électroniques sont devenues des initiales plus le nom de famille @ monentreprise.co. L’adresse postale me causa le plus de chagrin mais j’ai gardé la ville, l’état et le code postal, car j’estime qu’ils ne poseraient pas problème si l’adresse est modifiée. J'ai eu un collègue qui avait un programme qui a généré des lettres brouillées et mis à jour la ligne d'adresse avec cela.

Partout où j’avais des données en double, mais toujours un FK pour l’utilisateur principal (mauvaise conception oui, mais pas la mienne), j’ai mis à jour ces données aussi afin que le nom soit cohérent dans la base de données pour l’utilisateur x.

Globalement, mes données étaient encore très lisibles bien que l’adresse n’ait aucun sens. Cela m'a pris quelques jours pour que tout cela fonctionne, mais une fois que cela a été fait et qu'un travail d'agent SQL a été créé, je pouvais effacer les données en aussi peu que 15 minutes.

utilisateur9164
la source
J'aime votre approche. En ce qui concerne le prénom et le nom de famille, je pense que si l'ensemble de données est suffisamment volumineux, avec un bon niveau de variation, nous pouvons l'utiliser comme source plutôt que de télécharger des noms à partir du site Web du recensement. L'interrogation des données par SELECT DISTICT nous indiquera de nombreuses valeurs uniques avec lesquelles nous devons jouer.
Sky
0

Pour masquer un seul champ, pourquoi ne pas utiliser la fonction HASHBYTES (en SQL 2008+)? Vous pouvez choisir votre algorithme (MD5 est probablement suffisant) à condition de saler vos données. Donc, au lieu de simplement SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD>) vous en assurer, vous SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD> + '<my salt string>')avez maintenant un hash qui ne peut pas être facilement forcé.

C'est une fonction réelle supportable, reproductible et probablement beaucoup plus rapide. Selon le degré de sécurité requis par rapport à l’obfuscation, vous pouvez également utiliser un hachage plus faible et plus rapide.

cmcapellan
la source
Vous ne devriez pas utiliser le MD5 de nos jours, il est intrinsèquement instable.
Philᵀᴹ
OK ... voici vos choix avec HASHBYTES: MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 quelque chose pour tout le monde !! (y compris, oui, ceux que vous ne devriez pas utiliser). Alors, disons que nous utilisons SHA2_512 ... avez-vous des problèmes avec cette approche?
cmcapellan
-1

Jetez un coup d’œil au module dbatools PowerShell pour une option gratuite sur le masquage de données statiques, écrit par Chrissy Lemaire (@ chrissy-lemaire) et son équipe. Tous leurs outils sont excellents, alors je suis sûr que cela en vaut la peine.

Les deux commandes à rechercher dans dbatools sont: New-DbaDbMaskingConfig Invoke-DbaDbDataMasking

Jetez un coup d'œil à l'article de blog qui annonce cela: le masquage automatisé des données

cmcapellan
la source
2
Les réponses avec lien uniquement ne sont pas très utiles. Vous pouvez améliorer votre réponse en donnant des exemples d'utilisation des applets de commande, etc.
Erik Darling