差分プライバシーでのプライバシーポリシーの使用¶
このトピックでは、データプロバイダーがプライバシーポリシーを使用して 差分プライバシー を実装する方法について説明します。
プライバシーポリシーについて¶
差分プライバシーでは、Snowflakeは各クエリをチェックして、クエリを実行するユーザーに関連付けられた プライバシーバジェット を超えるかどうかを判断する必要があります。それを可能にするのが、プライバシーポリシーです。データプロバイダーは、ユーザーとプライバシーバジェットを関連付けるプライバシーポリシーを作成し、そのポリシーをテーブルやビューに割り当てて、プライバシー保護された状態にします。
アナリストがプライバシーポリシーを持つテーブルに対してクエリを実行すると、Snowflakeはポリシーの本文を評価し、以下のいずれかを実行します。
ポリシーがユーザーにプライバシーバジェットを関連付ける場合、Snowflakeはクエリによって発生する プライバシーロス がそのプライバシーバジェットを超えないことを確認します。クエリが正常に実行された場合、Snowflakeはクエリによって発生したバジェットをユーザーの累積プライバシーロスに追加し、それ以降のクエリがプライバシーバジェットを超えないようにします。
ポリシーでユーザーが制限なくテーブルにクエリできることが示されている場合、結果には ノイズ は含まれず、Snowflakeはクエリによって発生したプライバシーロスを追跡しません。
プライバシーポリシーのベストプラクティス¶
1つのエンティティを保護するために1つのプライバシーポリシーを作成し、そのエンティティの情報を含むすべてのテーブルとビューにプライバシーポリシーを割り当てることができます。これによって、そのエンティティのすべてのプライバシーバジェットが1つのプライバシーポリシーの下にグループ化されます。すべてのテーブルとビューに個別のプライバシーポリシーを作成する必要はありません。
プライバシーポリシーの操作¶
スキーマへの差分プライバシーの実装は3段階のプロセスからなります。
プライバシーポリシーを作成 して、名前、ロール、アカウントなどの条件に基づいて、プライバシーバジェットをユーザーに関連付けます。
テーブルまたはビューに そのプライバシーポリシーを割り当て、データに対するクエリまたはクエリのセットが、クエリを実行するユーザーに関連付けられたプライバシーバジェットを超えないようにします。
プライバシー保護されたデータに対して SELECT 権限を付与します。アナリストがデータにフルアクセスできるようになるため、プライバシーポリシーをテーブルやビューに割り当てる前に、権限を付与しないでください。
差分プライバシー環境を管理することで、次も可能になります。
現在テーブルまたはビューに割り当てられているプライバシーポリシー を別のポリシーで置き換える。
テーブルやビューからプライバシーポリシー をデタッチする。
プライバシーポリシーの作成¶
新しいプライバシーポリシーを作成するための最も基本的な構文は次のとおりです。
CREATE PRIVACY POLICY <name>
AS ( ) RETURNS PRIVACY_BUDGET -> <body>
条件:
name
はプライバシーポリシーの名前です。AS ( ) RETURNS PRIVACY_BUDGET
はポリシーの署名と戻り型です。署名は引数を受け入れず、戻り型は内部データ型である PRIVACY_BUDGET です。すべてのプライバシーポリシーは、同じ署名と戻り型を持ちます。body
は SQL 式で、プライバシーポリシーがプライバシーバジェットを返すかどうか、返すとしたらどのバジェットを返すかを決定します。本文の SQL 式は、ポリシーの戻り値を制御するために2つの関数を呼び出します。
NO_PRIVACY_POLICY
プライバシーポリシーが割り当てられているテーブルまたはビューにクエリが無制限にアクセスできるようにする場合は、本文の式を使用して NO_PRIVACY_POLICY 関数を呼び出します。
PRIVACY_BUDGET
ポリシーからプライバシー予算を返す場合は、本文の式を使用して PRIVACY_BUDGET 関数を呼び出します。
NO_PRIVACY_POLICY および PRIVACY_BUDGET 関数の完全な構文については、 CREATE PRIVACY POLICY をご参照ください。
プライバシーポリシーの例¶
- 条件なしの単一プライバシーバジェット
analysts
という名前のプライバシーバジェットを常に返すプライバシーポリシーmy_priv_policy
を作成します。CREATE PRIVACY POLICY my_priv_policy AS ( ) RETURNS PRIVACY_BUDGET -> PRIVACY_BUDGET(BUDGET_NAME=> 'analysts');
- 条件付きプライバシーポリシー
プライバシーポリシー
my_priv_policy
を作成し、admin
にプライバシー保護されたテーブルまたはビューへの無制限のアクセスを与え、他のすべてのユーザーをプライバシーバジェットanalysts
に関連付けます。CREATE PRIVACY POLICY my_priv_policy AS () RETURNS PRIVACY_BUDGET -> CASE WHEN CURRENT_USER() = 'ADMIN' THEN NO_PRIVACY_POLICY() ELSE PRIVACY_BUDGET(BUDGET_NAME => 'analysts') END;
- アカウント間共有のための条件付きプライバシーポリシー
以下を行うプライバシーポリシー
my_priv_policy
を作成します。admin
にプライバシー保護されたテーブルやビューに対する無制限のアクセス権を付与する。プライバシーバジェット
analysts
を同じアカウントのユーザーに関連付ける。外部アカウントユーザーに関連するプライバシーバジェットの名前を付け、簡単に識別できるようにする。プライバシーバジェットには、自動的に特定の外部アカウントに対する名前空間が設定されますが、説明的な名前スキームを使用することで、プライバシーバジェットを管理するのに役立ちます。
CREATE PRIVACY POLICY my_priv_policy AS () RETURNS PRIVACY_BUDGET -> CASE WHEN CURRENT_USER() = 'ADMIN' THEN NO_PRIVACY_POLICY() WHEN CURRENT_ACCOUNT() = 'YE74187' THEN PRIVACY_BUDGET(BUDGET_NAME => 'analysts') ELSE PRIVACY_BUDGET(BUDGET_NAME => 'external.' || CURRENT_ACCOUNT()) END;
ポリシー本文でのコンテキスト関数の使用¶
プライバシーポリシーの本文に、 コンテキスト関数 を含めることで、その動作が差分プライベートクエリが実行されるコンテキストに依存するようにできます。
プライバシーポリシーの本文では、以下のコンテキスト関数を使用できます。
コンテキスト関数 |
説明 |
---|---|
ユーザーの現在のセッションで使用中のアカウントロケーターを返します。 |
|
プライバシーポリシーで保護されているテーブルを含むデータベースを返します。 |
|
ユーザーの現在のセッションで使用中の組織名を返します。 |
|
現在のセッションで使用中のロールの名前を返します。 |
|
プライバシーポリシーで保護されているテーブルを含むスキーマを返します。 |
|
クエリを実行しているユーザーの名前を返します。 |
|
実行中ロールの名前を返します。 |
|
INVOKER_SHARE 関数が呼び出されたテーブルまたはビューに直接アクセスした共有の名前を返します。 |
Tip
CURRENT_USER のようなコンテキスト関数は文字列を返すので、それらを使った比較では大文字と小文字が区別されます。大文字小文字を区別せずに比較する場合は、 LOWER を使って文字列をすべて小文字に変換することができます。
プライバシーポリシーの変更¶
プライバシーポリシーを変更するには、 ALTER PRIVACY POLICY コマンドを使用します。ポリシーの名前を変更したり、本文を変更したり、コメントを修正したりすることができます。
たとえば、プライバシーポリシー my_priv_policy
の既存の本文を、常にバジェット external_analysts
を返す新しい本文で置き換えるには、次を実行します。
ALTER PRIVACY POLICY my_priv_policy SET BODY ->
PRIVACY_BUDGET(BUDGET_NAME => 'external_analysts');
プライバシーポリシーの割り当て¶
プライバシーポリシーを1つまたは複数のテーブルやビューに適用して、それらを差分プライバシーで保護することができます。テーブルやビューに割り当てられるプライバシーポリシーは1つだけです。
ALTER TABLE または ALTER VIEW コマンドの ADD PRIVACY POLICY 句を使用して、テーブルまたはビューにプライバシーポリシーを割り当てます。構文は次のようになります。
ALTER { TABLE | [ MATERIALIZED ] VIEW } <name> ADD PRIVACY POLICY <policy_name> { NO ENTITY KEY | ENTITY KEY ( <column_name> ) }
条件:
name
はテーブルまたはビューの名前を指定します。policy_name
はプライバシーポリシーの名前を指定します。column_name
はテーブルやビューのエンティティキーを指定します。 エンティティキー は、テーブルまたはビュー内でエンティティを一意に識別する列です。
ほとんどの場合、エンティティキーを定義して、エンティティレベルのプライバシーを実装したいと思うでしょうが、 NO ENTITY KEY 句を使用すると、エンティティに属するデータが複数の行に存在するかどうかを考慮せずに個々の行を保護することができます。詳細については、 エンティティレベルのプライバシーについて をご参照ください。
たとえば、 email
列をエンティティキーとするテーブル t1
にポリシー my_priv_policy
を割り当てるには、次を実行します。
ALTER TABLE t1 ADD PRIVACY POLICY my_priv_policy ENTITY KEY (email);
プライバシーポリシーまたはエンティティキーの置き換え¶
プライバシーポリシーまたはエンティティキーを置き換える際の推奨方法は、同じ ALTER TABLE または ALTER VIEW コマンドで ADD 句と DROP 句の両方を使用することです。これにより、両方の操作が同じトランザクション内で行われるため、アトミックに変更を行うことができ、保護にギャップが生じません。
同じポリシーを維持しながらエンティティキーを変更するには、ポリシーを削除し、新しいエンティティキーで再度追加する必要があります。
たとえば、すでにプライバシーポリシーで保護されているテーブルに新しいプライバシーポリシーを割り当てる場合は、次のようになります。
ALTER TABLE finance.accounting.customers
DROP PRIVACY POLICY priv_policy_1,
ADD PRIVACY POLICY priv_policy_2 ENTITY KEY (email);
1つのステートメントでテーブルまたはビューからプライバシーポリシーをデタッチし、別のステートメントでテーブルまたはビューに新しいポリシーを設定することもできます。この方法を選択した場合、1つのポリシーをデタッチして別のポリシーを割り当てるまでの間、テーブルはプライバシーポリシーによって保護されません。ユーザーに引き続きデータに対する SELECT 権限があれば、この間にクエリが機密データにアクセスする可能性があります。
プライバシーポリシーのデタッチ¶
ALTER TABLE または ALTER VIEW コマンドの DROP PRIVACY POLICY 句を使用して、テーブルまたはビューからプライバシーポリシーをデタッチします。このコマンドを実行すると、テーブルまたはビューはプライバシー保護されなくなります。構文は次のようになります。
ALTER { TABLE | [ MATERIALIZED ] VIEW } <name> DROP PRIVACY POLICY <policy_name>
条件:
name
はテーブルまたはビューの名前を指定します。policy_name
はプライバシーポリシーの名前を指定します。
たとえば、 finance.accounting.customers
テーブルからプライバシーポリシー my_priv_policy
をデタッチするには、次を実行します。
ALTER TABLE finance.accounting.customers DROP PRIVACY POLICY my_priv_policy;
プライバシーポリシーのモニター¶
プライバシーポリシーの使用をモニターできるように、アカウント内のすべてのプライバシーポリシーを一覧表示したり、特定のプライバシーポリシーで保護されているテーブルやビューを判断したり、テーブルやビューに現在割り当てられているすべてのポリシーを一覧表示したりすることができます。
すべてのプライバシーポリシーの一覧表示¶
共有 SNOWFLAKE データベースのAccount Usageスキーマで PRIVACY_POLICIES ビューを使用できます。このビューは、Snowflakeアカウント内にあるすべてのプライバシーポリシーの カタログ です。例:
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.PRIVACY_POLICIES ORDER BY POLICY_NAME;
プライバシーポリシーリファレンスの識別¶
POLICY_REFERENCES Information Schema テーブル関数は、どのテーブルとビューがプライバシーポリシーによって保護されているかを識別することができます。2つの異なる構文オプションがあります。
指定されたプライバシーポリシーが設定されている各オブジェクト(テーブルまたはビュー)の行を返します。
USE DATABASE my_db; USE SCHEMA information_schema; SELECT policy_name, policy_kind, ref_entity_name, ref_entity_domain, ref_column_name, ref_arg_column_names, policy_status FROM TABLE(information_schema.policy_references(policy_name => 'my_db.my_schema.privpolicy'));
my_table
という名前のテーブルに割り当てられた各ポリシーの行を返します。POLICY_KIND 列を使用して、どのポリシーがプライバシーポリシーであるかを識別します。USE DATABASE my_db; USE SCHEMA information_schema; SELECT policy_name, policy_kind, ref_entity_name, ref_entity_domain, ref_column_name, ref_arg_column_names, policy_status FROM TABLE(information_schema.policy_references(ref_entity_name => 'my_db.my_schema.my_table', ref_entity_domain => 'table'));
権限とコマンド¶
以下のサブセクションでは、プライバシーポリシーの管理に役立つ情報を提供します。
プライバシーポリシー権限¶
Snowflakeは、プライバシーポリシーオブジェクトに対する以下の権限をサポートしています。
スキーマ内の任意のオブジェクトを操作するには、親データベースとスキーマに対する USAGE 権限も必要であることに注意してください。
権限 |
使用状況 |
---|---|
APPLY |
プライバシーポリシーをテーブルやビューに割り当てたり、プライバシーポリシーをテーブルやビューからデタッチしたりできます。 |
OWNERSHIP |
プライバシーポリシーのほとんどのプロパティを変更するために必要です。プライバシーポリシーの所有権は譲渡することができ、これによりプライバシーポリシーを完全に制御する権限が付与されます。 |
プライバシーポリシー DDL リファレンス¶
Snowflakeは、プライバシーポリシーを作成および管理するために以下の DDL をサポートしています。
DDL コマンド、操作、および権限の概要¶
以下のテーブルは、プライバシーポリシー権限と DDL 操作の関係をまとめたものです。
スキーマ内の任意のオブジェクトを操作するには、親データベースとスキーマに対する USAGE 権限も必要であることに注意してください。
操作 |
必要な権限 |
---|---|
プライバシーポリシーの作成 |
同じスキーマ内の CREATE PRIVACY POLICY 権限を持つロール。 |
プライバシーポリシーの変更 |
プライバシーポリシーに対する OWNERSHIP 権限を持つロール。 |
プライバシーポリシーの記述 |
以下の いずれか を使用します。
|
プライバシーポリシーをドロップします。 |
プライバシーポリシーに対する OWNERSHIP 権限を持つロール。 |
プライバシーポリシーを表示します。 |
以下の いずれか を使用します。
|
プライバシーポリシーをテーブルやビューに割り当てたり、プライバシーポリシーをテーブルやビューからデタッチしたりします。 |
以下の いずれか を使用します。
|