本番データをdumpし、個人情報を含むカラムを指定のマスク方式でマスクしたdumpファイルを吐き出すgemを作った。
2017 SpeeeKaigi #3本番データを安全,簡単に利用する株式会社 Speee佐々木 延也SpeeeKaigi1
View Slide
Pro le佐々木 延也三重県出身中日/HipHop/ビシエド が好き今年の8月1日 Speee入社前職はグルメ系WebサービスのWebエンジニア/AndroidエンジニアSpeeeKaigi2
みなさん本番データでテストしてますか?SpeeeKaigi3
本番データでテストするメリットSpeeeKaigi4
本番データでテストするメリット1.ユーザー目線にたってテストができる(失敗例)ユーザーは写真の順番にこだわりを持っていることが多い。しかし開発環境の画像データが適当だったため、そのことに気づかずデータ修正時に順番がバラバラになってしまった。SpeeeKaigi5
本番データでテストするメリット2.色々なパターンのデータでテストができる(失敗例)特定の条件下でインポートしたデータには通常のライフサイクルでは存在するはずのデータがなく、それが原因でEXCEPTIONが発生した。SpeeeKaigi6
本番データでテストするメリット3.パフォーマンスの検証ができる(失敗例)開発DBと本番DBで統計情報が異なっていたため開発環境ではindexが使われていたが本番では使われていなかった。それが原因でSlowクエリが頻発し一部のAPサーバーがダウンしてしまった。SpeeeKaigi7
なぜ本番データのテストが活発でなかったのか?SpeeeKaigi8
個人情報を保護してデータを持ってくるのが大変だからSpeeeKaigi9
大変な理由①1.本番環境への影響を避ける必要性mysqldumpのオプションでテーブルlockしてしまったりするオペミスが起きうる。レプリケーションで持ってくる場合は本番DBの設定を変える必要がある。SpeeeKaigi10
大変な理由②2.元の形式を維持する必要性理由アプリのバリデーションにかからないようにするため(例)電話番号元データ ✕◯03-3333-4444 0000000000 03-1000-0000SpeeeKaigi11
大変な理由③3. DBのUnique制約を回避する必要性「全て同じ文字列で埋める」などの方法ではDBのUnique制約にかかってしまうことがある。SpeeeKaigi12
これらの要件を満たす、いい解決策がなかったのでSpeeeKaigi13
mozaicSpeeeKaigi14
Gemを作った(まだprivate...)SpeeeKaigi15
実現したい機能要件1.大規模なデータのdumpのパフォーマンスが問題ないこと2.コマンド1つで実現できること3.カラムごとにData Masking方式を切り替えられること4.適切なData Masking方式がなかったら、ユーザーが自分でRubyのマスク処理を行えること5. MySQL, PostgreSQLに対応SpeeeKaigi16
実現したい機能要件1.大規模なデータのdumpのパフォーマンスが問題ないこと2.コマンド1つで実現できること3.カラムごとにData Masking方式を切り替えられること4.適切なData Masking方式がなかったら、ユーザーが自分でRubyのマスク処理を行えること5. MySQL, PostgreSQLに対応SpeeeKaigi17
実現方法SpeeeKaigi18
3.カラムごとにData Masking方式を切り替えられること---user: roothost: localhostport: 3306db:name: sample_developmentrdbms: mysqltables:- name: ownerscolumns:- name: phone_numbermethod: tel # Data Masking方式- name: userscolumns:- name: mailmethod: email # Data Masking方式SpeeeKaigi19
3.カラムごとにData Masking方式を切り替えられること組み込みのData Masking方式方式 マスク方法tel電話番号の体裁を保ったままマスクするemailメールアドレスの体裁を保ったままマスクするshuf e各レコードの順番を入れ替えるblackout任意の文字、数字で埋めるSpeeeKaigi20
4.適切なData Masking方式がなかったら、ユーザーが自分でRubyのマスク処理を行えることmaskメソッドとコンストラクタを持つRubyのクラスを指定ディレクトリに格納し、YAMLの設定ファイルにクラス名を小文字で記載すると独自のマスク処理を行える。module Mozaic::MaskMethod::Pluginclass SampleMaskdef initialize(records, column_name); ;enddef mask; ;endendendSpeeeKaigi21
今後追加する予定の機能Data Masking方式のブラッシュアップPlugin機構の導入差分更新できるようにする環境変数からクレデンシャルを取得できるようにするPostgreSQL対応SpeeeKaigi22
ご清聴ありがとうございましたSpeeeKaigi23