web-dev-qa-db-ja.com

サーバーを離れる前にpg_dump出力を匿名化する方法は?

開発目的で、本番データベースをローカルにダンプします。 DBが十分に小さいので問題ありません。会社は成長しており、リスクを減らしたいと考えています。そのために、データベースサーバーを離れる前にデータを匿名化します。

私たちが考えた解決策の1つは、pg_dumpの前にステートメントを実行することですが、同じトランザクション内で次のようになります。

BEGIN;
UPDATE users
SET email = 'dev+' || id || '@example.com'
  , password_hash = '/* hash of "password" */'
  , ...;
-- launch pg_dump as usual, ensuring a ROLLBACK at the end
-- pg_dump must run with the *same* connection, obviously

-- if not already done by pg_dump
ROLLBACK;

これに対する既製のソリューションはありますか?私たちのDBはHerokuでホストされており、ダンプする方法に100%の柔軟性はありません。

postgresql anonymize data dump before download とバリエーションを検索しましたが、関連性の高いものは見つかりませんでした。

データを匿名化しようとする場合、解決すべき4つの難しい問題があります。それについてまとめます 私の古いブログ投稿 それについて:

1:匿名化されたデータはサイズが大きくなる可能性があります。たとえば、人々の名前がある場合、匿名の名前をすべて持つ必要はありません元のデータと正確に同じ長さ。データをそのまま変更する場合、データが大きくなりすぎて収まらないようにするために、ソリューションは元のフィールド名の長さを理解する必要があります。

2:匿名化されたデータには異なる統計分布があります。生年月日フィールドがあるとしましょう-日付を完全にランダム化できますが、その後特にパフォーマンステストを行う場合は、反対側ではあまり意味がありません。プラス...

3:匿名化されたデータは参照整合性を破壊します。悪い考えですが、匿名化が必要なフィールドでアプリケーションが結合する場合があります。これを見たことはありませんが、複数のテーブルでメールアドレスを使用していて、それらに参加するか、関連する注文を見つけることを期待している人を見てきました。

4:匿名化するとエクスポートが遅くなります。ある種のビジネスロジックを実行して、どの列を匿名化する必要があるかを決定し、次に生成する必要があります。その代わりに新しいデータ。

私はかつてこの問題を解決できれば金持ちになると言っていましたが、それでも競争はあります。 Delphix は、DB2、Oracle、SQL Serverなどのデータマスキングを行いますが、PostgresやHerokuはまだカバーされていないと思います。

2
Brent Ozar

このブログ投稿 Michael Krenzによる、開発者向けのデータ処理の1つの方法の概要。

基本的に、戦略は定期的に(おそらくcronジョブを介して)別のデータベースインスタンスにダンプおよび復元し、一連のSQLステートメントを含む関数を実行して、データをスクランブルし、機密データを削除または削除することです。その後、開発者は匿名化されたデータベースから直接ダンプします。

1
NoelProf