ダイナミックデータマスキングの使用¶
このトピックでは、Snowflakeでダイナミックデータマスキングを構成して使用する方法について説明します。
タグでマスキングポリシーを使用する方法の詳細については、 タグベースのマスキングポリシー をご参照ください。
ダイナミックデータマスキングの使用¶
以下は、Snowflakeでダイナミックデータマスキングを構成して使用するための大まかな手順の一覧です。
セキュリティまたはプライバシー担当者のカスタムロールにマスキングポリシー管理権限を付与します。
適切なユーザーにカスタムロールを付与します。
セキュリティまたはプライバシー担当者は、マスキングポリシーを作成して定義し、機密データが含まれる列に適用します。
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;
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;
table_owner
ロールに ssn_mask
マスキングポリシーの設定または設定解除を許可します(オプション):
GRANT APPLY ON MASKING POLICY ssn_mask to ROLE table_owner;
条件:
db_name.schema_name
権限を付与するスキーマの識別子を指定します。
詳細については、次をご参照ください。
ステップ2: ユーザーにカスタムロールを付与する¶
セキュリティまたはプライバシー担当者として機能するユーザーに MASKING_ADMIN
カスタムロールを付与します。
GRANT ROLE masking_admin TO USER jsmith;
ステップ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;
Tip
既存のマスキングポリシーを更新するために、ポリシーの現在の定義を確認する必要がある場合は、 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;
ステップ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
マスキングポリシーの追加例¶
以下は、ダイナミックデータマスキングポリシーの本文で使用できるその他の代表的な例です。
実稼働 アカウント では、マスクされていない値を表示できるようにし、他のすべてのアカウント(例: 開発、テスト)では、マスクされた値を表示できるようにします。
case when current_account() in ('<prod_account_identifier>') then val else '*********' end;
権限のないユーザーの場合は NULL を返します。
case when current_role() IN ('ANALYST') then val else NULL end;
権限のないユーザーに対して静的なマスク値を返します。
CASE WHEN current_role() IN ('ANALYST') THEN val ELSE '********' END;
権限のないユーザーに対して SHA2 , SHA2_HEX を使用してハッシュ値を返します。マスキングポリシーでハッシュ関数を使用すると、競合が発生する可能性があります。したがって、このアプローチには注意が必要です。詳細については、 高度な列レベルセキュリティのトピック をご参照ください。
CASE WHEN current_role() IN ('ANALYST') THEN val ELSE sha2(val) -- return hash of the column value END;
部分的マスクまたは完全なマスクを適用します。
CASE WHEN current_role() IN ('ANALYST') THEN val WHEN current_role() IN ('SUPPORT') THEN regexp_replace(val,'.+\@','*****@') -- leave email domain unmasked ELSE '********' END;
タイムスタンプの使用。
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;重要
現在Snowflakeでは、マスキングポリシーを定義してタイムスタンプをターゲットにし、文字列(例:
***MASKED***
)を返すなど、入力と出力でデータ型が異なるマスキングポリシーをサポートしていません。入力と出力のデータ型は一致している必要があります。ワークアラウンドとしては、実際のタイムスタンプ値を作成されたタイムスタンプ値でキャストします。詳細については、 DATE_FROM_PARTS および CAST、 :: をご参照ください。
UDF の使用:
CASE WHEN current_role() IN ('ANALYST') THEN val ELSE mask_udf(val) -- custom masking function END;
バリアントデータについて:
CASE WHEN current_role() IN ('ANALYST') THEN val ELSE OBJECT_INSERT(val, 'USER_IPADDRESS', '****', true) END;
カスタム資格テーブルの使用。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;
ENCRYPT または ENCRYPT_RAW のいずれかで以前に暗号化されたデータに DECRYPT を使用し、暗号化されたデータにパスフレーズを使用します。
case when current_role() in ('ANALYST') then DECRYPT(val, $passphrase) else val -- shows encrypted value end;
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;
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;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;Snowflakeは次を返します。
---+--------------------+ A | B | ---+--------------------+ 1 | { | | "coordinates": [ | | -122.35, | | 37.55 | | ], | | "type": "Point" | | } | 2 | { | | "coordinates": [ | | -122.35, | | 37.55 | | ], | | "type": "Point" | | } | ---+--------------------+列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) | ---+----------------------+
他のコンテキスト関数とロール階層の使用例については、 高度な列レベルセキュリティのトピック をご参照ください。
次のトピック: