Qual é a melhor prática para ofuscação de dados no SQL Server?
Gostaríamos de usar dados de produção mascarados em nosso sistema UAT.
Se quisermos fazê-lo rapidamente e com um nível mais alto de obscurecimento, qual abordagem deve ser adotada? Estou pensando no personagem lutando pelo nome e sobrenome das pessoas, mas como? Devo criar uma função eu mesmo ou há alguma função predefinida disponível para uso? Não quero perder tempo reinventando a roda :)
Que tal para campos de data? Por exemplo, a data de nascimento deve ser escolhida aleatoriamente de toda a tabela e atribuída a um registro, ou há uma maneira melhor de fazer isso?
Eu gostaria de poder te dar 100 pontos só por pensar nisso! Eu vi este assunto negligenciado tantas vezes que é falso - tão bem feito. Pelo que entendi, você realmente deseja embaralhar os dados nos próprios campos e, embora eu entenda o que você está tentando alcançar, pode não ser necessário fazê-lo - embora deva ser considerado caso a caso.
A maioria das leis de proteção de dados gira em torno da capacidade de associar corretamente um dado a um indivíduo - por exemplo, uma data de nascimento ou um número de telefone. Você pode atender aos requisitos da lei garantindo que, ao mover seus dados da produção para o UAT, eles sejam misturados para que não sejam facilmente mapeados novamente para a pessoa original - especialmente quando você mistura nomes próprios e sobrenomes.
No entanto, isso não resolve o problema, por exemplo, de, digamos, detalhes de contato. Você pode atender aos requisitos da lei misturando os dados, mas os números de telefone ainda são reais, os e-mails ainda são reais etc... eles apenas não são atribuídos à pessoa correta. Para isso, recomendo, se possível, limpar esses dados antes de passá-los para o UAT, o Red Gate faça um software chamado Data Generator que pode criar dados de teste aleatórios para você, para que você possa repovoar os campos com dados que podem ser testados.
Quanto ao embaralhamento de dados: existem muitos aplicativos que fazem isso para você e, honestamente, você está certo em não querer reinventar a roda. O que usamos em nossa empresa é um produto chamado Data Masker de uma empresa chamada Net2000. A licença é bem barata, funciona extremamente rápido e você não precisa se preocupar em desabilitar todas as suas restrições antes de embaralhar o banco de dados.
Você pode, é claro, lançar sua própria solução caso não encontre nada que atenda aos seus requisitos - se você decidir fazer isso, eu recomendo fortemente usar procedimentos CLR para fazê-lo, pois é muito mais flexível do que TSQL puro (para não dizer que você não pode usar TSQL veja aqui ).
Depois de escolher um aplicativo para fazer isso para você, a próxima coisa que você precisa decidir é o que você realmente quer/precisa embaralhar? Honestamente, seu melhor recurso para isso é a equipe jurídica da sua empresa e/ou os auditores da empresa. Eu sei que às vezes podemos não gostar de trabalhar com eles, mas eles serão muito mais legais com você por abordá-los e fazer a pergunta, em vez de tentar fazer isso sozinho e errar, não há absolutamente nada de errado em pedir ajuda - especialmente quando é tão importante quanto isso.
Espero que isso ajude você e desejo-lhe boa sorte em sua busca... ;-)
O Sr. Brownstone acertou em cheio. Agora, para ajudá-lo um pouco, aqui está minha função "garble", usada para ofuscar strings (resultados engraçados com nomes!). Passe uma string, ela retorna uma string distorcida. Inclua-o em instruções de atualização em colunas de string. Altere o comprimento dos dados como achar melhor.
Eu tive que fazer isso para os dados de vendas no varejo dos meus clientes. Para nomes, fui ao censo e baixei todos os nomes e sobrenomes, executei-os em um loop para juntar cada primeiro a cada último, adicionei o código de sexo e o carreguei em uma tabela em letras maiúsculas. Eu então tinha uma tabela com cerca de 400 milhões de nomes únicos. Usei letras maiúsculas, pois nossos dados atuais não estavam em letras maiúsculas, para que eu pudesse informar mais facilmente os dados que foram apagados.
Quando limpei meus dados de usuário, troquei os nomes, para aniversário, coloquei todos em 1º de janeiro do ano em que realmente nasceram e atualizei todos os números de telefone com seu código postal (meus dados eram apenas nos EUA). Os endereços de e-mail tornaram-se a inicial mais o sobrenome @mycompany.co. O endereço postal me deu mais dor, mas mantive a cidade, estado e CEP porque acredito que eles não sejam um problema se o endereço for alterado. Eu tinha um colega de trabalho que tinha algum programa que gerava letras ilegíveis e atualizava a linha de endereço com isso.
Em qualquer lugar que eu tinha dados duplicados, mas ainda tinha um FK para o usuário principal (design ruim sim, mas não meu), atualizei esses dados também para que o nome fosse consistente em todo o banco de dados para o usuário x.
No geral, meus dados ainda eram muito legíveis, embora o endereço não fizesse sentido. Levei alguns dias para fazer tudo isso funcionar, mas uma vez que foi feito e um trabalho de agente sql foi criado, eu pude limpar os dados em menos de 15 minutos.
Para ofuscar um único campo, que tal usar a função HASHBYTES (no SQL 2008+)? Você pode escolher seu algoritmo (MD5 provavelmente é suficiente) desde que salgue seus dados. Então, em vez de apenas
SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD>)
certificar-se de que você fazSELECT HASHBYTES('SHA2_256', <LAST NAME FIELD> + '<my salt string>')
e agora você tem um hash que não pode ser facilmente forçado.É uma função real que é suportável, repetível e provavelmente muito mais rápida. Dependendo de quanto você precisa para realmente proteger versus apenas ofuscar, você também pode usar um hash mais fraco e mais rápido.
Dê uma olhada no módulo dbatools PowerShell para obter uma opção gratuita para Static Data Masking, escrito por Chrissy Lemaire (@chrissy-lemaire) e sua equipe. Todas as ferramentas deles são ótimas, então tenho certeza que vale a pena dar uma olhada.
Os dois comandos para procurar em dbatools são: New-DbaDbMaskingConfig Invoke-DbaDbDataMasking
Dê uma olhada na postagem do blog anunciando isso: mascaramento de dados automatizado