Hologres は、列レベルで機密データを保護するためのデータマスキング機能を提供します。この機能を有効にすると、クエリ結果内の機密データが自動的にマスキングされ、データセキュリティが強化されます。このトピックでは、データマスキングを有効にし、マスキングルールを管理する方法について説明します。
背景情報
クラウドコンピューティングや AI などのビッグデータ技術の普及により、これまでにないデータ価値が生まれています。しかし、これは同時に、機密情報や個人情報の保護において重大なチャレンジも生み出しています。
Hologres のデータマスキングを使用すると、ユーザーレベルおよび列レベルでルールを定義できます。クエリ時に、これらのルールに従ってデータがマスキングされ、機密情報の不正な公開を防ぎます。これにより、個人情報が特定できないようにしながら、データを安全に共有および分析できます。
バージョンの比較
Hologres は V3.1 以降、データマスキングの動作を最適化しました。次の表は、V3.1 以降のバージョンとそれ以前のバージョンの特徴を比較したものです。
|
特徴 |
V3.1 以降 |
V3.0 以前 |
|
TEXT 以外のデータ型のマスキング |
INT、FLOAT、配列などのデータ型に対するデフォルトのマスキングポリシーをサポートします。これらのポリシーは、マスキングポリシーがデフォルト値を使用するように設定されている場合にのみ有効になります。詳細については、「デフォルト値」をご参照ください。 |
サポートされていません。 |
|
ビュー |
結果はマスキングされます。 |
結果はマスキングされません。(非推奨) |
|
マスキングされた列を含む JOIN 句または WHERE 句 |
結果は空になります。 |
結果はマスキングされません。(非推奨) |
|
マスキングされた列に対する Flink のバイナリログ消費 |
|
|
|
MaxCompute からのマスキングされた列の直接読み取り |
MaxCompute がマスキングされた Hologres の列を直接読み取ることを禁止します。 |
読み取りはサポートされています。(非推奨) |
データマスキングバージョンの確認
SELECT hologres.get_hg_anon_version();
前提条件
データマスキングを使用する前に、スーパーユーザーがデータベースレベルで次のコマンドを実行する必要があります。
--スーパーユーザーとして実行
CREATE EXTENSION IF NOT EXISTS hg_anon;
ALTER DATABASE <current_db> SET hg_anon_enable = on;
これらの文を実行した後、データマスキングの動作は 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: The insert table has not set SECURITY LABEL -
マスキングルールが設定されたテーブルに対して
UNIONまたはDISTINCTクエリを実行することはできません。次のエラーが返されます: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 拡張はデータマスキング機能を提供します。SECURITY LABEL 文でプロバイダーとして hg_anon を指定する必要があります。
tablename
マスキングする列を含むテーブルの名前。
col_name
マスキングする列の名前。
label_name
システムに事前定義された匿名化関数については、
SHOW hg_anon_labels;を使用して、現在のデータベースで設定されているlabel_nameを表示できます。user_name
アカウント 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、マスキング後:*******1234。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 JOIN pg_class c ON s.objoid = c.oid JOIN pg_attribute a ON s.objoid = a.attrelid AND s.objsubid = a.attnum; -
ユーザーに設定されたマスキングルールを表示するには:
--ユーザーに設定されたマスキングルールを表示 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}}
文字列の先頭または末尾に指定された数の文字を保持するなど、カスタムのマスキングパターンを許可します。
N/A
例
サンプルデータ
データソースを準備します。独自のビジネスデータを使用することもできます。
--データベースを作成します。
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***@alibaba-inc.com','127.0.0.1','142732199104050022','18157161223','4514610803067088'),
('Li Si','wb-hy583***@antgroup.com','127.0.0.1','510622198412248000','15757121834','6252470010027800'),
('Li Xiaoyao','wb-hy583***@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-hy583***@antgroup.com | 127.0.0.1 | 510622198412248000 | 15757121834 | 6252470010027800
Li Xiaoyao | wb-hy583***@antgroup.com | 172.21.4.234 | 511025198812271696 | 18215451832 | 6252470010027800
Zhang San | jiaxi***@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 グループに参加してサポートを受けてください。詳細については、「オンラインサポートをさらに受けるにはどうすればよいですか?」をご参照ください。
-
機密データの検出を可能にするため、データセキュリティガードはルートアカウントのデータをマスキングしません。
-
データセキュリティガードは、毎日 09:00:00 (UTC+8) にデータをサンプリングして機密データを特定し、それを含む列にマスキングルールを設定します。
-
データセキュリティガードを使用して、中国 (北京)、中国 (張家口)、中国 (上海)、中国 (杭州)、中国 (深セン)、中国 (香港)、シンガポール、ドイツ (フランクフルト)、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、および米国 (シリコンバレー) のリージョンで Hologres のデータをマスキングできます。
-
-
手順
-
データマスキング機能を有効にする。
データマスキングはデフォルトで無効になっています。スーパーユーザーは、ターゲットデータベースで次のコマンドを実行して有効にする必要があります。
--データマスキングの EXTENSION をインストールします。 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;
-
-
マスキング用のデータベースを設定する。
-
データセキュリティガードコンソールにログインします。詳細については、「データセキュリティガードページに移動」をご参照ください。
-
左側のナビゲーションバーで、 をクリックして、Data Identification Rule ページに移動します。
-
機密データの識別 ページで、データ識別ルールを作成します。詳細については、「データ識別ルール」をご参照ください。
-
左側のナビゲーションバーで、データ減感管理 をクリックして、データ減感管理 ページに移動します。
-
[マスキングシナリオ] ドロップダウンリストから 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 の値」をご参照ください。
-