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

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

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

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

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

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

  3. 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 ロールを作成し、そのロールにマスキングポリシー権限を付与します。

-- create a masking policy administrator custom role

CREATE ROLE masking_admin;

-- grant privileges to masking_admin role.

GRANT CREATE MASKING POLICY on SCHEMA <schema_name> to ROLE masking_admin;

GRANT APPLY MASKING POLICY on ACCOUNT to ROLE masking_admin;

-- allow table_owner role to set or unset the ssn_mask masking policy (optional)

GRANT APPLY ON MASKING POLICY ssn_mask to ROLE table_owner;

条件:

  • スキーマ名

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

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

ステップ2:マスキングポリシーを作成して列に適用する

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

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

-- create masking policy

create or replace masking policy email_mask as (val string) returns string ->
  case
    when current_role() in ('ANALYST') then val
    else '*********'
  end;

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

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

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

ステップ4: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

その他のマスキングポリシーの例

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

権限のないユーザーの場合は 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;

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 を使用してください。

CASE
  WHEN current_role() EXISTS
    (SELECT role from <db>.<schema>.entitlement where mask_method='unmask') 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 における JavaScript UDFs の使用(バリアント):

この例では、JavaScript UDF は JSON 文字列の位置データをマスクします。UDF とマスキングポリシーでデータ型を VARIANT に設定することが重要です。

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

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

次のトピック: