PostgreSQL アノニマイザーを使用したデータマスキング

Databases for PostgreSQL Anonymizerは、 データベース内の個人を特定できる情報や機密性の高いビジネス情報をマスキングまたは置換することで、データを匿名化するように設計された 拡張機能です。 Databases for PostgreSQL PostgreSQL

このエクステンションは以下のマスキング戦略をサポートしており、それぞれ異なるユースケースに適している:

  • 静的マスキング :ルールに従ってPIIを削除する。
  • ダイナミック・マスキング :マスキングされたユーザーに対してのみPIIを隠す。
  • 匿名ダンプ :マスクされたデータをSQLファイルにエクスポートするだけです。
  • 一般化 :特定の値を、より広範で正確さに欠けるカテゴリーや範囲に置き換えること。

スタティック・マスキング

静的マスキングは、機密情報を合成的に生成された値に不可逆的に置き換えるデータ匿名化技術です、 形式を保持した値に置き換えます。 このプロセスは、オリジナル・データの完全かつ永久的な削除を保証し、それによって再識別や再構築の可能性を排除する。 再識別や再構成の可能性を排除する。 詳しくは、 静的マスキングを 参照のこと。

静的マスキングの有効化

  1. Anonymizer Extensionをインストールします。

    CREATE EXTENSION IF NOT EXISTS anon;
    
  2. アノニマイザーを初期化する。

    select public.run_anon_init();
    
  3. マスキングルールを定義する。

    SECURITY LABEL FOR anon
      ON COLUMN <table_name>.<column_name>
      IS 'MASKED WITH FUNCTION anon.<masking_function>()';
    
  4. 適用されたマスキングルールを確認する。

    SELECT objoid::regclass, provider, label
    FROM pg_seclabel
    WHERE provider = 'anon' AND objoid = '<table_name>'::regclass;
    
  5. ルールを恒久的に適用する。以下のコマンドは、指定されたテーブルの元のデータをマスクされたデータで恒久的に置き換える。

    SELECT anon.anonymize_table('<table_name>');
    
  • スタティック・マスキングには時間がかかる。 静的マスキングの原則は、少なくとも1つのマスキングされたカラムを含むすべてのテーブルのすべての行を更新することである。 これは、 PostgreSQL、ディスク上のデータをすべて書き換えることを意味する。 データベースのサイズ、ハードウェア、インスタンス構成によっては、匿名化されたデータをエクスポートしてデータベースに再ロードした方が速い場合があります。

  • テーブルの新規挿入行にマスキングを適用するには、以下のコマンドを実行する。

    SELECT anon.anonymize_table('<table_name>');
    

    このコマンドは、テーブルに追加された新しいデータが、設定された匿名化ルールに従ってマスクされることを保証する。

ダイナミック・マスキング

ダイナミック・マスキングは、データベース所有者が特定のユーザーに対して機密データを隠蔽することを可能にします、 一方、許可されたユーザはマスキングされていない元の値にアクセスし、変更することができます。 詳しくは、 ダイナミック・マスキングを 参照のこと。

ダイナミック・マスキングの有効化

  1. Anonymizer Extensionをインストールします。

    CREATE EXTENSION IF NOT EXISTS anon;
    
  2. アノニマイザーを初期化する。

    select public.run_anon_init();
    
  3. ダイナミック・マスキング・エンジンを起動する。

    show anon.transparent_dynamic_masking;
    
    select public.enable_dynamic_masking ('<database_name>');
    

    anon.transparent_dynamic_masking がオフと表示されている場合は、セッションを再起動してください。

  4. マスクされたアクセス用のロールを作成する。

    CREATE ROLE <role_name> LOGIN;
    
  5. ロールをマスク・ユーザーとしてマークする。

      SECURITY LABEL FOR anon ON ROLE <role_name> IS 'MASKED';
    
  6. ロールにマスキング・テーブルの権限を与えます。

      grant select on <schema_name>.<table_name> to <role_name> ;
    
  7. マスキングルールを宣言する。

    SECURITY LABEL FOR anon
      ON COLUMN <table_name>.<column_name>
      IS 'MASKED WITH FUNCTION anon.<masking_function>()';
    
  8. マスキングルールを確認する。

    SELECT objoid::regclass, provider, label
    FROM pg_seclabel
    WHERE provider = 'anon' AND objoid = '<table_name>'::regclass;
    
  9. マスクされたロールを使用してデータベースに接続し、テーブルに問い合わせる。 定義されたルールに従ってマスクされたデータが表示されるはずです。

select * from <table_name>;

注:

  • アノニマイザーは、誰がクエリーを行うかに基づいてデータをマスクする。
  • マスクされたロールは、データの挿入、更新、削除を許可されるべきではありません。
  • 複数のスキーマでテーブルをマスクすることができる。
  • マスキング・ルールは、データの整合性を壊す可能性がある。 例えば、UNIQUE制約を持つカラムを値NULLでマスクすることができます。 マスク・ユーザーにデータ・インテグリティが必要かどうかは、あなた次第だ。
  • マスクされたロールはEXPLAINを使用できません。

匿名ダンプ

匿名ダンプとは、元の機密値ではなく、匿名化または非識別化されたデータを含むデータベースをエクスポートするプロセスを指す。 これは通常、個人を特定できる情報(PII)や機微な属性を公開することなく、データを安全に共有、移行、分析するために行われる。 個人を特定できる情報(PII)やセンシティブな属性を公開することなく、データを安全に共有または分析するために行われます。 詳しくは 匿名ダンプを 参照。

匿名ダンプの有効化

  1. Anonymizer Extensionをインストールします。

    CREATE EXTENSION IF NOT EXISTS anon;
    
  2. アノニマイザーを初期化する。

    select public.run_anon_init();
    
  3. カスタムマスキング機能専用のスキーマを作成する。

     CREATE SCHEMA IF NOT EXISTS <schema_name>;
    
  4. マスクされたデータをエクスポートするためのロールを作成します。

     CREATE ROLE <role_name> LOGIN PASSWORD '<enter_password>';
    
  5. ロールのマスキングを有効にする。

    select  public.enable_masking_for_dump('<role_name>','<schema_name>');
    
  6. 次の例のように、カスタムマスキング関数を定義する。

    CREATE OR REPLACE FUNCTION <schema_name>.remove_content(j JSONB)
    RETURNS JSONB
    AS $func$
      SELECT j - ARRAY['content']
    $func$
    LANGUAGE SQL;
    
  7. マスキングルールを作成する。

    SECURITY LABEL FOR anon
      ON COLUMN <table_name>.<column_name>
      IS 'MASKED WITH FUNCTION <schema_name>.<custom_masking_function>()';
    
  8. マスクされた役割としてラベルを付ける。

    SECURITY LABEL FOR anon ON ROLE <schema_name> IS 'MASKED';
    
  9. マスクされたスキーマへのアクセスを許可する。

    GRANT USAGE ON SCHEMA <schema_name> TO <masked_role>;
    
  10. マスクされたテーブルのセレクトアクセスを許可する。

grant select ON <schema_name>.<table_name> to <masked_role>;
  1. マスクされたロールとしてpg_dumpを使用してマスクされたデータをエクスポートします。

詳細は pg dump commandsを 参照。

マスクされたデータをエクスポートするには、マスクされたロールを使用してpg_dumpを実行してください。 pg_dumpが管理ユーザによって実行された場合、データはマスキングされずにエクスポートされます。

一般化

汎化の主な考え方は、元のデータをぼかすことである。 詳しくは 汎化を 参照。

一般化を可能にする

  1. 匿名化エクステンションをインストールします。

    CREATE EXTENSION IF NOT EXISTS anon;
    
  2. アノニマイザーを初期化する。

    select public.run_anon_init();
    
  3. 汎化関数を使用してビューを作成します。

    CREATE MATERIALIZED VIEW <view_name> AS
    SELECT
        anon.generalize_daterange(<date_column_1>, 'month') AS <generalized_date_1>,
        anon.generalize_daterange(<date_column_2>, 'month') AS <generalized_date_2>
    FROM <source_table>;
    
  4. 間接識別子を宣言する。

    SECURITY LABEL FOR k_anonymity
      ON COLUMN <view_name>.<generalized_date_1> IS 'INDIRECT IDENTIFIER';
    
    SECURITY LABEL FOR k_anonymity
      ON COLUMN <view_name>.<generalized_date_2> IS 'INDIRECT IDENTIFIER';
    
  5. k-匿名へのアクセスを許可する。

    select public.k_anonymity();
    
  6. ビューまたはテーブルに対してk-匿名性チェックを実行する。

    SELECT anon.k_anonymity('<view_name/table_name>');
    

役割のマスクを剥ぐ

ロールのマスクを解除するには、以下のコマンドを使用する。

SECURITY LABEL FOR anon ON ROLE <role_name> IS NULL;

マスキング・ルールを無効にする

マスキング・ロールを無効にするには、以下のコマンドを使用する。

SECURITY LABEL FOR anon
  ON COLUMN <table_name>.<column_name>
  IS NULL;