MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  MySQL Enterprise Data Masking and De-Identification の使用

6.5.3 MySQL Enterprise Data Masking and De-Identification の使用

MySQL Enterprise Data Masking and De-Identification を使用する前に、セクション6.5.2「MySQL Enterprise Data Masking and De-Identification のインストールまたはアンインストール」 に記載されている手順に従ってインストールします。

アプリケーションで MySQL Enterprise Data Masking and De-Identification を使用するには、実行する操作に適した関数を呼び出します。 関数の詳細は、セクション6.5.5「MySQL Enterprise Data Masking and De-Identification ユーザー定義関数の説明」 を参照してください。 このセクションでは、関数を使用して代表的なタスクを実行する方法を示します。 最初に、使用可能な関数の概要を示し、次にその関数を実際のコンテキストで使用する方法の例をいくつか示します:

識別特性を削除するためのデータのマスキング

MySQL には、任意の文字列をマスキングする汎用マスキング関数と、特定のタイプの値をマスキングする特別な目的のマスキング関数が用意されています。

汎用マスキング関数

mask_inner() および mask_outer() は、文字列内の位置に基づいて任意の文字列の一部をマスクする汎用関数です:

  • mask_inner() は、その文字列引数の内部をマスクし、末尾はマスクされないままにします。 その他の引数は、マスクされていない端のサイズを指定します。

    mysql> SELECT mask_inner('This is a string', 5, 1);
    +--------------------------------------+
    | mask_inner('This is a string', 5, 1) |
    +--------------------------------------+
    | This XXXXXXXXXXg                     |
    +--------------------------------------+
    mysql> SELECT mask_inner('This is a string', 1, 5);
    +--------------------------------------+
    | mask_inner('This is a string', 1, 5) |
    +--------------------------------------+
    | TXXXXXXXXXXtring                     |
    +--------------------------------------+
  • mask_outer() は逆の処理を行い、文字列引数の終わりをマスキングして、内部をマスクしないままにします。 その他の引数は、マスクされた端のサイズを指定します。

    mysql> SELECT mask_outer('This is a string', 5, 1);
    +--------------------------------------+
    | mask_outer('This is a string', 5, 1) |
    +--------------------------------------+
    | XXXXXis a strinX                     |
    +--------------------------------------+
    mysql> SELECT mask_outer('This is a string', 1, 5);
    +--------------------------------------+
    | mask_outer('This is a string', 1, 5) |
    +--------------------------------------+
    | Xhis is a sXXXXX                     |
    +--------------------------------------+

デフォルトでは、mask_inner() および mask_outer() はマスキング文字として'X'を使用しますが、オプションのマスキング文字引数を使用できます:

mysql> SELECT mask_inner('This is a string', 5, 1, '*');
+-------------------------------------------+
| mask_inner('This is a string', 5, 1, '*') |
+-------------------------------------------+
| This **********g                          |
+-------------------------------------------+
mysql> SELECT mask_outer('This is a string', 5, 1, '#');
+-------------------------------------------+
| mask_outer('This is a string', 5, 1, '#') |
+-------------------------------------------+
| #####is a strin#                          |
+-------------------------------------------+
特殊用途マスキング関数

その他のマスキング関数では、特定のタイプの値を表す文字列引数を想定し、それをマスクして識別特性を削除します。

注記

この例では、適切なタイプの値を返すランダム値生成関数を使用して関数の引数を指定します。 生成関数の詳細は、特定の特性を持つランダムデータの生成 を参照してください。

支払カードプライマリアカウント番号マスキング.  マスキング機能は、主要アカウント番号の厳密で緩和されたマスキングを提供します。

  • mask_pan() は、数値の最後の 4 桁を除くすべての桁をマスクします:

    mysql> SELECT mask_pan(gen_rnd_pan());
    +-------------------------+
    | mask_pan(gen_rnd_pan()) |
    +-------------------------+
    | XXXXXXXXXXXX2461        |
    +-------------------------+
  • mask_pan_relaxed() は似ていますが、支払カード会社のマスクが解除されたことを示す最初の 6 桁はマスクされません:

    mysql> SELECT mask_pan_relaxed(gen_rnd_pan());
    +---------------------------------+
    | mask_pan_relaxed(gen_rnd_pan()) |
    +---------------------------------+
    | 770630XXXXXX0807                |
    +---------------------------------+

US 社会保障番号マスキング.  mask_ssn() は、数値の最後の 4 桁を除くすべての桁をマスクします:

mysql> SELECT mask_ssn(gen_rnd_ssn());
+-------------------------+
| mask_ssn(gen_rnd_ssn()) |
+-------------------------+
| XXX-XX-1723             |
+-------------------------+

特定の特性を持つランダムデータの生成

いくつかの関数でランダム値が生成されます。 これらの値は、テストやシミュレーションなどに使用できます。

gen_range() は、指定された範囲から選択されたランダムな整数を返します:

mysql> SELECT gen_range(1, 10);
+------------------+
| gen_range(1, 10) |
+------------------+
|                6 |
+------------------+

gen_rnd_email() は、example.com ドメインでランダムな電子メールアドレスを返します:

mysql> SELECT gen_rnd_email();
+---------------------------+
| gen_rnd_email()           |
+---------------------------+
| ayxnq.xmkpvvy@example.com |
+---------------------------+

gen_rnd_pan() は、ランダムな支払カード主要アカウント番号を返します:

mysql> SELECT gen_rnd_pan();

(戻り値は公開ではなくテスト目的でのみ使用する必要があるため、gen_rnd_pan() 関数の結果は表示されません。 番号が正当な支払アカウントに割り当てられていないことを保証できません。)

gen_rnd_ssn() はランダムな US 社会保障番号を返し、それぞれ正当な番号に使用されていない範囲から選択された最初と 2 番目の部分が含まれます:

mysql> SELECT gen_rnd_ssn();
+---------------+
| gen_rnd_ssn() |
+---------------+
| 912-45-1615   |
+---------------+

gen_rnd_us_phone() は、正当な番号に使用されていない 555 市外局番でランダムな米国電話番号を返します:

mysql> SELECT gen_rnd_us_phone();
+--------------------+
| gen_rnd_us_phone() |
+--------------------+
| 1-555-747-5627     |
+--------------------+

ディクショナリを使用したランダムデータの生成

MySQL Enterprise Data Masking and De-Identification では、ディクショナリをランダム値のソースとして使用できます。 ディクショナリを使用するには、最初にファイルからロードし、名前を指定する必要があります。 ロードされた各ディクショナリは、ディクショナリレジストリの一部になります。 その後、登録済ディクショナリからアイテムを選択し、ランダム値または他の値の置換として使用できます。

有効なディクショナリファイルには、次の特性があります:

  • ファイルの内容はプレーンテキストで、1 行につき 1 語です。

  • 空の行は無視されます。

  • ファイルには少なくとも 1 つの用語が含まれている必要があります。

de_cities.txt という名前のファイルにドイツの次の市区町村名が含まれているとします:

Berlin
Munich
Bremen

また、us_cities.txt という名前のファイルに米国の次の市区町村名が含まれているとします:

Chicago
Houston
Phoenix
El Paso
Detroit

secure_file_priv システム変数が/usr/local/mysql/mysql-files に設定されているとします。 その場合は、MySQL サーバーがアクセスできるように、ディクショナリファイルをそのディレクトリにコピーします。 次に、gen_dictionary_load() を使用してディクショナリをディクショナリレジストリにロードし、ディクショナリに名前を割り当てます:

mysql> SELECT gen_dictionary_load('/usr/local/mysql/mysql-files/de_cities.txt', 'DE_Cities');
+--------------------------------------------------------------------------------+
| gen_dictionary_load('/usr/local/mysql/mysql-files/de_cities.txt', 'DE_Cities') |
+--------------------------------------------------------------------------------+
| Dictionary load success                                                        |
+--------------------------------------------------------------------------------+
mysql> SELECT gen_dictionary_load('/usr/local/mysql/mysql-files/us_cities.txt', 'US_Cities');
+--------------------------------------------------------------------------------+
| gen_dictionary_load('/usr/local/mysql/mysql-files/us_cities.txt', 'US_Cities') |
+--------------------------------------------------------------------------------+
| Dictionary load success                                                        |
+--------------------------------------------------------------------------------+

ディクショナリからランダムな用語を選択するには、gen_dictionary() を使用します:

mysql> SELECT gen_dictionary('DE_Cities');
+-----------------------------+
| gen_dictionary('DE_Cities') |
+-----------------------------+
| Berlin                      |
+-----------------------------+
mysql> SELECT gen_dictionary('US_Cities');
+-----------------------------+
| gen_dictionary('US_Cities') |
+-----------------------------+
| Phoenix                     |
+-----------------------------+

複数のディクショナリからランダムな用語を選択するには、いずれかのディクショナリをランダムに選択し、そこから用語を選択します:

mysql> SELECT gen_dictionary(ELT(gen_range(1,2), 'DE_Cities', 'US_Cities'));
+---------------------------------------------------------------+
| gen_dictionary(ELT(gen_range(1,2), 'DE_Cities', 'US_Cities')) |
+---------------------------------------------------------------+
| Detroit                                                       |
+---------------------------------------------------------------+
mysql> SELECT gen_dictionary(ELT(gen_range(1,2), 'DE_Cities', 'US_Cities'));
+---------------------------------------------------------------+
| gen_dictionary(ELT(gen_range(1,2), 'DE_Cities', 'US_Cities')) |
+---------------------------------------------------------------+
| Bremen                                                        |
+---------------------------------------------------------------+

gen_blocklist() 関数を使用すると、あるディクショナリの用語を別のディクショナリの用語に置き換えることができ、置換によるマスキングに影響します。 引数は、置換する用語、用語が表示されるディクショナリおよび置換を選択するディクショナリです。 たとえば、米国の市をドイツの市に、またはその逆に置き換えるには、次のように gen_blocklist() を使用します:

mysql> SELECT gen_blocklist('Munich', 'DE_Cities', 'US_Cities');
+---------------------------------------------------+
| gen_blocklist('Munich', 'DE_Cities', 'US_Cities') |
+---------------------------------------------------+
| Houston                                           |
+---------------------------------------------------+
mysql> SELECT gen_blocklist('El Paso', 'US_Cities', 'DE_Cities');
+----------------------------------------------------+
| gen_blocklist('El Paso', 'US_Cities', 'DE_Cities') |
+----------------------------------------------------+
| Bremen                                             |
+----------------------------------------------------+

置換する用語が最初のディクショナリにない場合、gen_blocklist() はそれを変更せずに戻します:

mysql> SELECT gen_blocklist('Moscow', 'DE_Cities', 'US_Cities');
+---------------------------------------------------+
| gen_blocklist('Moscow', 'DE_Cities', 'US_Cities') |
+---------------------------------------------------+
| Moscow                                            |
+---------------------------------------------------+

顧客識別のためのマスクされたデータの使用

カスタマサービスコールセンターでは、一般的なアイデンティティ検証手法として、顧客に最後の 4 桁の社会保障番号 (SSN) を提供するように依頼します。 たとえば、顧客の名前が Joanna Bond で、最後の 4 桁の SSN が 0007 であるとします。

顧客レコードを含む customer テーブルに次のカラムがあるとします:

  • id: 顧客 ID 番号。

  • first_name: 顧客の名。

  • last_name: 顧客の姓。

  • ssn: 顧客社会保障番号。

たとえば、テーブルは次のように定義できます:

CREATE TABLE customer
(
id         BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(40),
last_name  VARCHAR(40),
ssn        VARCHAR(11)
);

顧客サービス担当者が顧客 SSN をチェックするために使用するアプリケーションは、次のようなクエリーを実行します:

mysql> SELECT id, ssn
mysql> FROM customer
mysql> WHERE first_name = 'Joanna' AND last_name = 'Bond';
+-----+-------------+
| id  | ssn         |
+-----+-------------+
| 786 | 906-39-0007 |
+-----+-------------+

ただし、は SSN をカスタマーサービス担当者に公開します。カスタマーサービス担当者は、最後の 4 桁以外を表示する必要はありません。 かわりに、アプリケーションは次のクエリーを使用して、マスクされた SSN のみを表示できます:

mysql> SELECT id, mask_ssn(CONVERT(ssn USING binary)) AS masked_ssn
mysql> FROM customer
mysql> WHERE first_name = 'Joanna' AND last_name = 'Bond';
+-----+-------------+
| id  | masked_ssn  |
+-----+-------------+
| 786 | XXX-XX-0007 |
+-----+-------------+

これで、担当者には必要なもののみが表示され、お客様のプライバシーは保持されます。

mask_ssn() への引数に CONVERT() 関数が使用されたのはなぜですか。 mask_ssn() には長さ 11 の引数が必要であるためです。 したがって、ssnVARCHAR(11) として定義されている場合でも、ssn カラムにマルチバイト文字セットが含まれていると、UDF に渡されたときに 11 バイトを超える可能性があり、エラーが発生します。 値をバイナリ文字列に変換すると、UDF に長さ 11 の引数が表示されます。

文字列引数にシングルバイト文字セットがない場合は、他のデータマスキング関数でも同様の方法が必要になることがあります。

マスクされたデータを表示するビューの作成

テーブルのマスキングされたデータが複数のクエリーに使用される場合、マスキングされたデータを生成するビューを定義すると便利です。 これにより、アプリケーションは個々のクエリーでマスキングを実行せずにビューから選択できます。

たとえば、前のセクションの customer テーブルのマスキングビューは、次のように定義できます:

CREATE VIEW masked_customer AS
SELECT id, first_name, last_name,
mask_ssn(CONVERT(ssn USING binary)) AS masked_ssn
FROM customer;

その後、顧客を検索するクエリーは単純になりますが、マスキングされたデータは返されます:

mysql> SELECT id, masked_ssn
mysql> FROM masked_customer
mysql> WHERE first_name = 'Joanna' AND last_name = 'Bond';
+-----+-------------+
| id  | masked_ssn  |
+-----+-------------+
| 786 | XXX-XX-0007 |
+-----+-------------+

関連キーワード:  gen, Cities, 関数, マスキング, rnd, ディクショナリ, マスク, US, データ, Data