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

このトピックでは、列レベルのセキュリティマスキングポリシーに関連する2つの高度な概念についてその概要を説明します。

  1. ロール階層。

  2. 複数の コンテキスト関数 を使用します。

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

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

現在のセッション

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

実行中のロール

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

ロール階層

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

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

コンテキスト関数

説明

CURRENT_ROLE

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

IS_ROLE_IN_SESSION

セッション内のユーザーの現在のロール(つまり、 CURRENT_ROLE によって返されるロール)が指定されたロールの権限を継承する場合は、TRUE を返します。

INVOKER_ROLE

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

IS_GRANTED_TO_INVOKER_ROLE

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

INVOKER_SHARE

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

マスキングポリシーでCURRENT_ROLEとINVOKER_ROLEを組み合わせる

Snowflakeは、クエリを実行するセッション(つまり、 CURRENT_ROLE)とクエリを実行するオブジェクト所有者(ビュー所有者 INVOKER_ROLE など)で使用されているロールを区別するための単一のマスキングポリシーの作成をサポートしています。このタイプのユースケースは、通常、マスクする値のセットと、マスクされていない値を表示できる比較的少数のオーディエンス(たとえば、ANALYSTカスタムロールを持つユーザー)を決定するよりも複雑です。

マスキングポリシーのハッシュ、暗号化、および暗号化関数

ハッシュ および 暗号化/チェックサム は、機密データをマスクするためのマスキングポリシーで使用できます。

これらの関数のいずれかを ダイナミックデータマスキング マスキングポリシーに実装する前に、これらの関数のユースケースに JOIN 操作が含まれるかどうかを検討することが重要です。特定のマスキングポリシーの実装では、テーブルとビューを含むクリエイティブなJOIN操作により、次の制限に基づいてマスクされた値がその実際の値にリバースエンジニアリングされる可能性があります。

  • 実際の値(つまり入力)と、値の総数に基づくハッシュ値、暗号化値、またはチェックサム値(つまり、出力、値の範囲)は1対1の表現でないため、競合が発生する可能性があります。

1対1の表現は、入力値の総数が変換する出力値の平方根に達するまで発生する可能性が高くなります。

たとえば、ハッシュへの出力値が144の場合、最初の12値、つまり、144^(1/2)、144の平方根が一意であり、残りの132値に対して競合が発生する可能性があると予期することは妥当です。この制限とその結果が発生する可能性があるため、JOIN操作で値が使用される可能性のあるマスキングポリシーでは、ハッシュ関数、暗号化関数、またはチェックサム関数を使用しないことをお勧めします。

ちなみに

マスキングポリシーのユースケースがセキュリティ強化のために競合回避を優先する場合は、 外部トークン化 を実装します。入力値と出力値の表現は常に1対1であるため、トークン化によって競合が発生することはありません。

トークン化が不可能な場合、考えられる回避策の1つは、クエリを実行するセッションロール(つまり CURRENT_ROLE)とクエリを実行するオブジェクト所有者(つまり INVOKER_ROLE)を区別するマスキングポリシーを実装することです。

たとえば、次のマスキングポリシーは、従業員情報へのアクセスを規制するために、2つの異なるカスタムロール CSR_EMPL_INFO と DBA_EMPL_INFO を想定しています。

case
    when current_role() in ('CSR_EMPL_INFO') then hash(val)
    when invoker_role() in ('DBA_EMPL_INFO') then val
    else NULL
end;

ポリシーがテーブルに適用されると、ポリシーはテーブルから作成されたすべてのビューに継承されます。カスタムロールDBA_EMPL_INFOがこのテーブルから作成されたビューを所有している場合(つまり、ビューに対するOWNERSHIP権限を持っている場合)、ビューをクエリすると、このカスタムロールを持つユーザーのみが実際の値を表示できます。CSR_EMPL_INFOカスタムロールを持つユーザーには、クエリがテーブルまたはビューのどちらで行われたかに関係なく、常にハッシュ値が表示されます。他のすべてのユーザーには NULL が表示されます。