SQL Serverでのデータ難読化のベストプラクティスは何ですか?
UATシステムでマスクされたProductionデータを使用したいと思います。
それを迅速に行う必要があり、難読化のレベルが高い場合、どのようなアプローチを取るべきですか?人の名字、苗字の文字スクランブルを考えていますが、どうですか?関数を自分で作成する必要がありますか、それとも使用できる定義済みの関数がありますか?ホイールの再発明に時間をかけたくありません:)
日付フィールドはどうですか?たとえば、生年月日をテーブル全体からランダムに選択してレコードに割り当てる必要がありますか、それともより良い方法がありますか?
これについて考えただけで100点満点になりそうです。私はこの主題を見過ごすことが何度もあり、それが真実ではないのを見てきました。私が理解していることから、実際にはフィールド内のデータをスクランブルしたいと考えています。私があなたが達成しようとしていることは理解していますが、そうすることはそれほど必要ではないかもしれません-ケースバイケースで検討する必要があります。
ほとんどのデータ保護法は、生年月日や電話番号などのデータを個人に正しく関連付ける機能を中心に展開しています。データを本番環境からUATに移動するときに、データがごちゃ混ぜにされて元の人に簡単に再マッピングされないようにすることで、法律の要件を満たすことができます。特に、姓名をごちゃごちゃにする場合。
ただし、これは連絡先の詳細などの問題には対応していません。データをごちゃごちゃにすることによって法律の要件を満たすことができますが、電話番号はまだ本物であり、電子メールはまだ本物のままです...それらは正しい人に割り当てられていないだけです。このため、データをUATに渡す前に可能な限りクリアする場合、Red Gateは Data Generator と呼ばれるソフトウェアを実行し、ランダムなテストデータを作成して、フィールドに再入力できるようにすることをお勧めしますテストできるデータ。
データのスクランブルについては、これを実行する多くのアプリケーションが存在します。正直なところ、ホイールの再発明を望まないのは正解です。弊社で使用しているのは、Net2000という会社の Data Masker という製品です。ライセンスは非常に安価で、非常に高速に動作し、データベースをスクランブルする前にすべての制約を無効にする必要がないか心配する必要はありません。
もちろん、要件を満たすものが見つからない場合は、独自のソリューションをロールできます。これを行う場合は、純粋なTSQLよりもはるかに柔軟性があるため、CLRプロシージャを使用して実行することを強くお勧めします(言うまでもなくTSQLは使用できません ここ を参照)。
これを実行するアプリケーションを選択したら、次に決定する必要があるのは、実際にスクランブルをかけたい/必要なものは何ですか?正直なところ、このための最良のリソースは、会社の法務チームまたは監査人です。私は時々彼らと一緒に仕事をしたくないかもしれないことを知っていますが、彼らは彼らにアプローチして彼らに質問をする方が自分自身でそれを誤解しようとするよりもはるかに良いでしょう、助けを求めることは全く問題ありません-特にそれがこれと同じくらい重要な場合。
これがあなたのお役に立てば幸いです。そしてあなたの探求の中で幸運を祈ります... ;-)
ブラウンストーン氏は頭の上の爪を直撃した。ここで、少し手助けするために、文字列を難読化するために使用する私の「文字化け」関数を示します(名前の付いた面白い結果です!)。文字列を渡すと、文字化けした文字列が返されます。文字列列に対する更新ステートメントにそれを含めます。必要に応じてデータ長を変更します。
---------------------
-- 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
私はこれをクライアントの小売り販売データのために行わなければなりませんでした。名前については、国勢調査に行ってすべての姓と名をダウンロードし、ループを実行してすべての姓から名を結合し、性別コードを追加して、すべて大文字でテーブルにロードしました。次に、約4億の一意の名前を持つテーブルを作成しました。現在のデータは大文字ではなかったので大文字を使用しました。これにより、スクラブされたデータをより簡単に識別できるようになりました。
ユーザーデータをスクラブしたとき、名前を交換しました。誕生日には、全員が生まれた年の1月1日に実際に生まれ、電話番号を郵便番号で更新しました(私のデータは米国のみでした)。メールアドレスは、最初と最後の名前@ mycompany.coの最初の名前になりました。住所が一番悲しかったですが、住所が変更されても問題はないと私が考えているので、私は市、州、郵便番号を保持しました。同僚に、文字化けした文字を生成して住所行を更新するプログラムがあった。
データを複製したものの、メインユーザーにFKがあった(設計が悪いが、私のものではない)場合はどこでもデータを更新して、ユーザーxのデータベース全体で名前が一致するようにしました。
住所は意味がありませんでしたが、全体的に私のデータは非常に読みやすかったです。これらすべてが機能するまでに数日かかりましたが、それが完了してSQLエージェントジョブが作成されたら、わずか15分でデータをスクラブできました。
Chrissy Lemaire(@ chrissy-lemaire)と彼女のチームが作成した静的データマスキングの無料オプションについては、dbatools PowerShellモジュールをご覧ください。彼らのツールはすべて素晴らしいので、これは一見の価値があると確信しています。
Dbatoolsで検索する2つのコマンドは次のとおりです。New-DbaDbMaskingConfig Invoke-DbaDbDataMasking
これを発表しているブログ投稿を見てください: 自動データマスキング
単一のフィールドを難読化するために、HASHBYTES関数(SQL 2008以降)を使用するのはどうですか?データをソルト処理する場合は、アルゴリズムを選択できます(MD5でおそらく十分です)。したがって、単にSELECT HASHBYTES('SHA2_256', <LAST NAME FIELD>)
を実行する代わりに、SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD> + '<my salt string>')
を実行して、ブルートフォースを簡単に実行できないハッシュを作成してください。
これは、サポート可能で繰り返し可能な実際の機能であり、おそらくはるかに高速です。本当に安全にする必要があるか、単に難読化する必要があるかに応じて、より弱い、より速いハッシュを使用することもできます。