高度な列レベルのセキュリティトピック

このトピックでは、ダイナミックデータマスキングポリシーに関連する2つの高度な概念についてその概要を説明します。

  1. コンテキスト関数 の使用。

  2. ロール階層。

コンテキスト関数とロール階層による列レベルのセキュリティ

列レベルのセキュリティでは、マスキングのポリシー本文の条件で コンテキスト関数 を使用して、ユーザーにデータを表示する権限があるかどうかを強制できます。ユーザーが特定のSQLステートメントでデータを表示できるかどうかを判断するには、次の点を考慮してください。

現在のセッション

CURRENT_ROLE を使用したマスキングポリシー条件では、現在のセッションで使用されているロールがターゲットになります。

実行中のロール

INVOKER_ROLE を使用したマスキングポリシー条件では、SQLステートメントの実行ロールがターゲットになります。

ロール階層

マスキングポリシー条件で指定されたロール(例:ANALYSTカスタムロール)がCURRENT_ROLEまたはINVOKER_ROLEロール階層において権限が低いロールであるかどうかを確認します。その場合、CURRENT_ROLEまたはINVOKER_ROLE関数によって返されるロールは、指定されたロールの権限を継承します。ロール階層と権限継承の詳細については、以下を参照してください。

次の表は、現在のセッション、実行中のロール、およびロール階層を対象とするマスキングポリシーの一般的なコンテキスト関数を示しています。

コンテキスト関数

説明

CURRENT_ROLE

現在のセッションで使用中のロールの名前を返します。

IS_ROLE_IN_SESSION

引数で渡されたロール名がセッションでアクティブ化されたロールの1つである場合は、 TRUE を返します(つまり、 CURRENT_ROLE 関数によって返されるロールは指定されたロールの権限を継承)。

INVOKER_ROLE

実行中ロールの名前を返します。

IS_GRANTED_TO_INVOKER_ROLE

INVOKER_ROLE 関数によって返されたロールが引数で指定されたロールの権限を継承する場合、 TRUE を返します。

INVOKER_SHARE

クエリを実行するデータコンシューマーによって使用中の共有の名前を返します。

CURRENT_ROLEとIS_ROLE_IN_SESSIONの使用

CURRENT_ROLEを使用したマスキングポリシー条件では、現在のセッションがターゲットになり、SQLステートメントの実行コンテキストによる影響を受けません。

次のマスキングポリシー本文を検討してください。

case
  when current_role() in ('ANALYST') then val
  else '********'
end;

特定のユーザーに、このマスキングポリシーが設定されている列のデータを表示する権限があるかどうかを確認するには、次の手順を実行します。

  1. マスキングポリシーの条件を評価します。

  2. 指定されたロールがCURRENT_ROLE階層にあるかどうかを確認します。

  3. 検証するテストクエリを実行します。

ステップ1:マスキングポリシー条件を評価する

次のテーブルは、マスキングポリシー本文の条件の結果をまとめたものです。

コンテキスト

マスクされていないデータを表示する

マスクされたデータを表示する

CURRENT_ROLE = ANALYSTカスタムロール。

CURRENT_ROLE は、階層内の ANALYSTカスタムロールにあります。

CURRENT_ROLE は、 ANALYSTカスタムロール階層にありません。

次に、ロールの階層を評価します。

ステップ2:指定されたロールがCURRENT_ROLE階層にあるかどうかを確認します

CURRENT_ROLEがANALYSTカスタムロールではないと想定して、CURRENT_ROLEがANALYSTカスタムロールに付与された権限を継承しているかどうかを確認します。

次のステートメントを実行します。

select is_role_in_session('ANALYST');

+-------------------------------+
| IS_ROLE_IN_SESSION('ANALYST') |
+-------------------------------+
| FALSE                         |
+-------------------------------+

SnowflakeはFALSEを返すため、CURRENT_ROLEはANALYSTカスタムロールに付与された権限を継承しません。したがって、この例のマスキングポリシー本文に基づいて、ユーザーに固定マスク値が表示されます。

ステップ3:テストクエリを実行して検証する

この例のマスキングポリシーがその列に適用されている列でクエリを実行し、固定マスク値がユーザーに表示されることを検証します。

use role ANALYST;

select <column> from <table_or_view>;

INVOKER_ROLEの使用

INVOKER_ROLEを使用したマスキングポリシー条件では、SQLステートメントの実行コンテキストがターゲットになります。

次のテーブルは、実行コンテキストと、マスキングポリシー条件でINVOKER_ROLEが返す値をまとめたものです。

マスキングポリシーが適用されるクエリ

INVOKER_ROLEが返す値

ビュー

所有者のロールを表示します。

UDF

UDF 所有者のロール。

呼び出し元権限を持つストアドプロシージャ

CURRENT_ROLE.

所有者権限を持つストアドプロシージャ

ストアドプロシージャ所有者のロール。

タスク

タスク所有者のロール。

ストリーム

指定された ストリーム をクエリするロール。

テーブルの単一ビューに適用される次のマスキングポリシー本文を検討してください。

case
  when invoker_role() in ('ANALYST') then val
  else '********'
end;

列でクエリを実行している特定のユーザーにデータ表示権限があるかどうかを確認するには、次の手順を実行します。

  1. マスキングポリシーの条件を評価します。

  2. 指定されたロールがビューを所有しているかどうかを確認します。

  3. 検証するテストクエリを実行します。

ステップ1:マスキングポリシー条件を評価する

次のテーブルは、ビュー列に適用されたマスキングポリシー本文の条件の結果をまとめたものです。

コンテキスト

マスクされていないデータを表示する

マスクされたデータを表示する

ANALYSTカスタムロールは、ビュー所有者ロールです。

ANALYSTカスタムロールは、ビュー所有者ロールではありません。

次に、ANALYSTカスタムロールがビューを所有しているかどうかを確認します。

ステップ2:ANALYSTがビューを所有しているかどうかを確認する

ANALYSTカスタムロールがビューを所有しているかどうかを確認するには、次のステートメントを実行します。

show grants to role analyst;

ANALYSTカスタムロールがビューを所有している場合、ビュー列に対するクエリではマスクされていないデータが出力されるはずです。

ANALYSTカスタムロールがビューを所有していない場合、マスクされたデータが表示されます。

ステップ3:テストクエリを実行して検証する

ビュー列でクエリを実行して、ANALYSTカスタムロールにマスクされたデータとマスクされていないデータのどちらが表示されるかを確認します。

use role ANALYST;

select <column> from <view_name>;

IS_GRANTED_TO_INVOKER_ROLEの使用

IS_GRANTED_TO_INVOKER_ROLE関数は、条件の一部としてマスキングポリシー本文に渡すことができます。関数がTRUEと評価されると、関数引数のロールはINVOKER_ROLE階層にあります。

社会保障番号(SSNs)のビュー列に適用される次のマスキングポリシー本文を検討してください。

case
  when is_granted_to_invoker_role('PAYROLL') then val
  when is_granted_to_invoker_role('ANALYST') then regexp_replace(val, '[0-9]', '*', 7)
  else '*******'
end;

ビュー列でクエリを実行している特定のユーザーにデータ表示権限があるかどうかを確認するには、次の手順を実行します。

  1. マスキングポリシーの条件を評価します。

  2. 指定されたロールがビュー所有者ロール階層にあるかどうかを確認します。

  3. 検証するテストクエリを実行します。

ステップ1:マスキングポリシー条件を評価する

次のテーブルは、ビュー列と、ビュー列で表示するデータに適用されたマスキングポリシー本文の条件の結果をまとめたものです。

コンテキスト

マスクされていないデータ

部分的にマスクされたデータ

マスクされたデータ

PAYROLLカスタムロールは、ビュー所有者ロール階層にあります。

ANALYSTカスタムロールは、ビュー所有者ロール階層にあります。

PAYROLLとANALYSTのカスタムロール . のどちらも、ビュー所有者の階層にはありません。

手順2:指定されたロールがビュー所有者ロール階層にあるかどうかを確認する

PAYROLLとANALYSTカスタムロールのいずれかがビュー所有者階層にある場合、ビュー所有者ロールで SHOW GRANTS コマンドを実行すると、ロール階層を検証できます。例:

show grants to role <view_owner_role>;

SQLステートメントの出力に、ビュー所有者ロールにPAYROLLまたはANALYSTのカスタムロールが付与されているかどうかが示されます。

ステップ3:テストクエリを実行して検証する

この例のマスキングポリシーがその列に適用されている列でクエリを実行し、ユーザーのビュー列にどのようにデータを表示されるかを検証します。

use role PAYROLL;

select <column> from <view>;

use role ANALYST;

select <column> from <view>;