メインコンテンツまでスキップ

マスキングポリシー

このトピックでは、マスキングポリシーとは何か、マスキングポリシーの作成と適用方法、電話番号マスキングのユースケース、マスキングポリシーの管理方法、およびマスキングポリシーを使用する際の制限について説明します。

カラムおよび行レベルのセキュリティの概要については、 カラムおよび行レベルのセキュリティを理解する を参照してください。

各 SQL 操作に必要な権限については、 ポリシーの権限を管理する を参照してください。

定義

カラムレベルのセキュリティを使用すると、テーブルまたはビュー内のカラムにマスキングポリシーを適用し、特定のロールから機密データをマスキングすることができます。

CelerData は、指定した条件に基づいてクエリ実行時にデータをマスキングするために、カラムマスキングポリシーを適用できます。カラムマスキングは、保存されたデータを変更または暗号化しません。クエリ実行時にのみマスキングルールを適用します。また、データ型やカラム名などの基本的なテーブル情報を変更しません。

カラムマスキングポリシーは、テーブルの作成時または作成後にテーブルまたはビューに追加できます。

マスキングポリシーの作成

ポリシーは、カラム名、カラムタイプ、マスキング条件、およびマスキング関数で構成されます。

構文:

CREATE MASKING POLICY [ IF NOT EXISTS ] <name> AS
( <arg_name_to_mask> <arg_type_to_mask> [ , <arg_1> <arg_type_1> ... ] )
RETURNS <arg_type_to_mask> ->
<expression_on_arg_name>
[ COMMENT = '<string_literal>' ]
パラメータ必須説明
nameはいポリシーの名前で、データベース内で一意である必要があります。ポリシーは、catalog.db.policy の形式でデータベースおよびカタログをまたいで参照できます。カタログが指定されていない場合、現在のカタログが使用されます。
arg_name_to_maskはいマスキングするカラムの名前です。arg_name_to_mask arg_type_to_mask の最初のペアはマスキングするカラムである必要があります。そのカラムに続くカラムは条件付きカラムです。
arg_type_to_maskはいマスキングするカラムのデータ型で、RETURNS 句のデータ型と同じである必要があります。
arg_1 arg_type_1いいえ条件付きカラムの名前とデータ型です。ポリシーを作成する際に複数の条件付きカラムを指定できますが、ポリシーを適用する際にそれらのうちのいくつかだけを参照することができます。条件付きカラムは、マスキングするカラムと同じテーブルに存在する必要があります。
expression_on_arg_nameはいマスキング条件として使用される式で、if()、case when()、ifnull() などの任意の条件関数を使用できます。
COMMENTいいえポリシーの説明です。

:

  • 例 1: sales ロールのみがプレーンテキストの電話番号を表示できるマスキングポリシーを作成します。他のロールはマスクされた電話番号のみを表示できます。

    CREATE MASKING POLICY phone_mask AS
    (phone string) RETURNS string ->
    CASE
    WHEN current_role() = 'sales' THEN phone
    ELSE '***MASKED***'
    END
    COMMENT "for test";
  • 例 2: 条件付きカラム visibility を持つマスキングポリシーを作成します。このポリシーは、ACCOUNTADMIN ロールのみがメールアドレスを表示できるか、visibilitypublic のメールアドレスのみをすべてのロールが表示できるようにします。

    CREATE MASKING POLICY email_visibility AS
    (email varchar, visibility varchar) RETURNS varchar ->
    CASE
    WHEN current_role() = 'ACCOUNTADMIN' THEN email
    WHEN visibility = 'public' THEN email
    ELSE '***MASKED***'
    END;
  • 例 3: マスキングポリシーでサブクエリを使用します。現在のロールのみが visibilitypublic のメールアドレスを表示できます。

     CREATE MASKING POLICY email_visibility1 AS
    (email varchar) RETURNS varchar ->
    CASE
    WHEN EXISTS
    (SELECT * FROM user3 WHERE visibility = 'public' AND role = current_role()) THEN email
    ELSE '***MASKED***'
    END;

マスキングポリシーの適用

ポリシーが作成された後、マスキングしたいカラムに適用できます。

構文:

ALTER TABLE <tbl_name> MODIFY COLUMN <col_name>
SET MASKING POLICY <name> [ USING (<col_name>, <cond_col1> , ...)]

:

-- テーブル sales_info があると仮定します。
CREATE TABLE `sales_info` (
name varchar(50),
phone string,
region varchar(50),
sales int);

-- テーブルの phone カラムにマスキングポリシー phone_mask を適用します。
ALTER TABLE `sales_info` MODIFY COLUMN phone SET MASKING POLICY phone_mask;

テーブルを作成する際に WITH 句を使用して既存のマスキングポリシーをテーブルカラムに適用することもできます。

CREATE TABLE `sales_info` (
name varchar(50),
phone string WITH MASKING POLICY phone_mask USING (phone),
region varchar(50),
sales int);

ユースケース - 異なるロールに対して電話番号をマスクする

このユースケースは、sales ロールがプレーンテキストの電話番号を表示でき、analyst ロールがマスクされた電話番号のみを表示できるようにするマスキングポリシーを作成するものです。

admin ユーザーとしてクラスターに接続した後、デフォルトのロール user_admin および db_admin に関連付けられた権限を持っています。データセキュリティの懸念から、別のユーザーを作成し、このユーザーに必要な権限のみを割り当ててマスキングポリシーをテストすることができます。このユースケースでは、以下の項目を作成します。

  • データベース db_test
  • テーブル sales_info
  • 電話番号へのアクセスが異なる 2 つのロール
  • マスキングポリシー関連の権限を持つユーザー masking_admin とロール masking_admin_role
  • テーブルの phone カラムに対するマスキングポリシー phone_mask
  1. データベース db_test を作成し、このデータベースに切り替えます。

    CREATE DATABASE db_test;
    USE db_test;
  2. 売上情報テーブル sales_info を作成し、このテーブルにデータを挿入します。

    CREATE TABLE `sales_info` (
    name varchar(50),
    phone string,
    region varchar(50),
    sales INT);

    INSERT INTO `sales_info` VALUES
    ('lily','886410','asia',11),
    ('richard','654321','uk',16),
    ('amber','789165','africa',17);
  3. 2 つのロール salesanalyst を作成します。テーブルからデータをクエリする権限をロールに付与します。

    CREATE ROLE `sales`,`analyst`;

    GRANT SELECT ON TABLE `sales_info` TO ROLE `sales`;
    GRANT SELECT ON TABLE `sales_info` TO ROLE `analyst`;
  4. ユーザー masking_admin を作成し、ロール masking_admin_role を作成し、このロールに必要な権限を付与し、masking_admin にロールを割り当てます。

    CREATE USER `masking_admin`;
    CREATE ROLE `masking_admin_role`;

    -- データベースでマスキングポリシーを作成する権限を付与します。
    GRANT CREATE MASKING POLICY ON DATABASE db_test TO ROLE masking_admin_role;

    -- データベースでのすべてのマスキングポリシーを適用する権限を付与します。
    GRANT ALTER ON TABLE sales_info TO ROLE masking_admin_role;
    GRANT APPLY ON ALL MASKING POLICIES to ROLE masking_admin_role;

    -- 前のロールをユーザーに割り当てます。
    GRANT `masking_admin_role`,`sales`,`analyst` TO USER `masking_admin`;

    -- ユーザー masking_admin に切り替えます。
    EXECUTE AS `masking_admin` WITH NO REVERT;

    -- マスキングポリシー関連の操作を実行するためにロール masking_admin_role をアクティブにします。
    SET ROLE `masking_admin_role`;
  5. CASE WHEN を使用して条件を指定するマスキングポリシーを作成します。このポリシーは、sales ロールのみがプレーンテキストのユーザー電話番号を表示できるようにします。他のロールはマスクされた電話番号のみを表示できます。

    CREATE MASKING POLICY phone_mask AS (phone string)
    RETURNS string ->
    CASE WHEN current_role() = 'sales' THEN phone
    ELSE '***MASKED***'
    END;
  6. マスキングしたいカラム phone にポリシーを適用します。

    ALTER TABLE `sales_info` MODIFY COLUMN phone SET MASKING POLICY phone_mask;
  7. 2 つのロール salesanalyst を使用してデータをクエリします。結果は、sales ロールのみがプレーンテキストのユーザー電話番号を表示できることを示しています。analyst ロールはマスクされた電話番号のみを表示できます。

    SET ROLE `sales`;
    SELECT * FROM `sales_info`;
    +---------+--------+--------+-------+
    | name | phone | region | sales |
    +---------+--------+--------+-------+
    | amber | 789165 | africa | 17 |
    | richard | 654321 | uk | 16 |
    | lily | 886410 | asia | 11 |
    +---------+--------+--------+-------+

    SET ROLE `analyst`;
    SELECT * FROM `sales_info`;
    +---------+--------------+--------+-------+
    | name | phone | region | sales |
    +---------+--------------+--------+-------+
    | lily | ***MASKED*** | asia | 11 |
    | richard | ***MASKED*** | uk | 16 |
    | amber | ***MASKED*** | africa | 17 |
    +---------+--------------+--------+-------+

マスキングポリシーの管理

マスキングポリシーの解除

テーブルカラムからマスキングポリシーを解除します。

構文:

ALTER TABLE <tbl_name> MODIFY COLUMN <col_name> UNSET MASKING POLICY

:

ALTER TABLE `sales_info` MODIFY COLUMN phone UNSET MASKING POLICY;

マスキングポリシーの変更

ポリシーの本文を変更したり、ポリシーの名前を変更したり、ポリシーのコメントを更新したりすることができます。新しいポリシーは、作成後すぐに有効になり、各テーブルに再適用する必要はありません。

注意

  • マスクされたカラムのデータ型や条件付きカラムの数およびデータ型を変更することはできません。ポリシーが適用されている可能性があるため、このポリシーを変更するとマスキングポリシーが無効になる可能性があります。
  • ポリシーの本文を変更する際には、新しい本文の条件付きカラムの名前と戻り値の型が、ポリシー作成時に指定されたものと同じであることを確認してください。

構文:

ALTER MASKING POLICY [ IF EXISTS ] <name> SET BODY -> <expression_on_arg_name>
ALTER MASKING POLICY [ IF EXISTS ] <name> RENAME TO <new_name>
ALTER MASKING POLICY [ IF EXISTS ] <name> SET COMMENT = '<string_literal>'

:

ALTER MASKING POLICY phone_mask RENAME TO mask_phone;

ALTER MASKING POLICY phone_mask SET COMMENT = 'test';

すべてのマスキングポリシーをクエリする

現在のデータベース内のすべてのマスキングポリシーをクエリします。

SHOW MASKING POLICIES;
+------------------+---------+-----------------+----------+
| Name | Type | Catalog | Database |
+------------------+---------+-----------------+----------+
| email_visibility | MASKING | default_catalog | zj_test |
| phone_mask | MASKING | default_catalog | zj_test |
+------------------+---------+-----------------+----------+

マスキングポリシーの CREATE ステートメントをクエリする

構文:

SHOW CREATE MASKING POLICY <name>;

:

SHOW CREATE MASKING POLICY phone_mask\G
*************************** 1. row ***************************
Policy: phone_mask
Create Policy: CREATE MASKING POLICY phone_mask AS (phone varchar(65533)) RETURNS varchar(65533) -> CASE WHEN ((CURRENT_ROLE()) = 'sales') THEN `phone` ELSE '***MASKED***' END COMMENT "for test"

マスキングポリシーを削除する

テーブルに適用されているポリシーを削除することはできません。そのようなポリシーを削除したい場合は、このポリシーが適用されているすべてのテーブルから取り消してから、このポリシーを削除してください。

DROP MASKING POLICY <name>

制限

  • 1 つのカラムに 1 つのマスキングポリシーしか適用できません。
  • 条件付きカラムは、マスキングするカラムと同じテーブルに存在する必要があります。
  • カラムにマスキングポリシーが適用されている場合、そのカラムは他のマスキングポリシーの条件付きカラムとして使用することも、他のマスキングポリシー内のサブクエリで参照することもできません。逆も同様です。
  • テーブルがマテリアライズドビューのベーステーブルである場合、そのテーブルにマスキングポリシーを適用することはできません。
  • テーブルのカラムにマスキングポリシーが適用されている場合、そのカラムに基づいてマテリアライズドビューを作成することはできません。

参照

ポリシーの作成と適用は、CREATE、APPLY、ALTER、DROP などの権限によって制御されます。これらの権限を付与する方法、各コマンドに必要な権限、および権限管理モードについての詳細は、 ポリシーの権限を管理する を参照してください。