Snowflake Data Clean Room の差分プライバシー

データ内のエンティティのプライバシーを保護するために、Snowflake Data Clean Roomsは、 差分プライバシー を提供します。差分プライバシーは数学ベースのプライバシーシステム [1] で、1回のクエリとデータセットの繰り返しクエリの両方にエンティティレベルのデータ保護を提供します。データプロバイダーは、クリーンルームに差分プライバシーを構成することで、データのエンティティレベルの強力なプライバシー保護と低ノイズレベルを実現できます。

差分プライバシーは単純な集計要件に代わるものであり、敵対者が1エンティティだけ異なるデータに対して十分な数の「近い」クエリを生成した場合、個人情報が漏洩する可能性があります(差分攻撃 として知られています)。

差分プライバシーは、マスキングされた行への結合を阻止し、分析者から有用なデータを隠すコストで列値を完全に隠す、データマスキングの良い代替方法でもあります。差分プライバシーは、保護された列への結合を可能にし、また、保護された行のプライバシーを保護するのに十分なノイズを加えることで、分析者が保護されたデータを表示することを可能にします。ただし、分析者がデータを使用できないほどのノイズは追加しません。

重要

Snowflake Data Clean Roomsの差分プライバシーツールを構成して、お客様のデータプライバシー要件を満たすことは、お客様の責任となります。これらのツールはデフォルトでは構成されていません。

clean roomにおける差動プライバシーの仕組み

Clean roomは、 Snowflake差分プライバシーとは 異なる、独自の差分プライバシー実装を提供します、このドキュメントを読んで、その動作と設定の違いを理解してください。

差分プライバシーはデータ内の エンティティ のプライバシーを保護します。Clean roomには、エンティティを列内の一意な値として定義します。Clean roomには、機密性が高いと思われるデータをどの列に含めるかを定義します。例えば、社会保障番号やメールアドレスはおそらく機密性の高いエンティティですが、色はそうではありません。差分プライバシーが適用されたclean roomは、テーブルごとに1つまたは複数のエンティティ列を識別します。どの列をエンティティ列にするかは指定できません。

clean roomの差分プライバシーはまた、各エンティティに関する数値結果にノイズを追加します。

そのノイズを減らすために、ユーザーが複数の異なるクエリ結果を比較する場合があります。これが 差分化攻撃 です。差分攻撃を防ぐために、差分プライバシーはアカウントに割り当てられた プライバシーバジェット を計算および監視します。各クエリには、そのクエリによって開示されるエンティティのプライバシーを把握するためのコストがあります。このコストは、クエリ、データ、同じユーザーからの以前のクエリに基づいて数学的に判断されます。クエリのコストがプライバシーバジェットの残数の限界を超えると、クエリは失敗します。超えなければ、クエリが続行され、コストはユーザーの1日のプライバシーバジェットに追加されます。プライバシーバジェットは毎日更新されます。

clean roomの差分プライバシーによって、クエリに集計上の制約が適用されることはありませんが、データまたはテンプレートに 集約上の制約を追加 することは可能です。

Tip

Snowflakeのプライバシーポリシー により、保護されたテーブルからはビューを作成できないため、プライバシーポリシーが設定されているテーブルへのリンクを作成することはできません。

UI で差分プライバシーを有効化および管理する

clean room UI で、プロバイダーはプライバシーをテンプレートレベルで設定できますが、コンシューマーは差分プライバシー設定を有効にすることも、変更することもできません。clean room UI で使用される標準Snowflakeテンプレートは、テンプレートごとに異なる差分プライバシーを設定できます。

clean room UI を使用してテンプレートの差分プライバシーを有効または無効にするには:

  1. Clean Rooms ページの Created ` タブを開きます。

  2. clean roomのタイルで Edit または 他のオプションを示す3つの垂直の点 » Edit を選択します(clean roomで分析の実行が許可されているかどうかで異なります)。

  3. Configure Analysis & Query に達するまで Next を選択します。

  4. ページの下部で、 Privacy Settings を展開します。 Differential Privacy を選択または選択解除し、そのテンプレートの設定(ユーザーのプライバシーバジェットやクエリコストなど)を行います。このクエリでは、しきい値をセットして最小グループサイズを適用することもできます。

  5. 別のテンプレートの設定を行うには、まず現在のテンプレートの値をセットし、次にテンプレートセレクタで別のテンプレートを選択します。

UI でのプライバシーバジェットの管理

プライバシーバジェットの残りを見る

クエリを実行したり、クエリ結果を表示したりすると、 Privacy Settings セクションにバジェットの合計と使用金額が表示されます。

他のユーザーのプライバシーバジェットをセットする

UI では、プロバイダーはプライバシーバジェットをセットできますが、コンシューマーはできません。

  1. clean roomを編集し、 Configure Analysis & Query ページに移動します。

  2. テンプレートを選択します。

  3. ページの下部にある Privacy Settings を展開すると、ユーザーのプライバシーバジェットと、クエリのコストが表示されます。

API で差分プライバシーを有効化および管理する

clean room API では、どちらの側も差分プライバシーをコラボレーションレベルで有効化および構成できます。

すべてのカスタムテンプレートが、clean roomで同じ差分プライバシー設定を使用します。Snowflakeが提供するテンプレートを、 UI で個別のプライバシー設定で構成できます。

以下のプロシージャを使用して差分プライバシーを構成します:

  • consumer.enable_templates_for_provider_run - プロバイダーが実行するすべての分析のデフォルト値で、差分プライバシーをオフまたはオンにします。

  • consumer.set_privacy_settings - プロバイダーが実行する分析(カスタムテンプレートなど)で、差分プライバシーを個別に指定します。

  • provider.set_privacy_settings - コンシューマーが実行する分析(カスタムテンプレートなど)で、差分プライバシーを個別に指定します。

  • provider.add_custom_sql_template - 感度 パラメーターを指定し、テンプレートのエプシロン(ノイズレベル)を、コンシューマーにセットされたベースラインのエプシロンより上または下に増減します。

  • provider.add_consumers - コンシューマーごとにプライバシーを指定します。同じカスタマーを異なるプライバシー設定で複数回追加し、プライバシー設定を変更できます。

  • provider.suspend_account_dp_task - このアカウントのすべてのclean roomの差分プライバシーバジェットの監視をオフにします。プライバシーの差はなくなりました。

  • provider.resume_account_dp_task - このアカウントのすべてのclean roomの差分プライバシーバジェットの監視をオンにします。差分プライバシーの設定が適用されます。

clean roomのプライバシー設定が SAMOOHA_CLEANROOM_cleanroom_ID.admin.privacy_budget に保存されます。 APPLICATION_ID はテンプレート名(すべてのカスタムテンプレートの場合はNULL )、 PARTY_ACCOUNT は設定が適用されるユーザーです。

API でのプライバシーバジェットの管理

プライバシーバジェットの残りを見る

コンシューマーは consumer.view_remaining_privacy_budget プロシージャを呼び出すことができます。プロバイダーが残りのプライバシーバジェットを確認するコードを作成する方法はありません。

他のユーザーのプライバシーバジェットをセットする

  • プロバイダーprovider.set_privacy_settings または provider.add_consumers を呼び出します。

  • コンシューマーconsumer.set_privacy_settings を呼び出して、プロバイダーが実行する分析のバジェットをセットします。

設定可能なプライバシー

以下のプライバシー値を、以下のようなさまざまなプロシージャを使用してセットできます:

  • differential (整数) - 1または0。1であれば差分プライバシーが有効になり、0 であれば無効になります。

  • epsilon (浮動): 結果に加えるノイズの量を示すゼロより大きい数値。ゼロより小さい値(0.1-1.0)を指定すると、プライバシー保護が強化されますが、結果のノイズが増えます。デフォルト: 0.1。

  • noise_mechanism (文字列) - 結果にノイズを加えるために使用するアルゴリズム。Laplace または Gaussian を指定します。

  • privacy_budget (整数) - ユーザーに付与するプライバシーバジェットの量を0以上の数値で指定します。0を指定すると、差分プライバシーが有効であれば、クエリを実行できなくなります。デフォルトは10です。

  • threshold (整数) - Snowflakeが提供するテンプレートに threshold_value を適用する場合は1を、 threshold_value を無視する場合は0を指定します。デフォルトは0です。clean room UI の差分プライバシーのトグルで管理できます。

  • threshold_value (整数) - データに含まれるグループの最小行数。Snowflakeが提供するテンプレートのうち、指定されたものだけで使用されます。

その他のプライバシー機能

結果にノイズを追加する

差分プライバシーを実装せず、手動で結果にノイズを追加したい場合は、以下のclean room関数をテンプレートまたはカスタムコードで使用します。このコードを実行するには、ユーザーに十分なプライバシーバジェットが必要であり、十分でなければエラーになります。差分プライバシーが無効なタスクであれば、ユーザーは実質的にバジェットを無限に持つことになります。

cleanroom.addnoise(<val>, <epsilon>, <noiserand>, [<gaussian>], [<delta>])
Copy

説明: 差分プライバシーが保証されるまで、キャリブレートされたノイズを数値に追加します。この関数は、clean roomからのみ呼び出すことができます。ユーザーやテンプレートの差分プライバシーを有効にする必要はなく、差分プライバシータスクを有効にする必要もありません。この関数はテンプレートまたは UDP/UDTP で使用します。

引数:

  • val (DOUBLE) - ノイズを追加する元の値。

  • epsilon (DOUBLE) - プライバシーバジェットのパラメーター。値が小さいほど(0.1-1.0)、プライバシー保護が強化されますが、ノイズが増えます。0より大きい値を指定します。

  • noiserand (DOUBLE) - 0 から 1 の間のランダムな値で、各結果にランダム性を与えます。固定値を渡すのではなく、ランダム値ジェネレーターを使ってその場で計算します。

  • gaussian (BOOLEAN, オプション) - TRUE を指定すると、LaplacianのノイズではなくGaussianのノイズが使用されます。デフォルトは FALSE です。

  • delta (DOUBLE, オプション) - gaussian に TRUE を指定した場合の、Gaussianメカニズムのデルタパラメーター(小さい方が良い)。デフォルトは0.000001です。

戻り値: DOUBLE プライバシーを保持するためにノイズを追加した後の元の値。

推奨事項:

  • 集計 (COUNT, SUM, AVG) にのみ適用され、個別のレコードには適用されません。

  • 結果を四捨五入し、精度が高くなりすぎるのを抑えてください。

  • この関数にはプライバシーバジェットが必要です。ユーザーのバジェットが足りなければエラーになることに注意してください。

  • グループの最小サイズの制約を同時に適用して、保護を強化してください。

例:

以下のテンプレート例では、clean room全体にエプシロン値を使用し、ハッシュ化されたメールのカウント値にノイズを追加します。

CALL samooha_by_snowflake_local_db.provider.add_custom_sql_template(
$cleanroom_name,
$template_name,
$$
SELECT
  cleanroom.addNoise(
    count(distinct p.hashed_email),  -- Value
    {{ privacy.epsilon | sqlsafe }}, -- Epsilon
    UNIFORM(0::FLOAT, 1::FLOAT, RANDOM()) -- Noiserand
    ) AS noisy_count
FROM
    IDENTIFIER({{ source_table[0] }}) p
$$);
Copy

集計ポリシーとグループ最小サイズを設定する

データを集計する必要があり、グループの最小サイズを指定する場合は、 集計ポリシー をソーステーブルにセットするか、テンプレートで集計を適用することができます。

差分プライバシーコストの管理

個々のユーザーやテンプレートの差分プライバシーが有効でない場合でも、差分プライバシーを適用すべきかどうかが、すべてのクエリを対象にシステムによってチェックされるため、 コストが発生します。このコストをなくしたい場合は、アカウントの差分プライバシーを無効にします:

  1. まず、ウェブアプリを使用して、すべてのクリーンルームの差分プライバシーをオフにします。

    1. ウェブアプリにログインします。

    2. 失敗していないすべてのクリーンルームで、共有や公開されていない場合でも、差分プライバシーを無効にします。

      1. Clean rooms » Created » Edit を選択します。

      2. Configure Analysis & Query に達するまで Next を選択します。

      3. ページの下部で、 Privacy Settings を展開します。 Differential Privacy が選択されている場合は選択を解除し、 NextFinish をクリックして変更を保存します。選択されていない場合は、 Cancel をクリックし、次のクリーンルームに進んでください。

  2. 最後に、Snowsightの provider.suspend_account_dp_taskプロシージャ を呼び出して、アカウントの差分プライバシーバックグラウンドタスクを一時停止します。

重要

バックグラウンドタスクを無効にした後、クリーンルームで差分プライバシーを有効にすると、そのアカウントのタスクが自動的に再有効化されます。

いくつかの注意点とトラブルシューティング

  • クリーンルームのために差分プライバシーを無効にすることを忘れて、バックグラウンドタスクを中断した場合、差分プライバシーは、すでにそれをインストールしているユーザーのために、そのクリーンルームで機能しないかもしれません。

  • クリーンルームがインストールされる前に、クリーンルーム内で差分プライバシーが有効になっている場合、クリーンルームのインストールは失敗します。この場合、クリーンルームの差分プライバシーを無効にするか、以下に示すようにタスクを再度有効にする必要があります。

後でアカウントの差分プライバシーを有効にしたい場合は、 アカウント内のクリーンルームの差分プライバシーを有効にするか、Snowsightで provider.resume_account_dp_taskプロシージャ を呼び出します。