マスキングポリシー
このトピックでは、マスキングポリシーとは何か、マスキングポリシーの作成と適用方法、電話番号マスキングのユースケース、マスキングポリシーの管理方法、およびマスキングポリシーを使用する際の制限について説明します。
カラムおよび行レベルのセキュリティの概要については、 カラムおよび行レベルのセキュリティを理解する を参照してください。
各 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
ロールのみがメールアドレスを表示できるか、visibility
がpublic
のメールアドレスのみをすべてのロールが表示できるようにします。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: マスキングポリシーでサブクエリを使用します。現在のロールのみが
visibility
がpublic
のメールアドレスを表示できます。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
-
データベース
db_test
を作成し、このデータベースに切り替えます。CREATE DATABASE db_test;
USE db_test; -
売上情報テーブル
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); -
2 つのロール
sales
とanalyst
を作成します。テーブルからデータをクエリする権限をロールに付与します。CREATE ROLE `sales`,`analyst`;
GRANT SELECT ON TABLE `sales_info` TO ROLE `sales`;
GRANT SELECT ON TABLE `sales_info` TO ROLE `analyst`; -
ユーザー
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`; -
CASE WHEN を使用して条件を指定するマスキングポリシーを作成します。このポリシーは、
sales
ロールのみがプレーンテキストのユーザー電話番号を表示できるようにします。他のロールはマスクされた電話番号のみを表示できます。CREATE MASKING POLICY phone_mask AS (phone string)
RETURNS string ->
CASE WHEN current_role() = 'sales' THEN phone
ELSE '***MASKED***'
END; -
マスキングしたいカラム
phone
にポリシーを適用します。ALTER TABLE `sales_info` MODIFY COLUMN phone SET MASKING POLICY phone_mask;
-
2 つのロール
sales
とanalyst
を使用してデータをクエリします。結果は、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 などの権限によって制御されます。これらの権限を付与する方法、各コマンドに必要な権限、および権限管理モードについての詳細は、 ポリシーの権限を管理する を参照してください。