すべてのプロダクト
Search
ドキュメントセンター

Hologres:データマスキング

最終更新日:Feb 04, 2026

Hologres は、列レベルでマスキングルールを定義できるデータマスキング機能を提供します。この機能を有効にすると、機密情報を含むクエリはマスクされた結果を返し、機密データとプライベートデータの保護を強化します。このトピックでは、Hologres でデータマスキングを有効化、クエリ、削除する方法について説明します。

背景情報

ビッグデータ時代は、ビッグデータ、クラウドコンピューティング、人工知能などのテクノロジーをもたらし、大規模なデータセットに秘められた計り知れない価値を引き出すための、詳細なデータマイニングと分析を可能にしました。しかし、これは機密情報やプライベート情報の保護において課題も提起しています。

Hologres のデータマスキングを使用すると、ユーザーレベルと列レベルの両方でマスキングポリシーを設定できます。クエリに機密データが含まれる場合、結果は自動的にマスクされます。これにより、機密情報やプライベート情報が特定できないようにしながら、効率的なデータ共有、マイニング、分析が可能になり、データ保護が向上します。

バージョン比較

V3.1 以降、Hologres はデータマスキングの動作を最適化しました。以下の表は、データマスキングを効果的に使用するために、V3.1 以降のバージョンとそれ以前のバージョンの特徴を比較したものです。

特徴

V3.1 以降

V3.0 以前

TEXT 以外のフィールドのマスキング

INT、FLOAT、配列などの型に対してデフォルトのマスキングポリシーを設定できます。これは、マスキングポリシーがデフォルト値に設定されている場合にのみ有効です。詳細については、「デフォルト値」をご参照ください。

サポートされていません。ただし、`CAST TEXT` を使用してマスキングをバイパスできます。この方法は推奨されません。

ビュー

結果はマスキングされます。

結果はマスクされません。この方法は推奨されません。

JOIN 句または WHERE 句のマスキングされたフィールド

結果は空になります。

結果はマスクされません。この方法は推奨されません。

Flink がマスクされたフィールドのバイナリログを消費する

  • 消費されるテーブルがユーザーに対してマスクされている場合、すべてのモードでバイナリログの消費が禁止されます。

  • 消費されるテーブルがユーザーに対してマスクされていない場合、すべてのモードでバイナリログを消費できます。

  • V2.2.38 より前のバージョン、および V3.0.1 から V3.0.19 までのバージョン:

    • Fixed FE モードは、マスクされたフィールドの消費をサポートしていません。

    • FE モードは、マスクされたフィールドの消費をサポートしています。

  • V3.0.19 から V3.0.27 までのバージョン

    Fixed FE モードと FE モードの両方でバイナリログの消費が禁止されます。データを消費するには、ユーザーのすべてのテーブルのデータマスキングをキャンセルする必要があります。

    -- このユーザーのマスキングを無効にします
    ALTER ROLE "<user>" SET hg_anon_enable = OFF;
    -- 特定のデータベースでこのユーザーのマスキングを無効にします
    ALTER ROLE "<user>" IN DATABASE <database> SET hg_anon_enable = OFF;
  • V3.0.28 以降、データマスキング関連の GUC が有効になっていても、テーブルの結果に対してマスキング操作が実行されない場合は、Fixed FE モードと FE モードでバイナリログを消費できます。

MaxCompute がマスクされたフィールドを直接読み取る

MaxCompute からマスクされた Hologres フィールドを直接読み取ることを禁止します。

読み取りはサポートされています。この方法は推奨されません。

事前準備

データマスキングを使用する前に、スーパーユーザーはデータベースレベルで次のパラメーターを有効にする必要があります。

-- スーパーユーザーによって実行されます
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" で失敗した場合、機能の有効化に失敗しました。これは、現在の DB で 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

    アカウント ID です。ユーザー情報ページから取得できます。

    masked|unmasked

    • masked:データマスキングを使用します。

    • unmasked:データマスキングを使用しません。

    次の表に、プリセットの label_name 値を示します。

    データ型

    label_name

    マスキングポリシー

    マスキングタイプ

    説明

    マスキング例

    TEXT

    name

    name

    mask

    名前マスキング。

    • 変更前:Li Hua;変更後:* Hua。

    • 変更前: Wang Xiaoqiang、変更後: ** Qiang。

    email

    email

    mask

    メールアドレスマスキング。

    マスク前:lihu***@alibaba.com、マスク後:lih***@alibaba.com。

    ip

    ip

    mask

    IP アドレスマスキング。

    マスク前:1.2.3.4、マスク後:1.*.*.*。

    id

    id

    mask

    ID カード番号マスキング。

    マスク前:110345188812011234、マスク後:1****************4。

    phone

    phone

    mask

    電話番号マスキング。

    マスク前:1390000****、マスク後:*********34。

    bank_id

    bank_id

    mask

    銀行カードまたはクレジットカードアカウントのマスキング。

    マスク前:2349867902834701928、マスク後:***************1928。

    hash

    md5

    hash

    MD5 アルゴリズムを使用してマスキングします。

    変更前: 浙江省杭州市文一西路、変更後: dbf894b409d4a2ef17dfd9c7fdcafcd8。

    first_mask

    first_mask

    mask

    `first_mask` ルールは、最初の文字のみを表示するように定義されています。

    マスク前:123456789、マスク後:1********。

    INT や FLOAT などの型

    Default

    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"}

    名前マスキング。

    *5

    {"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***@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 行)

列のマスキングをキャンセルする

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行)

ユーザーのマスキングルールをキャンセルする

-- 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 行)

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 以降のみが Data Security Guard を使用したデータマスキングをサポートしています。

      説明

      ご利用のインスタンスが V1.1 より前のバージョンの場合は、一般的なアップグレード準備エラー」をご参照いただくか、Hologres DingTalk グループでフィードバックを提供してください。詳細については、「オンラインサポートをさらに受けるにはどうすればよいですか?」をご参照ください。

    • 機密データを検出するために、Data Security Guard はルートアカウントのデータをマスクしないルールを設定します。

    • 現在、毎日 9:00:00 に、Data Security Guard はデータをサンプリングし、機密データを識別し、識別された機密データ列にマスキングルールを設定します。

    • 現在、Hologres は、中国 (北京)、中国 (張家口)、中国 (上海)、中国 (杭州)、中国 (深セン)、中国 (香港)、シンガポール、ドイツ (フランクフルト)、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、米国 (シリコンバレー) の各リージョンで Data Security Guard を使用したデータマスキングをサポートしています。

  • 使用方法

    • マスキング機能を有効にする。

      データマスキング機能はデフォルトで無効になっています。スーパーユーザー権限を持つユーザーは、対応するデータベースで次のコマンドを実行して有効にする必要があります。

      -- データマスキング 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;
    • マスキングするデータベースを設定する。

      1. データセキュリティガードコンソールにログインします。詳細については、「データセキュリティガードへ移動」をご参照ください。

      2. 左側のナビゲーションウィンドウで、[ルール設定] > [データ識別ルール] をクリックして、[データ識別ルール] ページに移動します。

      3. [機密データ識別] ページで、データ識別ルールを作成します。詳細については、「データ識別ルール」をご参照ください。

      4. 左側のナビゲーションウィンドウで、[データマスキング管理] をクリックして、[データマスキング管理] ページに移動します。

      5. [マスキングシナリオ] ドロップダウンリストで、Hologres 表示マスキング (hologres_display_desense_code) を選択し、右側の [マスキングするデータベースを選択] をクリックします。

      6. [マスキング用アカウントの承認] ダイアログボックスで、[マスクされていないデータベース] リストからマスクするデータベースを選択して [マスクされたデータベース] リストに移動します。[このデータベースをマスクするために Data Security Guard を承認することに同意します] を選択し、OK をクリックします。授权账号脱敏

      7. [データマスキング管理] ページで、右上隅の [新しいマスキングルール] をクリックします。詳細については、「データマスキング管理」をご参照ください。その後、システムは設定したデータベースをマスクします。

よくある質問

使用例に従ってもデータがマスクされない

  • 現象:使用例に従った後、クエリされたデータがマスクされていないことがわかります。

  • 考えられる原因:

    • 一部のユーザーに対してデータをマスクしないルールが設定されています。

    • マスキングラベルが設定されていません。

  • 解決策:

    • 次の SQL コマンドを実行して、一部のユーザーに対してデータをマスクしないルールが設定されているかどうかを確認します。

      SELECT
        usename,
        label
      FROM pg_shseclabel s
      INNER JOIN pg_catalog.pg_user u on s.objoid = u.usesysid;

      デフォルトでは、この SQL 文のクエリ結果は空であり、すべてのユーザーに対してデータをマスクする必要があることを意味します。結果が空でない場合は、データマスキングの対象となるユーザーを設定します。

    • 次の 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 の詳細」をご参照ください。