masking フィルタによるデータ保護

MariaDB MaxScale 2.1 で導入された masking フィルタではマイナンバー,クレジットカード情報などの機密度の高い情報を簡単にマスキングすることができます。今回はこのマスキングフィルターに関して解説いたします。

制限事項

以下のタイプのカラムに対してのみマスキングは有効となります。

  • BINARY
  • VARBINARY
  • CHAR
  • VARCHAR
  • BLOB
  • TINYBLOB
  • MEDIUMBLOB
  • LONGBLOB
  • TEXT
  • TINYTEXT
  • MEDIUMTEXT
  • LONGTEXT
  • ENUM
  • SET

テスト環境

以下の環境でテストを実施しました。

  • MariaDB MaxScale 2.3.3
  • MariaDB Server 10.3.12
  • CentOS 7.6.1810

MaxScale Masking filter設定

下記の例のように,filter設定において,module=maskingを指定,service設定においてfilters=Maskingというようにfiltersパラメータにてfilterのオブジェクト名を参照します。

[maxscale]
threads=auto

[Masking]
type=filter
module=masking
rules=/etc/maxscale.modules.d/masking_rules.json
warn_type_mismatch=always
large_payload=ignore

[Splitter-Service]
type=service
router=readwritesplit
servers=server1,server2,server3
user=maxuser
password=maxpwd
# masking filter
filters=Masking

[Splitter-Listener]
type=listener
service=Splitter-Service
protocol=mariadbclient
port=3306

[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=server1,server2,server3
user=maxuser
password=maxpwd
auto_failover=true
auto_rejoin=true
#-----------------------
[server1]
type=server
address=192.168.2.101
port=3306
protocol=mariadbbackend

[server2]
type=server
address=192.168.2.102
port=3306
protocol=mariadbbackend

[server3]
type=server
address=192.168.2.103
port=3306
protocol=mariadbbackend

マスキングルール

マスキングのルールは以下の例のように,JSON形式で指定します。

{                                                                                                                                                            
    "rules": [                                                                                                                                               
        {                                                                                                                                                    
            "replace": {                                                                                                                                     
                "column": "card_number1"                                                                                                                     
            },                                                                                                                                               
            "with": {                                                                                                                                        
                "fill": "*"                                                                                                                       
            }                                                                                                                                                
        },                                                                                                                                                   
        {                                                                                                                                                    
            "replace": {                                                                                                                                     
                "column": "card_number2",                                                                                                                    
                "match": "^\\d{4}-\\d{4}-\\d{4}"                                                                                                             
            },                                                                                                                                               
            "with": {                                                                                                                                        
                "fill": "*"                                                                                                                                  
            }                                                                                                                                                
        },                                                                                                                                                   
        {                                                                                                                                                    
            "obfuscate": {                                                                                                                                   
                 "column": "card_number3"                                                                                                                    
            }                                                                                                                                                
        }                                                                                                                                                    
    ]                                                                                                                                                        
}

このルールの場合,以下のようなマスキング/難読化を行います。

  • カラム名が card_number1 の場合は,すべて * でマスキング
  • カラム名が card_number2 の場合は,最後の4桁以外すべて * でマスキング
  • カラム名が card_number3 の場合は,難読化(obfuscation)

マスキング設定検証

サンプル・テーブル
use test;
create table masking1 (card_number1 char(20));
create table masking2 (card_number2 char(20));
create table masking3 (card_number3 char(20));
サンプル・データ

以下のようなクレジットカード番号相当のものをINSERTします。

insert into masking1 values ('1234-5678-9012-3456');
insert into masking2 values ('1234-5678-9012-3456');
insert into masking3 values ('1234-5678-9012-3456');
SELECT実行結果

MaxScaleノード上に MariaDB-client をインストールし,検証クエリを実行してみます。

maxscale$ mysql -h127.0.0.1 -umaxuser -pmaxpwd test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 14
Server version: 10.3.12-MariaDB-log MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

MariaDB [test]> select * from masking1;
+---------------------+
| card_number1        |
+---------------------+
| ******************* |
+---------------------+

MariaDB [test]> select * from masking2;
+---------------------+
| card_number2        |
+---------------------+
| **************-3456 |
+---------------------+

MariaDB [test]> select * from masking3;
+---------------------+
| card_number3        |
+---------------------+
| ~BQpI~B3~oMl3f~~@?& |
+---------------------+

意図した通りのマスキングが行われていることが確認できました。なお,バックエンドのデータベースに直接接続した場合は当然のことながらマスキングは行われませんので,留意願います。

まとめ

毎日のように大規模なデータ漏洩の報道がされている昨今,データベースProxyであるMaxScaleを介したマスキング,難読化により,アプリケーションコードの変更なく高度なデータ保護を行うことが可能であることが確認できました。