Ofuscação de dados no SQL Server

43

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 queremos fazer isso rapidamente, e com um nível mais alto de obsfucação, que abordagem deve ser adotada? Estou pensando em Personagem lutando pelo nome e sobrenome das pessoas, mas como? Devo criar uma função pessoalmente ou há funções predefinidas disponíveis 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 existe uma maneira melhor de fazer isso?

Céu
fonte

Respostas:

25

Eu gostaria de poder te votar 100 pontos apenas por pensar nisso! Eu já vi esse assunto esquecido tantas vezes que é falso - tão bem feito. Pelo que entendi, você realmente deseja embaralhar os dados dentro dos próprios campos e, embora entenda o que você está tentando alcançar, pode não ser muito 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 assegurando que, ao mover seus dados para fora da produção para o UAT, eles sejam confundidos, para que não sejam facilmente mapeados novamente para a pessoa original - especialmente quando você confunde nomes e sobrenomes.

No entanto, isso não resolve o problema, por exemplo, 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 reais, etc ... eles simplesmente não são atribuídos à pessoa correta. Para isso, recomendo que, sempre que possível, limpe esses dados antes de passá-los para o UAT, o Red Gate faça um software chamado Data Generator que possa criar dados de teste aleatórios para você, para que você possa repovoar os campos com dados que possam ser testados.

Quanto à mistura de dados: existem muitos aplicativos que fazem isso por você e, honestamente, você está correto ao não querer reinventar a roda. O que usamos em nossa empresa é um produto chamado Data Masker por uma empresa chamada Net2000. A licença é bastante barata, funciona extremamente rápido e você não precisa se preocupar em desativar todas as suas restrições antes de embaralhar o banco de dados.

Obviamente, você pode lançar sua própria solução, caso não encontre algo que atenda aos seus requisitos - se você decidir fazer isso, recomendo fortemente o uso de procedimentos CLR para fazer isso, pois é muito mais flexível que o TSQL puro (para não dizer que você não pode usar o TSQL, veja aqui ).

Depois de escolher um aplicativo para fazer isso, a próxima coisa que você precisa decidir é: o que você realmente deseja / precisa embaralhar? Honestamente, seu melhor recurso para isso é a equipe jurídica da sua empresa e / ou os auditores da empresa. Sei que às vezes podemos não gostar de trabalhar com eles, mas eles serão muito mais agradáveis ​​por abordá-los e fazer a pergunta a eles, em vez de tentar fazê-lo por conta própria e cometer erros, 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 ... ;-)

Mr.Brownstone
fonte
1
Se eu pudesse, daria um voto positivo adicional por mencionar a política da empresa.
Dezso
Os requisitos legais são determinados pelas partes interessadas. Eu deveria implementá-lo agora.
Sky
Sr. Bownstone, sua explicação é excelente, como sempre. Obrigado. Vou verificar a função CLR para isso e ficar de olho no T-SQL também. Veja qual se encaixa melhor e é mais rápido de construir.
Sky
10

O Sr. Brownstone acertou a unha na cabeça. Agora, para ajudá-lo um pouco, aqui está minha função "garble", usada para ofuscar seqüências de caracteres (resultados engraçados com nomes!). Passe uma string, ela retornará uma string ilegível. Inclua-o nas instruções de atualização nas colunas da string. Mude o comprimento dos dados como achar melhor.

---------------------
-- 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
fonte
3
Soa familiar? (Apenas uma ilustração do seu argumento.) Sobre o SQL Server através de um epotowo konotho. um exemplo prévio do Meprepelas threomwore no Waph SQL. Prevemos as respostas a perguntas mais frequentes sobre o pravope sekper ergonazopaens. para omitir o método de pesquisa de dados do SQL Server Mogozane na análise de dados do p-SQL 101, os resultados são orpakles / e-bek. uma grande mudança no SQL Server, tanto nos países terceiros quanto no SQL 4.2.
dezso '
1
heh ... demorei um pouco para reconhecê-lo. Parece haver muitas palavras sem erros aqui. Eu só o usei contra nomes, sobrenomes e nomes de cidades. Apenas uma pequena função boba. Eu não apostaria minha carreira nisso.
datagod
Agradeço a abordagem - mantida simples, mas funcionando. E uma vantagem é que o texto ainda é legível. Eu não poderia compreendê-lo embora :)
Dezso
7

Eu tive que fazer isso pelos dados de vendas de varejo de meus clientes. Para nomes, fui ao censo e baixei todos os nomes e sobrenomes, os executei por um loop para juntar todos os nomes, adicionei código sexual e o carreguei em uma tabela com todas as letras maiúsculas. Eu tinha uma mesa 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 dizer com mais facilidade os dados que foram apagados.

Quando esfreguei meus dados de usuário, troquei os nomes; no aniversário, coloquei todo mundo em 1º de janeiro do ano em que eles realmente nasceram e atualizei qualquer número de telefone com seu CEP (meus dados eram apenas nos EUA). Os endereços de email tornaram-se os primeiros iniciais e o sobrenome @ minhaempresa.com. O endereço postal me causou mais luto, mas mantive a cidade, o estado e o CEP porque acredito que não serão 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 onde eu tinha dados duplicados, mas ainda tinha um FK para o usuário principal (design ruim sim, mas não o meu), eu também atualizei esses dados para que o nome fosse consistente no banco de dados do usuário x.

No geral, meus dados ainda eram muito legíveis, embora o endereço não fizesse sentido. Demorei alguns dias para que tudo funcionasse, mas uma vez concluído e um trabalho de agente sql foi criado, eu pude limpar os dados em apenas 15 minutos.

user9164
fonte
Eu gosto da sua abordagem. Em relação ao nome e sobrenome, acho que se o conjunto de dados for grande o suficiente, com um bom nível de variação, podemos usá-lo como fonte, em vez de precisar fazer o download de nomes no site do censo. Consultar os dados pelo SELECT DISTICT nos informará muitos valores únicos com os quais devemos brincar.
Sky
0

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 você salte seus dados. Então, em vez de apenas SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD>) certificar-se de que sim, SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD> + '<my salt string>')e agora você tem um hash que não pode ser facilmente brutalmente forçado.

É uma função real que é suportável, repetível e provavelmente muito mais rápida. Dependendo de quanto você precisa realmente proteger contra apenas ofuscar, você também pode usar um hash mais fraco e rápido.

cmcapellan
fonte
Você não deve usar o MD5 hoje em dia, é inerentemente inseguro.
precisa saber é
OK ... aqui estão suas escolhas com HASHBYTES: MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 Algo para todos !! (incluindo, sim, aqueles que você não deve usar). Então, digamos que estamos usando o SHA2_512 ... mais alguma coisa problemática com essa abordagem?
cmcapellan
-1

Dê uma olhada no módulo dbatools PowerShell para obter uma opção gratuita do Static Data Masking, escrito por Chrissy Lemaire (@ chrissy-lemaire) e sua equipe. Todas as ferramentas são ótimas, por isso tenho certeza de que vale a pena dar uma olhada.

Os dois comandos para procurar no dbatools são: New-DbaDbMaskingConfig Invoke-DbaDbDataMasking

Dê uma olhada na postagem do blog que anuncia isso: mascaramento automatizado de dados

cmcapellan
fonte
2
As respostas apenas para links não são muito úteis. Você pode melhorar sua resposta, dando exemplos de como usar os cmdlets etc.
Erik Darling