ダイナミックデータマスキングの使用

このトピックでは、Snowflakeでダイナミックデータマスキングを構成して使用する方法について説明します。

タグでマスキングポリシーを使用する方法の詳細については、 タグベースのマスキングポリシー をご参照ください。

ダイナミックデータマスキングの使用

以下は、Snowflakeでダイナミックデータマスキングを構成して使用するための大まかな手順の一覧です。

  1. セキュリティまたはプライバシー担当者のカスタムロールにマスキングポリシー管理権限を付与します。

  2. 適切なユーザーにカスタムロールを付与します。

  3. セキュリティまたはプライバシー担当者は、マスキングポリシーを作成して定義し、機密データが含まれる列に適用します。

  4. Snowflakeでクエリを実行します。次の点に注意してください。

    • Snowflakeは、マスキングポリシーSQL式を列に適用してクエリを動的に書き換えます。

    • 列の書き換えは、マスキングポリシーで指定された列がクエリに表示されるすべての場所で発生します(たとえば、プロジェクション、結合述語、where句述語、order by、group byなど)。

    • ユーザーには、マスキングポリシーで定義された実行コンテキスト条件に基づいて、マスキングされたデータが表示されます。ダイナミックデータマスキングポリシーの実行コンテキストの詳細については、 高度な列レベルセキュリティのトピック をご参照ください。

ステップ1: カスタムロールにマスキングポリシー権限を付与する

セキュリティ担当者またはプライバシー担当者 は、マスキングポリシー管理者(つまり、カスタムロール: MASKING_ADMIN)として機能し、マスキングポリシーを定義、管理、および列に適用する権限を持っている必要があります。

Snowflakeは、列レベルのセキュリティマスキングポリシーのセキュリティ担当者またはプライバシー担当者に付与する次の権限を提供します。

権限

説明

CREATE MASKING POLICY

このスキーマレベルの権限は、誰がマスキングポリシーを作成できるかを制御します。

APPLY MASKING POLICY

このアカウントレベルの権限は、列にマスキングポリシーを設定/設定解除でき、デフォルトで ACCOUNTADMIN ロールを付与されているは誰かを制御します。 . この権限では、マスキングポリシーの列への適用を許可するのみで、 アクセス制御権限 により説明されている追加のテーブル権限は提供 されません

APPLY ON MASKING POLICY

オプション。ポリシー所有者はこのポリシーレベルの権限を使用して、列における特定のマスキングポリシーの設定/設定解除操作をオブジェクト所有者に分散させることができます(つまり、オブジェクトに対する OWNERSHIP 権限を持つロール)。 . Snowflakeは、オブジェクト所有者がデータスチュワードとも見なされる 任意のアクセス制御 をサポートしています。 . ポリシー管理者が保護された列のデータスチュワードとしてオブジェクト所有者を信頼している場合、ポリシー管理者はこの権限を使用して、ポリシーの適用設定/設定解除操作を分散できます。

次の例では、 MASKING_ADMIN ロールを作成し、そのロールにマスキングポリシー権限を付与します。

マスキングポリシー管理者のカスタムロールを作成します。

use role useradmin;
CREATE ROLE masking_admin;
Copy

masking_admin ロールに権限を付与します。

use role securityadmin;
GRANT CREATE MASKING POLICY on SCHEMA <db_name.schema_name> to ROLE masking_admin;
GRANT APPLY MASKING POLICY on ACCOUNT to ROLE masking_admin;
Copy

table_owner ロールに ssn_mask マスキングポリシーの設定または設定解除を許可します(オプション):

GRANT APPLY ON MASKING POLICY ssn_mask to ROLE table_owner;
Copy

条件:

  • db_name.schema_name

    権限を付与するスキーマの識別子を指定します。

詳細については、次をご参照ください。

ステップ2: ユーザーにカスタムロールを付与する

セキュリティまたはプライバシー担当者として機能するユーザーに MASKING_ADMIN カスタムロールを付与します。

GRANT ROLE masking_admin TO USER jsmith;
Copy

ステップ3: 外部トークン化のマスキングポリシーを作成する

MASKING_ADMIN ロールを使用して、マスキングポリシーを作成し、列に適用します。

この代表的な例では、ANALYSTロールを持つユーザーにマスクされていない値が表示されます。ANALYST のロールがないユーザーには完全なマスクが表示されます。

CREATE OR REPLACE MASKING POLICY email_mask AS (val string) RETURNS string ->
  CASE
    WHEN CURRENT_ROLE() IN ('ANALYST') THEN val
    ELSE '*********'
  END;
Copy

ちなみに

既存のマスキングポリシーを更新するために、ポリシーの現在の定義を確認する必要がある場合は、 GET_DDL 関数を呼び出すか、 DESCRIBE MASKING POLICY コマンドを実行します。

ステップ4: テーブルまたはビュー列にマスキングポリシーを適用する

これらの例では、テーブルの作成時にテーブル列に対して、またビューの作成時にビュー列に対してマスキングポリシーが適用されないことを前提としています。オプションで、 CREATE TABLE ステートメントを使用してテーブルを作成するとき、または CREATE VIEW ステートメントを使用してビュー列を作成するときに、テーブル列にマスキングポリシーを適用できます。

次のステートメントを実行して、テーブル列またはビュー列にポリシーを適用します。

-- apply masking policy to a table column

ALTER TABLE IF EXISTS user_info MODIFY COLUMN email SET MASKING POLICY email_mask;

-- apply the masking policy to a view column

ALTER VIEW user_info_v MODIFY COLUMN email SET MASKING POLICY email_mask;
Copy

ステップ5: Snowflakeでデータをクエリする

Snowflakeで2つの異なるクエリを実行します。1つは ANALYST ロールを持つクエリ、もう1つは異なるロールを持つクエリで、ANALYSTロールのないユーザーに完全なマスクが表示されることを確認します。

-- using the ANALYST role

USE ROLE analyst;
SELECT email FROM user_info; -- should see plain text value

-- using the PUBLIC role

USE ROLE PUBLIC;
SELECT email FROM user_info; -- should see full data mask
Copy

マスキングポリシーの追加例

以下は、ダイナミックデータマスキングポリシーの本文で使用できるその他の代表的な例です。

実稼働 アカウント では、マスクされていない値を表示できるようにし、他のすべてのアカウント(例: 開発、テスト)では、マスクされた値を表示できるようにします。

case
  when current_account() in ('<prod_account_identifier>') then val
  else '*********'
end;
Copy

権限のないユーザーの場合は NULL を返します。

case
  when current_role() IN ('ANALYST') then val
  else NULL
end;
Copy

権限のないユーザーに対して静的なマスク値を返します。

CASE
  WHEN current_role() IN ('ANALYST') THEN val
  ELSE '********'
END;
Copy

権限のないユーザーに対して SHA2 , SHA2_HEX を使用してハッシュ値を返します。マスキングポリシーでハッシュ関数を使用すると、競合が発生する可能性があります。したがって、このアプローチには注意が必要です。詳細については、 高度な列レベルセキュリティのトピック をご参照ください。

CASE
  WHEN current_role() IN ('ANALYST') THEN val
  ELSE sha2(val) -- return hash of the column value
END;
Copy

部分的マスクまたは完全なマスクを適用します。

CASE
  WHEN current_role() IN ('ANALYST') THEN val
  WHEN current_role() IN ('SUPPORT') THEN regexp_replace(val,'.+\@','*****@') -- leave email domain unmasked
  ELSE '********'
END;
Copy

タイムスタンプの使用。

case
  WHEN current_role() in ('SUPPORT') THEN val
  else date_from_parts(0001, 01, 01)::timestamp_ntz -- returns 0001-01-01 00:00:00.000
end;
Copy

重要

現在Snowflakeでは、マスキングポリシーを定義してタイムスタンプをターゲットにし、文字列(例: ***MASKED***)を返すなど、入力と出力でデータ型が異なるマスキングポリシーをサポートしていません。入力と出力のデータ型は一致している必要があります。

ワークアラウンドとしては、実際のタイムスタンプ値を作成されたタイムスタンプ値でキャストします。詳細については、 DATE_FROM_PARTS および CAST、 :: をご参照ください。

UDF の使用:

CASE
  WHEN current_role() IN ('ANALYST') THEN val
  ELSE mask_udf(val) -- custom masking function
END;
Copy

バリアントデータについて:

CASE
   WHEN current_role() IN ('ANALYST') THEN val
   ELSE OBJECT_INSERT(val, 'USER_IPADDRESS', '****', true)
END;
Copy

カスタム資格テーブルの使用。WHEN 句での EXISTS の使用に注意してください。マスキングポリシー本文にサブクエリを含める場合は、常に EXISTS を使用してください。Snowflakeがサポートするサブクエリの詳細については、 サブクエリの操作 をご参照ください。

CASE
  WHEN EXISTS
    (SELECT role FROM <db>.<schema>.entitlement WHERE mask_method='unmask' AND role = current_role()) THEN val
  ELSE '********'
END;
Copy

ENCRYPT または ENCRYPT_RAW のいずれかで以前に暗号化されたデータに DECRYPT を使用し、暗号化されたデータにパスフレーズを使用します。

case
  when current_role() in ('ANALYST') then DECRYPT(val, $passphrase)
  else val -- shows encrypted value
end;
Copy

JSON (VARIANT) での <JavaScript UDF の使用

この例では、JavaScript UDF は JSON 文字列の位置データをマスクします。UDF とマスキングポリシーでデータ型を VARIANT に設定することが重要です。テーブル列、 UDF、 およびマスキングポリシー署名内のデータ型が一致しない場合、Snowflakeは SQL クエリを解決できないため、エラーメッセージを返します。

-- Flatten the JSON data

create or replace table <table_name> (v variant) as
select value::variant
from @<table_name>,
  table(flatten(input => parse_json($1):stationLocation));

-- JavaScript UDF to mask latitude, longitude, and location data

CREATE OR REPLACE FUNCTION full_location_masking(v variant)
  RETURNS variant
  LANGUAGE JAVASCRIPT
  AS
  $$
    if ("latitude" in V) {
      V["latitude"] = "**latitudeMask**";
    }
    if ("longitude" in V) {
      V["longitude"] = "**longitudeMask**";
    }
    if ("location" in V) {
      V["location"] = "**locationMask**";
    }

    return V;
  $$;

  -- Grant UDF usage to ACCOUNTADMIN

  grant ownership on function FULL_LOCATION_MASKING(variant) to role accountadmin;

  -- Create a masking policy using JavaScript UDF

  create or replace masking policy json_location_mask as (val variant) returns variant ->
    CASE
      WHEN current_role() IN ('ANALYST') THEN val
      else full_location_masking(val)
      -- else object_insert(val, 'latitude', '**locationMask**', true) -- limited to one value at a time
    END;
Copy

GEOGRAPHY データ型の使用:

この例では、マスキングポリシーは、 TO_GEOGRAPHY 関数を使用して、列内のすべての GEOGRAPHY データを、 CURRENT_ROLE が ANALYST ではないユーザーのために、カリフォルニア州サンマテオのSnowflakeの経度と緯度である固定小数点に変換します。

create masking policy mask_geo_point as (val geography) returns geography ->
  case
    when current_role() IN ('ANALYST') then val
    else to_geography('POINT(-122.35 37.55)')
  end;
Copy

GEOGRAPHY データ型の列にマスキングポリシーを設定し、セッションの GEOGRAPHY_OUTPUT_FORMAT 値を GeoJSON に設定します。

alter table mydb.myschema.geography modify column b set masking policy mask_geo_point;
alter session set geography_output_format = 'GeoJSON';
use role public;
select * from mydb.myschema.geography;
Copy

Snowflakeは次を返します。

---+--------------------+
 A |         B          |
---+--------------------+
 1 | {                  |
   |   "coordinates": [ |
   |     -122.35,       |
   |     37.55          |
   |   ],               |
   |   "type": "Point"  |
   | }                  |
 2 | {                  |
   |   "coordinates": [ |
   |     -122.35,       |
   |     37.55          |
   |   ],               |
   |   "type": "Point"  |
   | }                  |
---+--------------------+
Copy

列Bのクエリ結果の値は、セッションの GEOGRAPHY_OUTPUT_FORMAT パラメーターによって異なります。たとえば、パラメーターが WKT に設定されている場合、Snowflakeは次を返します。

alter session set geography_output_format = 'WKT';
select * from mydb.myschema.geography;

---+----------------------+
 A |         B            |
---+----------------------+
 1 | POINT(-122.35 37.55) |
 2 | POINT(-122.35 37.55) |
---+----------------------+
Copy

他のコンテキスト関数とロール階層の使用例については、 高度な列レベルセキュリティのトピック をご参照ください。

次のトピック: