Zaciemnianie danych w SQL Server

43

Jaka jest najlepsza praktyka zaciemniania danych w programie SQL Server?

Chcemy wykorzystywać zamaskowane dane produkcyjne w naszym systemie UAT.

Jeśli chcemy to zrobić szybko i przy większym stopniu zaciemnienia, jakie podejście należy zastosować? Mam na myśli mieszanie się postaci w imię i nazwisko ludzi, ale jak? Czy powinienem sam utworzyć funkcję, czy są dostępne jakieś predefiniowane funkcje? Nie chcę tracić czasu na wymyślanie koła :)

Co powiesz na pola daty? Na przykład, czy data urodzenia powinna być losowo wybierana z całej tabeli i przypisywana do rekordu, czy jest na to lepszy sposób?

Niebo
źródło

Odpowiedzi:

25

Żałuję, że nie mogłem przegłosować 100 punktów za samo myślenie o tym! Widziałem ten temat pomijany tyle razy, że jest nieprawdziwy - tak dobrze zrobione. Z tego, co rozumiem, tak naprawdę chcesz szyfrować dane w samych polach i chociaż rozumiem, co próbujesz osiągnąć, może nie być to konieczne - chociaż należy to rozpatrywać indywidualnie.

Większość przepisów dotyczących ochrony danych dotyczy zdolności prawidłowego powiązania danych z osobą - na przykład daty urodzenia lub numeru telefonu. Możesz spełnić wymagania prawa, upewniając się, że dane przeniesione z produkcji do UAT są pomieszane, więc nie można ich łatwo odwzorować na oryginalną osobę - szczególnie, gdy zbierasz imiona i nazwiska.

Nie rozwiązuje to jednak problemu, na przykład powiedzmy danych kontaktowych. Możesz spełnić wymagania prawa, mieszając dane, ale numery telefonów są nadal rzeczywiste, e-maile wciąż prawdziwe itp. ... nie są po prostu przypisane do właściwej osoby. W tym celu zalecam, jeśli w ogóle możliwe wyczyszczenie tych danych przed przekazaniem ich do UAT, Red Gate wykona oprogramowanie o nazwie Generator danych, które może tworzyć losowe dane testowe, aby można było ponownie wypełnić pola danymi, które można przetestować.

Jeśli chodzi o szyfrowanie danych: istnieje wiele aplikacji, które robią to za Ciebie i szczerze mówiąc, masz rację, nie chcąc wymyślać koła na nowo. Ten, którego używamy w naszej firmie, to produkt o nazwie Data Masker firmy Net2000. Licencja jest dość tania, działa bardzo szybko i nie musisz się martwić o wyłączenie wszystkich ograniczeń przed szyfrowaniem bazy danych.

Możesz oczywiście wdrożyć własne rozwiązanie, jeśli nie znajdziesz niczego, co spełnia twoje wymagania - jeśli zdecydujesz się to zrobić, zdecydowanie polecam skorzystanie z procedur CLR, ponieważ jest to o wiele bardziej elastyczne niż czysty TSQL (nie mówiąc, że nie można używać TSQL, patrz tutaj ).

Po wybraniu aplikacji do wykonania tej czynności, kolejną rzeczą, którą musisz zdecydować, jest to, czego naprawdę chcesz / musisz się zmieszać? Szczerze mówiąc, najlepszym źródłem informacji jest zespół prawny firmy i / lub audytorzy firmy. Wiem, że czasami nie lubimy z nimi współpracować, ale będą dla ciebie o wiele milsi, jeśli podejdziesz do nich i zadasz im pytanie, zamiast próbować zrobić to samemu i zrobić to źle, nie ma absolutnie nic złego w proszeniu o pomoc - szczególnie gdy jest to tak ważne jak to.

Mam nadzieję, że to ci pomoże i życzę powodzenia w twoich poszukiwaniach ... ;-)

Mr.Brownstone
źródło
1
Gdybym mógł, dałbym dodatkowe miejsce na wzmiankę o polityce firmy.
dezso,
Wymagania prawne są określane przez interesariuszy. Powinienem to teraz wdrożyć.
Niebo
Panie Bownstone, pańskie wyjaśnienia są jak zawsze doskonałe. Dziękuję Ci. Sprawdzę pod tym kątem funkcję CLR i mam oko na T-SQL. Zobacz, który pasuje lepiej i jest szybszy w budowie.
Niebo
10

Pan Brownstone uderzył w paznokieć prosto w głowę. Teraz, aby trochę ci pomóc, oto moja funkcja „garble”, używana do zaciemniania łańcuchów (śmieszne wyniki z nazwami!). Przekaż ciąg, zwraca zniekształcony ciąg. Uwzględnij go w instrukcjach aktualizacji względem kolumn ciągów. Zmień długość danych według własnego uznania.

---------------------
-- 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
źródło
3
Brzmi znajomo? (To tylko przykład twojego punktu.) Om SQL Server to eppowo konotho. a om phe presathenp ef Meprepelas threomwore onth kekang Waph SQL. Prevathe thopobose kensilponps pe voraeis piblak onth pravope sekper ergonazopaens. Omówiono również użycie programu SQL Server Mogozane on phe oipher ef phe p-SQL 101 seraes ef orpakles / e-bek. hove ben o SQL Server thBo zatopił oba elth thoys ef SQL 4.2.
dezso
1
heh ... zajęło mi trochę czasu, żeby to rozpoznać. Wydaje się, że jest tam wiele nieskalanych słów. Użyłem go tylko przeciwko imionom, nazwiskom, nazwom miast. Po prostu głupia mała funkcja. Nie postawiłbym na to mojej kariery.
datagod
Doceniam to podejście - proste, ale działające. Plusem jest to, że tekst jest nadal czytelny. Nie mogłem tego zrozumieć :)
dezso,
7

Musiałem to zrobić dla danych sprzedaży detalicznej moich klientów. W przypadku imion poszedłem do spisu powszechnego i pobrałem wszystkie imiona i nazwiska, poprowadziłem je przez pętlę, aby połączyć się od pierwszego do ostatniego, dodałem kod płci i załadowałem go do tabeli wielkimi literami. Potem miałem tabelę z około 400 milionami unikalnych nazw. Użyłem wielkich liter, ponieważ nasze bieżące dane nie były pisane dużymi literami, więc łatwiej było stwierdzić, które dane zostały wyczyszczone.

Kiedy wyczyściłem moje dane użytkownika, wymieniłem nazwiska, na urodziny przekazałem wszystkim 1 stycznia roku, w którym się urodzili i zaktualizowałem numery telefonów za pomocą kodu pocztowego (moje dane były tylko w USA). Adresy e-mail stały się początkowe i nazwisko @ mojafirma.co. Adres pocztowy sprawił mi najwięcej bólu, ale zachowałem miasto, stan i kod pocztowy, ponieważ uważam, że nie będzie to problemem, jeśli adres zostanie zmieniony. Miałem współpracownika, który miał program, który generował zniekształcone litery i zaktualizował o to linię adresową.

Gdziekolwiek miałem zduplikowane dane, ale nadal miałem FK dla głównego użytkownika (zły projekt tak, ale nie mój), zaktualizowałem te dane, aby nazwa była spójna w bazie danych dla użytkownika x.

Ogólnie moje dane były nadal bardzo czytelne, chociaż adres nie miał żadnego sensu. Zajęło mi to kilka dni, aby wszystko to działało, ale kiedy to zostało zrobione i utworzono zadanie agenta SQL, mogłem wyczyścić dane w zaledwie 15 minut.

użytkownik9164
źródło
Lubię twoje podejście. Jeśli chodzi o imię i nazwisko, myślę, że jeśli zbiór danych jest wystarczająco duży, z dobrym poziomem zmienności, możemy go użyć jako źródła, zamiast pobierać nazwiska ze strony spisu ludności. Zapytanie o dane przez SELECT DISTICT pokaże nam wiele unikalnych wartości, z którymi musimy się bawić.
Niebo
0

Aby zaciemnić pojedyncze pole, skorzystaj z funkcji HASHBYTES (w SQL 2008+)? Możesz wybrać algorytm (prawdopodobnie wystarczy MD5) pod warunkiem, że posolisz swoje dane. Zamiast tego po prostu SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD>) upewnij się, że masz, SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD> + '<my salt string>')a teraz masz skrót, którego nie można łatwo brutalnie wymusić.

Jest to faktyczna funkcja, która jest obsługiwana, powtarzalna i prawdopodobnie znacznie szybsza. W zależności od tego, ile potrzebujesz naprawdę zabezpieczyć, a nie tylko zaciemnić, możesz także użyć słabszego i szybszego skrótu.

cmcapellan
źródło
Nie powinieneś używać MD5 w dzisiejszych czasach, jest to z natury niepewne.
Philᵀᴹ
OK ... oto twoje wybory z HASHBYTES: MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 Coś dla każdego !! (w tym tak, których nie powinieneś używać). Powiedzmy, że używamy SHA2_512 ... coś jeszcze problematycznego z tym podejściem?
cmcapellan
-1

Spójrz na moduł PowerShell dbatools, aby uzyskać bezpłatną opcję maskowania danych statycznych, napisaną przez Chrissy Lemaire (@ chrissy-lemaire) i jej zespół. Wszystkie ich narzędzia są świetne, więc jestem pewien, że warto to sprawdzić.

Dwa polecenia do wyszukiwania w dbatools to: New-DbaDbMaskingConfig Invoke-DbaDbDataMasking

Spójrz na post na blogu informujący o tym: automatyczne maskowanie danych

cmcapellan
źródło
2
Tylko odpowiedzi na linki nie są zbyt pomocne. Możesz poprawić swoją odpowiedź, podając przykłady użycia poleceń cmdlet itp.
Erik Darling,