Hologres は、列ごとにデータをマスキングできるデータマスキング機能を提供します。この機能を有効にすると、クエリ結果で機密情報がマスキングされます。これにより、機密データや個人データを保護できます。このトピックでは、データマスキング機能を有効にする方法、およびデータマスキング構成をクエリおよび削除する方法について説明します。
背景情報
ビッグデータの時代において、ビッグデータ、クラウドコンピューティング、人工知能 (AI) などの技術が広く利用されています。これらの技術は、詳細なデータマイニングや分析のための強力なツールを提供し、企業がビッグデータの潜在的な価値を引き出すのに役立ちます。しかし、これらの技術は、機密情報や個人情報の保護に課題をもたらします。
Hologres は、データマスキング機能を提供します。ユーザーと列に対してマスキングルールを設定できます。機密データをクエリすると、結果はマスキングされます。この機能により、効率的にデータを共有、マイニング、分析できます。また、データを共有または使用する際にデータを識別不能にすることで、機密情報や個人情報を保護します。
バージョン比較
Hologres は V3.1 以降でデータマスキングの動作を最適化しました。次の表は、V3.1 以降の機能と以前のバージョンの機能を比較したもので、データマスキングをよりよく理解し、使用するのに役立ちます。
特徴 | V3.1 以降 | V3.0 以前 |
TEXT 以外のフィールドのマスキング | INT、FLOAT、ARRAY などのデータ型に対してデフォルトのマスキングがサポートされています。ただし、これらのポリシーはデフォルト値に基づいている場合にのみ有効です。詳細については、「デフォルト値」をご参照ください。 | サポートされていません。CAST TEXT を使用してマスキングをバイパスできます。このメソッドは推奨されません。 |
ビュー | 結果はマスキングされます。 | 結果はマスキングされません。これは推奨されません。 |
マスキングされたフィールドを含む JOIN フィールドまたは WHERE 条件 | 結果は空です。 | 結果はマスキングされません。これは推奨されません。 |
マスキングされたフィールドのバイナリログの Flink 消費 |
|
|
MaxCompute を使用したマスキングされたフィールドの直接読み取り | MaxCompute は、Hologres からマスキングされたフィールドを直接読み取ることを禁止されています。 | 読み取りはサポートされています。これは推奨されません。 |
準備
データマスキングを使用する前に、スーパーユーザーはデータベースレベルで次のパラメーターを有効にする必要があります。
-- スーパーユーザーとして実行します。
CREATE EXTENSION IF NOT EXISTS hg_anon;
ALTER DATABASE <current_db> SET hg_anon_enable = on;上記のコマンドを実行すると、システムは Hologres インスタンスのバージョンに対応するデータマスキング動作を使用します。特定のマスキング動作を選択することもできます。
Hologres V3.1 以降のデータマスキング動作に欠陥があり、予期しない動作が発生した場合、次のコマンドを実行して V3.0 以前のデータマスキング動作にロールバックできます。
CALL hologres.set_hg_anon_version(1);V3.0 以前のインスタンスは、set_hg_anon_version ストアドプロシージャをサポートしていません。データマスキング機能を使用するインスタンスを V3.1 にアップグレードする場合、次のコマンドを実行して V3.1 のデータマスキング機能を有効にできます。そうしないと、システムは以前のバージョンのデータマスキング機能を引き続き使用します。
CALL hologres.set_hg_anon_version(2);説明この文が実行されると、V3.1 以降のデータマスキング動作が有効になります。
この文の実行に失敗した場合、エラーログに
"Error: not safe to upgrade to hg_anon version 2"と表示されます。これは、機能の有効化に失敗したことを示します。これは、現在のデータベースで TEXT、VARCHAR、または CHAR 以外のデータ型の列にマスキングが構成されているため、V3.1 以降のデータマスキング結果が期待どおりにならないためです。マスキング構成を修正する必要があります。
制限
マスキングルールを持つテーブルや列から、マスキングルールを持たないテーブルや列にデータをインポートすることはできません。次のエラーメッセージが報告されます。
Error: ERROR: The insert table has not set SECURITY LABELデータマスキングルールが構成されているテーブルに対して UNION または DISTINCT クエリを実行することはできません。次のエラーメッセージが報告されます。
Error: ERROR: UNION is not support on security itemデータマスキングはクエリのパフォーマンスに影響を与える可能性があります。影響の度合いは、マスキングメソッドとデータ量によって異なります。クエリのパフォーマンスは 10% から 20% 低下する可能性があります。極端なシナリオでは、パフォーマンスが大幅に低下する可能性があります。
外部テーブルにマスキングルールを構成することはできません。
データマスキング
マスキングルールの構成
Hologres では、特定の列またはユーザーに対してデータマスキングルールを構成できます。データマスキングを実行する前に、データマスキング用の GUC パラメーターを有効にする必要があります。詳細については、「準備」をご参照ください。
構文
列のマスキングルールを構成します。
複数の列のデータをマスキングするには、次の文を複数回実行します。
SECURITY LABEL FOR hg_anon ON COLUMN <tablename>.<col_name> IS <label_name>/'default_value';ユーザーのマスキングルールを構成します。
SECURITY LABEL FOR hg_anon ON ROLE <user_name> IS '[<label_name>|all]:[masked|unmasked]';
パラメーター
パラメーター
説明
hg_anon
hg_anon は Hologres にカプセル化された拡張関数です。データマスキング機能を有効にするには、この拡張関数を呼び出す必要があります。
tablename
データをマスキングする列を含むテーブルの名前。
col_name
データをマスキングする列の名前。
label_name
システムで事前定義されたマスキング関数。
SHOW hg_anon_labels;を実行して、現在のデータベースに構成されている label_name の値を確認できます。user_name
Alibaba Cloud アカウントの ID。[ユーザー情報] ページで ID を取得できます。
masked|unmasked
masked: データマスキングを使用します。
unmasked: データマスキングを使用しません。
次の表に、事前定義された label_name の値を示します。
データの型
label_name
マスキングポリシー
マスキングタイプ
説明
例
TEXT
name
name
mask
名前をマスキングします。
マスキング前: Li Hua。マスキング後: *Hua。
マスキング前: Wang Xiaoqiang。マスキング後: **qiang。
email
email
mask
メールアドレスをマスキングします。
マスキング前: lihuang@alibaba.com。マスキング後: lih***@alibaba.com。
ip
ip
mask
IP アドレスをマスキングします。
マスキング前: 1.2.3.4。マスキング後: 1.*.*.*。
id
id
mask
ID カード番号をマスキングします。
マスキング前: 110345188812011234。マスキング後: 1****************4。
phone
phone
mask
電話番号をマスキングします。
マスキング前: 13900001234。マスキング後: *********34。
bank_id
bank_id
mask
銀行またはクレジットカード番号をマスキングします。
マスキング前: 2349867902834701928。マスキング後: ***************1928。
hash
md5
hash
MD5 アルゴリズムを使用してマスキングします。
マスキング前: Wenyi West Road, Hangzhou, Zhejiang。マスキング後: dbf894b409d4a2ef17dfd9c7fdcafcd8。
first_mask
first_mask
mask
最初の文字のみを表示する first_mask ルールを定義します。
マスキング前: 123456789。マスキング後: 1********。
INT、FLOAT、およびその他の型
デフォルト
default_value
default_value
デフォルト値に基づいてデータをマスキングします。
説明データマスキングを構成する際に label_name が存在しない場合、システムはデフォルト値のマスキングを使用します。
この設定は Hologres V3.1 以降でのみサポートされています。
次のリストは、データ型とデフォルトのマスキング値のマッピングを示しています:
TEXT/VARCHAR/CHAR: ***
BOOLEAN: false
INT8/INT4/INT2: 0
TIMESTAMPTZ/TIMESTAMP: 2000-01-01 00:00:00
FLOAT8/FLOAT4/DECIMAL/NUMERIC: 0.0
MONEY: 0
DATE: 2000-01-01
TIME/TIMETZ: 現在の時刻
UUID: 00000000-0000-0000-0000-000000000000
構成されたマスキングルールの表示
列に構成されているマスキングルールを表示します。
-- 列に構成されているマスキングルールを表示します。 SELECT c.relname ,a.attname ,provider ,label FROM pg_seclabel s INNER JOIN pg_catalog.pg_class c ON s.objoid = c.relfilenode INNER JOIN pg_catalog.pg_attribute a ON s.objoid = a.attrelid WHERE a.attnum = objsubid;ユーザーに構成されているマスキングルールを表示します。
-- ユーザーに構成されているマスキングルールを表示します。 SELECT usename, label FROM pg_shseclabel s INNER JOIN pg_catalog.pg_user u ON s.objoid = u.usesysid;
カスタムマスキングルールの変更
構成されたマスキングルールが要件を満たさない場合、hg_anon_lables GUC パラメーターを変更してマスキングルールをカスタマイズできます。
構文
-- label_name はカスタム名で、method は Hologres の組み込みメソッドを指定します。 ALTER DATABASE <db_name> SET hg_anon_labels = '[ {"label": <label_name1>, "method":<method1>}, {"label": <label_name2>, "method":<method2>}, ... ]';ALTER DATABASEコマンドを実行した後、新しい設定は現在の接続には適用されません。新しい接続を確立する必要があります。次のコマンドを実行して、新しい設定が有効になったかどうかを確認できます。SHOW hg_anon_enable;
例
ALTER DATABASE test_db SET hg_anon_labels = '[ {"label":"ip", "method":{"desensType":"mask", "type":"ip"}}, {"label":"email", "method":{"desensType":"mask", "type":"email"}}, {"label":"name", "method":{"desensType":"mask", "type":"name"}}, {"label":"first_mask", "method":{"desensType":"mask", "type":"user_define", "before":1, "after":0}}, {"label":"hash", "method":{"desensType":"hash", "type":"md5", "salt":""}}]';パラメーター:
マスキング項目
説明
データマスキングの例
{"desensType":"mask", "type":"ip"}
IP アドレスをマスキングします。
192.*.*.*
{"desensType":"mask", "type":"email"}
メールアドレスをマスキングします。
abc***@example.net
{"desensType":"mask", "type":"name"}
名前をマスキングします。
*Wu
{"desensType":"hash", "type":"md5", "salt":""}
ハッシュマスキング。
e086aa137fa19f67d27b39d0eca186103228f322c9c98a125554a24f875f0f7e
{"label":"first_mask", "method":{"desensType":"mask", "type":"user_define", "before":1, "after":0}}{"label":"last_mask", "method":{"desensType":"mask", "type":"user_define", "before":0, "after":1}}
カスタムコンテンツマスキング。
なし
例
サンプルデータ
データソースを準備します。ビジネスデータを使用することもできます。
-- データベースを作成します。
CREATE DATABASE hg_anon_demo;
-- サンプルデータテーブルを作成します。
DROP TABLE IF EXISTS personal_basic_information;
CREATE TABLE personal_basic_information
(
name TEXT
,email TEXT
,ip TEXT
,id TEXT
,phone TEXT
,bank_id TEXT);
-- サンプルデータを挿入します。
INSERT INTO personal_basic_information(name,email,ip,id,phone,bank_id) VALUES
('Zhang San','jiaxi.jx@alibaba-inc.com','127.0.0.1','142732199104050022','18157161223','4514610803067088'),
('Li Si','wb-hy583084@antgroup.com','127.0.0.1','510622198412248000','15757121834','6252470010027800'),
('Li Xiaoyao','wb-hy583084@antgroup.com','172.21.4.234','511025198812271696','18215451832','6252470010027800');列のマスキングルールを構成する
-- hg_anon 拡張機能を作成します。
CREATE EXTENSION IF NOT EXISTS hg_anon;
-- hg_anon_demo データベースのデータマスキングを有効にします。
ALTER DATABASE hg_anon_demo SET hg_anon_enable = on;
-- 各列にデータマスキングルールを構成します。
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.name IS 'name';
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.id IS 'id';
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.phone IS 'phone';
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.email IS 'email';
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.bank_id IS 'bank_id';
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.ip IS 'ip';新しい接続を確立した後、次のコマンドを実行してマスキング結果を表示します。
SELECT * FROM personal_basic_information;次の結果が返されます。
name | email | ip | id | phone | bank_id
------+------------------------+--------------+--------------------+-------------+------------------
*Si | wb-***@antgroup.com | 127.*.*.* | 5****************0 | *********34 | ************7800
**yao | wb-***@antgroup.com | 172.**.*.*** | 5****************6 | *********32 | ************7800
*San | jia***@alibaba-inc.com | 127.*.*.* | 1****************2 | *********23 | ************7088
(3 rows)列のマスキングをキャンセルする
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.name IS null;
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.id IS null;次のコマンドを実行して、列のマスキングをキャンセルした後の結果を表示します。
SELECT name,id FROM personal_basic_information;次の結果が返されます。
SELECT name,id FROM personal_basic_information;
name | id
--------+--------------------
Li Si | 510622198412248000
Li Xiaoyao | 511025198812271696
Zhang San | 142732199104050022
(3 rows)ユーザーのマスキングルールをキャンセルする
-- BASIC$test アカウントのすべてのマスキングルールをキャンセルします。
SECURITY LABEL FOR hg_anon ON ROLE "BASIC$test" IS 'all:unmasked';次のコマンドを実行して、ユーザーのマスキングルールをキャンセルした後の結果を表示します。
SELECT * FROM personal_basic_information;次の結果が返されます。
name | email | ip | id | phone | bank_id
--------+--------------------------+--------------+--------------------+-------------+------------------
Li Si | wb-hy583084@antgroup.com | 127.0.0.1 | 510622198412248000 | 15757121834 | 6252470010027800
Li Xiaoyao | wb-hy583084@antgroup.com | 172.21.4.234 | 511025198812271696 | 18215451832 | 6252470010027800
Zhang San | jiaxi.jx@alibaba-inc.com | 127.0.0.1 | 142732199104050022 | 18157161223 | 4514610803067088
(3 rows)JOIN 列のマスキングを設定する
-- 次の例は、JOIN 列のマスキングを構成する方法を示しています。
CREATE TABLE tbl1 (
id text
);
INSERT INTO tbl1
VALUES ('142732199102290022');
-- personal_basic_information テーブルの id 列はすでにマスキングされています。
SELECT * FROM personal_basic_information a JOIN tbl1 b ON a.id = b.id;次の結果が返されます。
name | email | ip | id | phone | bank_id | id
------+-------+----+----+-------+---------+----
(0 rows)データセキュリティガードを使用してデータをマスキングする
データマスキングルールを手動で構成するか、データセキュリティガードを使用してデータをマスキングできます。
制限
Hologres V1.1 以降のみが、データセキュリティガードを使用したデータマスキングをサポートしています。
説明インスタンスが V1.1 より古い場合は、「アップグレード準備中の一般的なエラー」をご参照いただくか、フィードバックのために Hologres DingTalk グループに参加してください。詳細については、「より多くのオンラインサポートを受ける方法」をご参照ください。
機密データを識別するために、データセキュリティガードは Alibaba Cloud アカウントのデータマスキングを無効にします。
データセキュリティガードは、毎日 09:00:00 にデータをサンプリングします。その後、データセキュリティガードは機密データを識別し、識別された機密データを含む列にデータマスキングルールを構成します。
データセキュリティガードを使用して、中国 (北京)、中国 (張家口)、中国 (上海)、中国 (杭州)、中国 (深圳)、中国 (香港)、シンガポール、ドイツ (フランクフルト)、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、および米国 (シリコンバレー) のリージョンで Hologres のデータをマスキングできます。
手順
データマスキング機能を有効にします。
データマスキングはデフォルトで無効になっています。データベースでこの機能を有効にするには、スーパーユーザーとしてデータベースにログインし、次のコマンドを実行する必要があります。
-- データマスキング拡張機能をインストールします。 CREATE EXTENSION IF NOT EXISTS hg_anon; -- 指定されたデータベースのデータマスキングを有効にします。デフォルトでは、この機能は無効になっています。 ALTER DATABASE <db_name> SET hg_anon_enable = on;db_name は、データマスキングを有効にするデータベースの名前を指定します。
重要hg_anon_enableパラメーターは GUC パラメーターです。ALTER DATABASE コマンドを実行した後、新しい設定は現在の接続には適用されません。次の SQL 文を実行して、設定が有効になったかどうかを確認できます。
SHOW hg_anon_enable;
マスキングするデータベースを設定します。
データセキュリティガードコンソールにログインします。詳細については、「データセキュリティガードコンソールに移動する」をご参照ください。
左側のナビゲーションウィンドウで、 を選択して、[データ識別ルール] ページに移動します。
[機密データ識別] ページで、データ識別ルールを作成します。詳細については、「データ識別ルール」をご参照ください。
左側のナビゲーションウィンドウで、[データマスキング管理] をクリックして、[データマスキング管理] ページに移動します。
[マスキングシナリオ] ドロップダウンリストから、Hologres 表示マスキング (hologres_display_desense_code) を選択し、[マスキングデータベースの選択] をクリックします。
[アカウントマスキングの承認] ダイアログボックスで、[マスキングされていないデータベース] リストからマスキングするデータベースを選択し、[マスキングされたデータベース] リストに移動します。[このデータベースをマスクすることをデータセキュリティガードに承認します] を選択し、[OK] をクリックします。

[データマスキング管理] ページで、右上隅にある [マスキングルールの作成] をクリックします。詳細については、「データマスキング管理」をご参照ください。システムは、指定したデータベースのデータをマスキングします。
よくある質問
例に従ってもデータがマスキングされない
症状: 例の手順を実行してもデータがマスキングされません。
考えられる原因:
特定のユーザーに対してデータマスキングが無効になっています。
マスキングラベルが構成されていません。
解決策:
次の SQL コマンドを実行して、特定のユーザーに対してデータマスキングが無効になっているかどうかを確認します。
SELECT usename, label FROM pg_shseclabel s INNER JOIN pg_catalog.pg_user u on s.objoid = u.usesysid;デフォルトでは、クエリ結果は空です。これは、データマスキングルールがすべてのユーザーに対して有効になっていることを示します。クエリ結果が空でない場合は、ユーザーに対してデータマスキングを有効にする必要があります。
次の SQL 文を実行して、構成されているマスキングラベルを確認します。
SHOW hg_anon_labels;結果に ip などのラベルが含まれていない場合は、次の SQL コマンドを実行してマスキングラベルを構成します。
ALTER DATABASE compress_test SET hg_anon_labels = '[ {"label":"ip", "method":{"desensType":"mask", "type":"ip"}}, {"label":"email", "method":{"desensType":"mask", "type":"email"}}, {"label":"name", "method":{"desensType":"mask", "type":"name"}}, {"label":"id", "method":{"desensType":"mask", "type":"id"}}, {"label":"phone", "method":{"desensType":"mask", "type":"phone"}}, {"label":"bank_id", "method":{"desensType":"mask", "type":"bank_id"}}, {"label":"hash", "method":{"desensType":"hash", "type":"md5", "salt":""}}, {"label":"first_mask", "method":{"desensType":"mask", "type":"user_define", "before":1, "after":0}} ]';これらのラベルに対応するルールの詳細については、「事前定義された label_name の値」をご参照ください。