差分プライバシーでのプライバシーポリシーの使用

このトピックでは、データプロバイダーがプライバシーポリシーを使用して 差分プライバシー を実装する方法について説明します。

プライバシーポリシーについて

差分プライバシーでは、Snowflakeは各クエリをチェックして、クエリを実行するユーザーに関連付けられた プライバシーバジェット を超えるかどうかを判断する必要があります。それを可能にするのが、プライバシーポリシーです。データプロバイダーは、ユーザーとプライバシーバジェットを関連付けるプライバシーポリシーを作成し、そのポリシーをテーブルやビューに割り当てて、プライバシー保護された状態にします。

アナリストがプライバシーポリシーを持つテーブルに対してクエリを実行すると、Snowflakeはポリシーの本文を評価し、以下のいずれかを実行します。

  • ポリシーがユーザーにプライバシーバジェットを関連付ける場合、Snowflakeはクエリによって発生する プライバシーロス がそのプライバシーバジェットを超えないことを確認します。クエリが正常に実行された場合、Snowflakeはクエリによって発生したバジェットをユーザーの累積プライバシーロスに追加し、それ以降のクエリがプライバシーバジェットを超えないようにします。

  • ポリシーでユーザーが制限なくテーブルにクエリできることが示されている場合、結果には ノイズ は含まれず、Snowflakeはクエリによって発生したプライバシーロスを追跡しません。

プライバシーポリシーのベストプラクティス

1つのエンティティを保護するために1つのプライバシーポリシーを作成し、そのエンティティの情報を含むすべてのテーブルとビューにプライバシーポリシーを割り当てることができます。これによって、そのエンティティのすべてのプライバシーバジェットが1つのプライバシーポリシーの下にグループ化されます。すべてのテーブルとビューに個別のプライバシーポリシーを作成する必要はありません。

プライバシーポリシーの操作

スキーマへの差分プライバシーの実装は3段階のプロセスからなります。

  1. プライバシーポリシーを作成 して、名前、ロール、アカウントなどの条件に基づいて、プライバシーバジェットをユーザーに関連付けます。

  2. テーブルまたはビューに そのプライバシーポリシーを割り当て、データに対するクエリまたはクエリのセットが、クエリを実行するユーザーに関連付けられたプライバシーバジェットを超えないようにします。

  3. プライバシー保護されたデータに対して SELECT 権限を付与します。アナリストがデータにフルアクセスできるようになるため、プライバシーポリシーをテーブルやビューに割り当てる前に、権限を付与しないでください。

差分プライバシー環境を管理することで、次も可能になります。

プライバシーポリシーの作成

新しいプライバシーポリシーを作成するための最も基本的な構文は次のとおりです。

CREATE PRIVACY POLICY  <name>
  AS ( ) RETURNS PRIVACY_BUDGET -> <body>
Copy

条件:

  • 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');
Copy
条件付きプライバシーポリシー

プライバシーポリシー 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;
Copy
アカウント間共有のための条件付きプライバシーポリシー

以下を行うプライバシーポリシー 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;
Copy

ポリシー本文でのコンテキスト関数の使用

プライバシーポリシーの本文に、 コンテキスト関数 を含めることで、その動作が差分プライベートクエリが実行されるコンテキストに依存するようにできます。

プライバシーポリシーの本文では、以下のコンテキスト関数を使用できます。

コンテキスト関数

説明

CURRENT_ACCOUNT

ユーザーの現在のセッションで使用中のアカウントロケーターを返します。

CURRENT_DATABASE

プライバシーポリシーで保護されているテーブルを含むデータベースを返します。

CURRENT_ORGANIZATION_NAME

ユーザーの現在のセッションで使用中の組織名を返します。

CURRENT_ROLE

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

CURRENT_SCHEMA

プライバシーポリシーで保護されているテーブルを含むスキーマを返します。

CURRENT_USER

クエリを実行しているユーザーの名前を返します。

INVOKER_ROLE

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

INVOKER_SHARE

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');
Copy

プライバシーポリシーの割り当て

プライバシーポリシーを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> ) }
Copy

条件:

  • 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);
Copy

プライバシーポリシーまたはエンティティキーの置き換え

プライバシーポリシーまたはエンティティキーを置き換える際の推奨方法は、同じ 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);
Copy

1つのステートメントでテーブルまたはビューからプライバシーポリシーをデタッチし、別のステートメントでテーブルまたはビューに新しいポリシーを設定することもできます。この方法を選択した場合、1つのポリシーをデタッチして別のポリシーを割り当てるまでの間、テーブルはプライバシーポリシーによって保護されません。ユーザーに引き続きデータに対する SELECT 権限があれば、この間にクエリが機密データにアクセスする可能性があります。

プライバシーポリシーのデタッチ

ALTER TABLE または ALTER VIEW コマンドの DROP PRIVACY POLICY 句を使用して、テーブルまたはビューからプライバシーポリシーをデタッチします。このコマンドを実行すると、テーブルまたはビューはプライバシー保護されなくなります。構文は次のようになります。

ALTER { TABLE | [ MATERIALIZED ] VIEW } <name> DROP PRIVACY POLICY <policy_name>
Copy

条件:

  • name はテーブルまたはビューの名前を指定します。

  • policy_name はプライバシーポリシーの名前を指定します。

たとえば、 finance.accounting.customers テーブルからプライバシーポリシー my_priv_policy をデタッチするには、次を実行します。

ALTER TABLE finance.accounting.customers
  DROP PRIVACY POLICY my_priv_policy;
Copy

プライバシーポリシーのモニター

プライバシーポリシーの使用をモニターできるように、アカウント内のすべてのプライバシーポリシーを一覧表示したり、特定のプライバシーポリシーで保護されているテーブルやビューを判断したり、テーブルやビューに現在割り当てられているすべてのポリシーを一覧表示したりすることができます。

すべてのプライバシーポリシーの一覧表示

共有 SNOWFLAKE データベースのAccount Usageスキーマで PRIVACY_POLICIES ビューを使用できます。このビューは、Snowflakeアカウント内にあるすべてのプライバシーポリシーの カタログ です。例:

SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.PRIVACY_POLICIES
  ORDER BY POLICY_NAME;
Copy

プライバシーポリシーリファレンスの識別

POLICY_REFERENCES Information Schema テーブル関数は、どのテーブルとビューがプライバシーポリシーによって保護されているかを識別することができます。2つの異なる構文オプションがあります。

  1. 指定されたプライバシーポリシーが設定されている各オブジェクト(テーブルまたはビュー)の行を返します。

    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'));
    
    Copy
  2. 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'));
    
    Copy

権限とコマンド

以下のサブセクションでは、プライバシーポリシーの管理に役立つ情報を提供します。

プライバシーポリシー権限

Snowflakeは、プライバシーポリシーオブジェクトに対する以下の権限をサポートしています。

Operating on an object in a schema requires at least one privilege on the parent database and at least one privilege on the parent schema.

権限

使用状況

APPLY

プライバシーポリシーをテーブルやビューに割り当てたり、プライバシーポリシーをテーブルやビューからデタッチしたりできます。

OWNERSHIP

プライバシーポリシーのほとんどのプロパティを変更するために必要です。プライバシーポリシーの所有権は譲渡することができ、これによりプライバシーポリシーを完全に制御する権限が付与されます。

プライバシーポリシー DDL リファレンス

Snowflakeは、プライバシーポリシーを作成および管理するために以下の DDL をサポートしています。

DDL コマンド、操作、および権限の概要

以下のテーブルは、プライバシーポリシー権限と DDL 操作の関係をまとめたものです。

Operating on an object in a schema requires at least one privilege on the parent database and at least one privilege on the parent schema.

操作

必要な権限

プライバシーポリシーの作成

同じスキーマ内の CREATE PRIVACY POLICY 権限を持つロール。

プライバシーポリシーの変更

プライバシーポリシーに対する OWNERSHIP 権限を持つロール。

プライバシーポリシーの記述

以下の いずれか を使用します。

  • グローバル APPLY PRIVACYPOLICY 権限を持つロール。

  • プライバシーポリシーに対する OWNERSHIP 権限を持つロール。

  • プライバシーポリシーに対する APPLY 権限を持つロール。

プライバシーポリシーをドロップします。

プライバシーポリシーに対する OWNERSHIP 権限を持つロール。

プライバシーポリシーを表示します。

以下の いずれか を使用します。

  • プライバシーポリシーが存在するスキーマに対する USAGE 権限を持つロール。

  • アカウントに対する APPLY PRIVACY POLICY を持つロール。

プライバシーポリシーをテーブルやビューに割り当てたり、プライバシーポリシーをテーブルやビューからデタッチしたりします。

以下の いずれか を使用します。

  • アカウントに対する APPLY PRIVACY POLICY 権限を持つロール。

  • プライバシーポリシーに対して APPLY 権限を持ち、テーブルまたはビューに対して OWNERSHIP 権限を持つロール。