皆さんこんにちは。
現在請求管理ロボ開発チームで活動している塚本です。
去年までSREチームの方で運用改善やインフラ周りを担当していました。
その際に着手した「個人情報をマスキングした調査環境を整える件」を実装するまでの道のりと、その後どうなったか振り返っていきたいと思います。
今回、個人情報をマスキングした環境を作るということで、技術選定から始めていきましたが、運用コストや学習コストなどを加味してMySQLのビューを利用することになりました。
その時に比較した他の方法はこちら。
AWS DMSを使う方法
AWSのサービスであるDMSを利用してクローン/リードレプリカに対してマスキング・データ連携する方法。
MySQLをそのまま流用できるが、頻繁に連携が必要なので、料金がかさんでしまうのが懸念。
DataSunriseを使う方法
DataSunrise はサードパーティの製品で、DBからのデータをマスクするプロキシのようなもの。
DB保護に関する機能が充実していて便利だが、DataSunriseをEC2上で動かしているので、そのメンテナンスがコストになりそう。あと料金がお高い。
Amazon Redshift Serverlessを使う方法
クラスタを立てるよりは安いが、ポスグレベースのクエリを使うため、使用者の学習コストが懸念される。
これらに比べてMySQLのビューは
- インスタンス内で完結するためAWSリソースの運用コストがかからない
- 実装の手軽さ
- 使用者の学習コスト
- 金銭的なコスト
- 他のサービスはサービス停止した際にマスキングが剥がれる可能性が高い
などが利点として上回ったため、MySQLのビューを利用することになりました。
ビューとは?
ビューとは既存のテーブルを元に作られる仮想のテーブルです。
- 既存のテーブルのコピーのようなイメージ。
- ビューを別のDBスキーマに作成することも可能。
- ビューに対してSELECT 文で普通のテーブルのようにデータを取得できる。
ビューの作成方法
CREATE VIEW ステートメントを利用してビューを定義します。
ref: https://dev.mysql.com/doc/refman/8.0/ja/create-view.html
例)
- prodDBのuserテーブルを元に、prod_viewDBにビュー(テーブル名はuser)を作成する
- userテーブルのカラムはuser_id、user_nameで、user_nameのみを「*****」という文字列でマスキングする
create view prod_view.user as select user_id, '*****' as user_name from prod.user;
ビュー使用上の注意点
ビューを更新するとき
- ALTER VIEW文でビュー定義を変更できる。
- ADD文が無いので、追加するカラム以外も全て再定義する必要がある
これはできない
ALTER VIEW prod_view.user ADD user_category
追加したい時
ALTER prod_view.user as select user_id, '*****' as user_name, user_category from prod.user;
DBユーザーの権限設定
- DBのGUIクライアントツールによっては、SELECT権限だけでは足りない時がある。
- SHOW VIEW権限もDBユーザーにつけてあげる必要がある
- Sequel Ace(https://sequel-ace.com)などで発生。原因としては、Sequel AceがSHOW VIEWステートメントを利用してDB定義を取ってこようとしていることみたいでした。
- EXPLAINの実行にはビューの元になっているテーブルの参照権限が必要そう
ビューを運用してみてどうだったか??
実装工数の肥大化
現状の運用では、DBスキーマを変更する際にはマイグレーションファイルを書くのですが、合わせてビューに対するマイグレーションファイルも書く運用をしています。
そのため、なるべく学習コストや運用コストを減らすという方向で技術選定したが、マイグレーションの実装というところで一手間増えてしまいます。
今後はマスキングするカラムの定義を同一ファイルに集約してマイグレーション後にビューのマイグレをするなどできたら工数が減りそうだな、とか考えてます。
ビューとは何か、を理解するところでハードルがありそうだと感じたのですが、開発チームの皆さんのキャッチアップがかなり早く、初期の実装も色んな方がリファクタして下さって、かなり改善された感じがあります。本当に感謝です。
権限の制御
開発だけでなく、営業やサポートの方もDBを閲覧するため、ユーザーにどこまでの権限を持たせるか、というところの塩梅が難しかったです。
DBをRedashなどのツールを介して調査に利用しているところもあり、その際の権限管理に運用コストが発生しているのがネックです。
最後に
これまでビューについて触れてきましたが、個人的にはMySQLの権限や機能が勉強できて面白かったし、いい経験になりました。今後もこのビューが多方面で負担をかけないように改善していきたいです。
We are hiring!!
ROBOT PAYMENTでは一緒に働く仲間を募集しています!!!
speakerdeck.com
www.robotpayment.co.jp