はじめに
2022年2月10日の MySQL Database Service (MDS)のリリースで、Enterprise Edition 機能の1つである Data Masking and De-Identification Functions (データマスキングと匿名化関数)が使えるようになりました。
MySQL Database Service now has data masking capabilities supporting the MySQL Enterprise Edition Data Masking plug-in. This addition provides SQL-level functions for performing masking and de-identification operations. Users can use the data masking functions to write new queries, views, or generated columns that obfuscate sensitive data.
既存の機能ではありますが、MDS へのリリースを機に、改めて紹介させていただこうと思います。
※弊社ブログでもオンプレミス版の紹介記事を過去公開しておりますので、併せてご一読いただけると幸いです。
MySQL Enterprise Masking and De-identification を使ってみた | スマートスタイル TECH BLOG
※注記
Release Notes 文中に generated columns でデータマスキング関数が使える旨の記載がありますが、実際は仕様上の制約で使用することはできません。ドキュメント上の表記誤りのようですのでご注意ください。
MySQL Enterprise Masking and De-identification(マスキングと匿名化)
MySQL Enterprise Edition で提供される、セキュリティ要件や個人情報などの機密データ保護遵守といった目的で使用できる機能です。
用途別に複数用意された SQL レベルの関数を用いることで、既存データの選択的/完全マスキングや、識別・特定ができてしまう特性を持つデータの別データへの置換、といった処理が容易に行えます。
たとえば閲覧権限のないユーザへは、対象データをマスキングした独自のビューを作成してそこへのみアクセスさせるようにしたり、開発・検証環境で本機能のランダムデータ生成関数を使うことでダミーデータを作成するのが容易になります。
[引用:MySQL :: MySQL Enterprise Masking and De-identification(マスキングと匿名化)]
Eメールアドレスや (US用ですが)SSN,PANといった特殊用途の関数、もしくはさまざまなフォーマットに対応できる汎用関数が用意されています。
これらを自前で実装する場合のコスト、さらに機能自体の正確性も含めて考えてみると、やはりエンタープライズ用途としては開発元(Oracle MySQL)が公式で提供する本機能を使うことが最善の選択と言えます。
本機能に関する公式の概要説明、ホワイトペーパーは以下のページをぜひご一読ください。
https://www.mysql.com/jp/products/enterprise/masking.html
MDS での実装
MDS は Enterprise Edition がベースとなっていますが、これまではスレッド・プール・プラグインのみが使用可能という状況でした。
※現状非サポートの機能は以下のページで確認できます。
MySQL Features Currently Unsupported in MySQL Database Service
Enterprise Edition 提供機能は MDS に順次実装されていく方針のようで、今回データマスキングと匿名化機能がリリースされたということになります。
MDS の公式マニュアルページを確認してみますと、オンプレミス版のバイナリでは使えるいくつかの関数が非サポートになっています。
Oracle Cloud Infrastructure Documentation :: DB Systems :: MySQL Server | Data Masking
サポートしている関数
MDS で現在利用可能な関数は以下の通りです。
mask_*
がマスキング関数、gen_*
がランダムデータ生成関数です。
- mask_inner
- mask_outer
- mask_pan
- mask_pan_relaxed
- mask_ssn
- gen_range
- gen_rnd_email
- gen_rnd_ssn
- gen_rnd_us_phone
各関数の説明は、MySQL 8.0 リファレンスマニュアルの [6.5.4 MySQL Enterprise Data Masking and De-Identification ユーザー定義関数リファレンス ]でご確認ください。
非サポートの関数
以下の関数が MDS では使用できません。
- gen_blocklist
- gen_dictionary
- gen_dictionary_drop
- gen_dictionary_load
- gen_rnd_pan
gen_dictionary*
、gen_blocklist
は ランダムデータディクショナリビューの関数 です。
ユーザが独自に作成した辞書ファイルをプレーンテキストファイルとして MySQL にロードし、指定した辞書データからランダムで文字列を取得する機能になります。
公式マニュアルなどには明記がありませんが、まだこの関数ではMDSには直接外部ファイル取り込みができないため使用不可としているのではないかと推察しました。
ただ、ダミーデータを作成する際は、柔軟性という面で「あると便利」な関数なので、今後たとえばオブジェクトストレージに配置したファイルから取り込みができるようになれば嬉しいと個人的には思いました。
gen_rand_pan
は、「ランダム支払カードプライマリアカウント番号を生成」する関数です。
こちらも明記はされていませんが、以下マニュアルにある警告のとおり、乱数生成結果が実在する情報と合致してしまうという仕様上の注意点があるので MDS では敢えて使えないようにしたのでは?と思われます。
警告
gen_rnd_pan() から返される値はテスト目的でのみ使用する必要があり、公開には適していません。 特定の戻り値が正当な支払アカウントに割り当てられていないことを保証する方法はありません。 gen_rnd_pan() の結果を公開する必要がある場合は、mask_pan() または mask_pan_relaxed() でマスキングすることを検討してください。
インストール状況の確認
MySQL Enterprise Masking and De-identification は data_masking
プラグインで提供されます。
オンプレミス版は手動でインストールする必要がありますが、MDS ではすでにインストールされた状態で提供されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
mysql> SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'data_masking'\G *************************** 1. row *************************** PLUGIN_NAME: data_masking PLUGIN_VERSION: 0.1 PLUGIN_STATUS: ACTIVE PLUGIN_TYPE: UDF PLUGIN_TYPE_VERSION: 0.1 PLUGIN_LIBRARY: data_masking.so PLUGIN_LIBRARY_VERSION: 1.10 PLUGIN_AUTHOR: Oracle Corporation PLUGIN_DESCRIPTION: Data masking facilities PLUGIN_LICENSE: PROPRIETARY LOAD_OPTION: ON 1 row in set (0.0009 sec) |
各関数もユーザ定義関数(UDF)として作成済みで、すぐ利用可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
mysql> SELECT * FROM PERFORMANCE_SCHEMA.USER_DEFINED_FUNCTIONS WHERE UDF_LIBRARY = 'data_masking.so' ORDER BY UDF_NAME; +------------------+-----------------+----------+-----------------+-----------------+ | UDF_NAME | UDF_RETURN_TYPE | UDF_TYPE | UDF_LIBRARY | UDF_USAGE_COUNT | +------------------+-----------------+----------+-----------------+-----------------+ | gen_range | integer | function | data_masking.so | 1 | | gen_rnd_email | char | function | data_masking.so | 1 | | gen_rnd_ssn | char | function | data_masking.so | 1 | | gen_rnd_us_phone | char | function | data_masking.so | 1 | | mask_inner | char | function | data_masking.so | 1 | | mask_outer | char | function | data_masking.so | 1 | | mask_pan | char | function | data_masking.so | 1 | | mask_pan_relaxed | char | function | data_masking.so | 1 | | mask_ssn | char | function | data_masking.so | 1 | +------------------+-----------------+----------+-----------------+-----------------+ 9 rows in set (0.0007 sec) |
なお、記事作成時点(2022/3/1)では、MDS を新規作成する際、MySQL Server のバージョンは 8.0.27 か 8.0.28 で選択することが可能です。
- MDS DB システムの作成 > 拡張オプションの表示 > 構成
確認してみたところ、8.0.27 と 8.0.28 いずれのバージョンでもデータマスキングと匿名化の機能は利用可能でした。
簡易的な負荷テスト
下図の最小のシェイプで作成した環境にて、簡易的な負荷テストを行ってみました。
-
冒頭でご紹介した弊社過去ブログ記事内の速度検証で用いたスキーマ・テーブルと同じ定義を使用
12345678910111213CREATE DATABASE bench;USE benchCREATE TABLE masking (id INT NOT NULL AUTO_INCREMENT,data VARCHAR(16) NOT NULL,PRIMARY KEY (id));CREATE OR REPLACE VIEW masked_data ASSELECT id,mask_inner(data, 0, 4) AS dataFROM masking; - バッファプールサイズ 2GB に収まるデータ量(1GB/約2,500万レコード)を投入
- 今回は mysqlslap を使用(
--concurrency=2 --iterations=10000
)
マスキング無しテーブル(masking) へのアクセスと mask_inner
関数を用いたマスキングビュー(masked_data)へのアクセス、それぞれ10回づつのベンチマークを実行した結果を確認してみました。
CPU使用率(平均)はほぼ変わらない程度ですが、マスキングビューに対するクエリのレイテンシ平均 20m/s → 50m/s となっており、(過去のブログ記事でもお伝えしている結果からは変わらず) 多少の負荷増加が発生するのが確認できます。
まとめ
オンプレミス版と比較するといくつかの関数が非サポートではありますが、MDS でもデータマスキングと匿名化の機能が使えるようになり、データベースレベルでのデータ保護というセキュリティ要件にも応えることができます。
他の MySQL ベースのマネージドサービスはない、MySQLの開発元が公式に提供している機能という点も MDS のメリットです。
インスタンスを作成すればすぐ利用可能ですので、ぜひデータベースセキュリティ強化のために活用いただければと思います。