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

Hologres:データマスキング

最終更新日:Jun 05, 2026

Hologres は、クエリ結果の生の値をマスクされた出力に置き換えることで、列レベルで機密データをマスクし、個人情報を保護します。

背景情報

ビッグデータ、クラウドコンピューティング、AI によってより深いデータマイニングと分析が可能になるにつれて、機密情報や個人情報の保護がますます重要になっています。

Hologres のデータマスキングでは、ユーザーレベルおよび列レベルでルールを設定できます。クエリ実行時、Hologres は結果内の機密データを自動的にマスクすることで、個人情報を公開することなくデータ共有と分析が可能になります。

バージョン比較

Hologres V3.1 では、データマスキングが大幅に改善されました。次の表は、V3.1 以降の動作と以前のバージョンを比較したものです。

機能

V3.1 以降

V3.0 以前

TEXT 以外のデータ型のマスキング

INT、FLOAT、ARRAY などのデータ型に対してデフォルトのマスキングストラテジーを設定できます。ただし、このストラテジーは デフォルト値 マスキングストラテジーでのみ有効になります。

サポートされていません。ワークアラウンドとして 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 のマスキングされた列を直接読み取ることができません。

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

データマスキング (匿名化) バージョンのクエリ

SELECT hologres.get_hg_anon_version();

前提条件

スーパーユーザは、次のステートメントを実行して hg_anon 拡張機能を有効にする必要があります。

-- スーパーユーザとして次のステートメントを実行します。
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: 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 は Hologres の拡張機能です。データマスキングを設定する際に指定する必要があります。

    tablename

    マスク対象の列が含まれるテーブルの名前。

    col_name

    マスク対象の列の名前。

    label_name

    システムには組み込みの匿名化関数が用意されており、SHOW hg_anon_labels; を実行して、現在のデータベースに設定されている label_name の値を確認できます。

    user_name

    アカウント ID。User Info ページで確認できます。

    masked|unmasked

    • masked:データマスキングを有効にします。

    • unmasked:データマスキングを無効にします。

    定義済みラベル:

    タイプ

    label_name

    マスキング戦略

    マスキングタイプ

    説明

    TEXT

    name

    name

    mask

    名前をマスクします。

    • マスキング前:李華、マスキング後:* 華。

    • マスキング前:王小強、マスキング後:*小強。

    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 アルゴリズムを使用してマスキングします。

    マスキング前:浙江省杭州市文一西路、マスキング後:dbf894b409d4a2ef17dfd9c7fdcafcd8。

    first_mask

    first_mask

    mask

    最初の文字のみを表示する first_mask という名前のルールを定義します。

    マスキング前:123456789、マスキング後:1********。

    INT、FLOAT、およびその他のデータ型

    Default

    default_value

    default_value

    デフォルト値を使用してデータをマスクします。

    説明
    • データマスキングを設定する際に、指定されたラベルが存在しない場合、システムはデフォルト値マスキングにフォールバックします。

    • これは 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_labels;
  • 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"}

    名前をマスクします。

    *五。

    {"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 
('田中 茂','jiaxi***@alibaba-inc.com','127.0.0.1','142732199104050022','18157161223','4514610803067088'),
('鈴木 一','wb-hy583***@antgroup.com','127.0.0.1','510622198412248000','15757121834','6252470010027800'),
('佐藤 誠','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      
-------+------------------------+--------------+--------------------+-------------+------------------
 ***一  | wb-***@antgroup.com    | 127.*.*.*    | 5****************0 | *********34 | ************7800
 ***誠  | wb-***@antgroup.com    | 172.**.*.*** | 5****************6 | *********32 | ************7800
 ***茂  | 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;

次の結果が返されます。

  name   |         id         
---------+--------------------
 鈴木 一  | 510622198412248000
 佐藤 誠  | 511025198812271696
 田中 茂  | 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      
---------+--------------------------+--------------+--------------------+-------------+------------------
 鈴木 一  | wb-hy583***@antgroup.com | 127.0.0.1    | 510622198412248000 | 15757121834 | 6252470010027800
 佐藤 誠  | wb-hy583***@antgroup.com | 172.21.4.234 | 511025198812271696 | 18215451832 | 6252470010027800
 田中 茂  | jiaxi***@alibaba-inc.com | 127.0.0.1    | 142732199104050022 | 18157161223 | 4514610803067088
(3 rows)

JOIN カラムのマスキング設定

-- JOIN カラムのマスキングを設定する例。
CREATE TABLE tbl1 (
    id text
);
INSERT INTO tbl1
    VALUES ('142732199104050022');

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

Data Security Guard によるデータマスキング

Data Security Guard を使用して、マスキングルールを設定することもできます。

  • 制限事項

    • Data Security Guard によるデータマスキングは、Hologres V1.1 以降でのみサポートされています。

      説明

      インスタンスが V1.1 未満の場合は、Common errors during upgrade preparation を参照するか、Hologres DingTalk グループに参加してサポートを依頼してください。詳細については、「How do I obtain more online support?」をご参照ください。

    • 既定では、Data Security Guard は機密データを検出するために、Alibaba Cloud アカウントのマスキングを無効にします。

    • Data Security Guard は毎日 09:00:00 にデータをサンプリングし、機密列を識別して、それらにマスキングルールを適用します。

    • 現在、Data Security Guard で 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;
    • マスキング用のデータベースのセットアップ

      1. Data Security Guard コンソールにログインします。Data Security Guard のページに移動

      2. 左側のナビゲーションペインで、ルール設定 > Data Identification Rule を選択して、Data Identification Rule ページに移動します。

      3. 機密データの識別 ページで、データ識別ルールを作成します。Data identification rules

      4. 左側のナビゲーションペインで、データ減感管理 をクリックして、データ減感管理 ページに移動します。

      5. [masking scenario] ドロップダウンリストから Hologres display masking (hologres_display_desense_code) を選択し、[Select database for masking] をクリックします。

      6. [Authorize Account for Masking] ダイアログボックスで、[Unmasked databases] リストからマスクするデータベースを選択し、[Masked databases] リストに移動させます。[I agree to authorize Data Security Guard to mask data in this database] のチェックボックスを選択し、OK をクリックします。Authorize account data masking

      7. データ減感管理 ページの右上で [Create Masking Rule] をクリックします。Data masking management。その後、システムは設定したデータベースのデータをマスクします。

よくある質問

データがマスキングされないのはなぜですか?

  • 症状:使用例の手順に従っても、データがマスキングされません。

  • 考えられる原因:

    • 一部のユーザーに対してマスキングを無効にするルールが設定されています。

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

  • 解決策:

    • 次の 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}}
      ]';

      これらのラベルは、「事前定義ラベル」で説明されているルールに対応します。