LiBz Tech Blog

LiBの開発者ブログ

MariaDB MaxScale を使ってデータベース内の個人情報をリアルタイムにマスクする

f:id:truego:20190822170135p:plain

これまで、データベース内のデータを分析するために、別途個人情報などをマスクしたデータベースを作成し re:dash から参照していました。 ただ、マスク処理にある程度時間がかかるため、参照できるのが前日のデータであるなどリアルタイム性に課題がありました。

これを、今回 MariaDB MaxScale(以下 MaxScale)というソフトウェアを使い、リアルタイムにマスク処理されたデータを参照できるようになりましたのでご紹介します。

MariaDB MaxScale とは

MaxScale は、MariaDB・MySQL用のプロキシソフトウェアで、読み込み/書き込みの分散、自動フェイルオーバーなど多数の機能がありますが、その1つにデータマスキング機能があり、今回はこの機能を使用しています。

構成イメージ

f:id:truego:20190822140928p:plain

構成は、上記の通り、参照するクライアント(今回は re:dash)とデータベース(MySQL: 弊社環境では RDS または Aurora)の間に MaxScale を挟むだけのシンプルな構成です。

データを参照する際、データベースに直接接続する代わりに MaxScale に接続することで、後述するマスキングルールにしたがって データがマスクされて出力されます。

MaxScale の設定

今回のようなデータマスキング用途で必要な MaxScale の設定は、例えば下記のようなものです。 DBへの接続情報とデータマスキング用設定ファイルの指定などが必要です。

...
[maxscale]
threads=auto

[server1]
type=server
address=<DBFQDN>
port=3306
protocol=MariaDBBackend

[Masking]
type=filter
module=masking
rules=/etc/maxscale.cnf.d/masking_rules.json
...
[Read-Only-Service]
type=service
router=readconnroute
servers=server1
user=<dbuser>
password=<dbpassword>
router_options=slave
filters=Masking
...
[Read-Only-Listener]
type=listener
service=Read-Only-Service
protocol=MariaDBClient
address=0.0.0.0
port=4008
...

MaxScale への接続は、上記の Read-Only-Listener で設定したポートにMySQLに接続するのと同じように接続することができます。

マスキングルール

どのデータをどのようにマスクするか?という設定は、以下のような設定ファイル(masking_rules.json)で行います。

マスキングルールの指定例(データベース、テーブル名、カラムなどを指定する)

{
    "rules": [
        ...
        {
            "replace": {
                "database": "database1",
                "table": "users",
                "column": "name"
            },
            "with": {
                "fill": "X"
            }
        },
        {
            "replace": {
                "database": "database1",
                "table": "users",
                "column": "email"
            },
            "with": {
                "fill": "@"
            }
        },
        ...
}

例えば、上記の1つ目の設定は、

  • database1 というデータベースの、users テーブルの name カラムのデータを、すべて X という文字列でマスクする。

というものですが、最後の数文字だけマスクするなどの設定も可能です。
詳しくはドキュメントを参照してください。

マスキングルールは、意図せずマスクされるべき個人情報が参照可能になってしまうなどの事故を防ぐため、 データベース構造の変更に追従できるような運用を行っています。

システム構成

f:id:truego:20190822184346p:plain 今回、MaxScale の導入と合わせて、既存の re:dash の update を合わせて行ったため、re:dash の docker 環境に MaxScale コンテナを追加した構成になっています。

re:dash の github で公開されている docker-compose.yml をベースに、以下のようにMaxScale のコンテナを追加しています。

...
  maxscale:
    image: mariadb/maxscale:2.3
    volumes:
      - ./maxscale.cnf:/etc/maxscale.cnf
      - ./maxscale.cnf.d:/etc/maxscale.cnf.d
    ports:
      - "4008:4008" 
...

マスクされたデータのダンプ

今回は re:dash 経由でアクセスしていますが、MaxScale はコマンドラインの MySQL Client などからも参照することができるため、 MaxScale を経由してデータベースのダンプを取得することで、マスクされたデータのダンプファイルも取得可能です。 これらのダンプファイルは、個人情報がマスクされているため開発時に本番相当のデータで動作確認をする際などに利用しています。

さいごに

MaxScale は、こちらから docker 環境で簡単に試してみることができます。
一点、注意することとしては、MaxScale は BSL(Business Source License) という MariaDB 独自のライセンスであるため、使用前にご確認ください。
ライセンスについては、こちらの記事 も参考にさせていただきました。