差分プライバシー in Snowflake
差分プライバシーをSnowflake上で実現する機能がPublic Previewで最近公開されました。
そもそも差分プライバシーとは何?というのとSnowflake上での差分プライバシーについて解説していきます。
ちなみに現在SnowlakeではSnowflake上での差分プライバシー機能とSnowflake Data Clean Room上での差分プライバシー機能の2種類の機能が提供されていますがこの記事ではSnowflake上での差分プライバシー機能について説明します。
差分プライバシー(Differential Privacy)とは?
差分プライバシーには大きく2つの種類があります。
- グローバル差分プライバシー(GDP)
単に差分プライバシーと言う場合はこちらを指すことが多いです。
プライバシーを含む情報から統計量を算出する場合に攻撃者が保持する情報から統計量に含まれる個々のユーザーのプライバシー情報が暴露される危険性があることが知られています。これを防ぐために統計量にラプラスノイズを付与するという方法をとり個々のユーザーのプライバシーを保護することができます。 - 局所差分プライバシー(LDP)
GDPは統計量を匿名化するという手法であるがLDPは個々のユーザーのレコードに対して匿名化を施します。
Snowflakeが提供する差分プライバシーはGDPを実現するものなのでここでは詳しい説明を省略します。
差分プライバシー in Snowflake
先ほどの説明でSnowflakeではデータに対してGDPを適用していると説明しましたが具体的には
どのような形で差分プライバシーの機能が提供されているのでしょうか。Snowflake上での差分プライバシーを理解するために重要なキーワードが3つあります。
- Privacy Domain
- 集計値にノイズを付与するために差分プライバシーの適用対象となる列の取りうる値の集合を定義します。数値列は取りうる値の範囲を指定し、文字列型の列は取りうる値を列挙します。以下のような構文で定義します。
PRIVACY DOMAIN
{
[ BETWEEN ( <lo_value>, <hi_value> ) ]
| [ IN ( '<value1>', '<value2>', ... ) ]
| [ REFERENCES <table_name>( <col_name> ) ]
}
- Privacy Policy & Privacy Budget
差分プライバシーでは差分プライバシーを適用した統計量を取得するたびにPrivacy Budgetという概念を用いてプライバシー漏えいのリスクを定量的に評価します。Privacy PolicyはこのPrivacy Budgetをポリシーの形で定義しテーブルやビューと関連づけることができます。
具体例で理解する差分プライバシー in Snowflake
具体例でSnowflake上で差分プライバシーでデータを保護する方法を説明します。
例えば以下のようなテーブルを考えます。
CREATE OR REPLACE TABLE test_table
(
id INT,
age INT PRIVACY DOMAIN BETWEEN (0, 100),
plan VARCHAR(255) PRIVACY DOMAIN IN ('basic', 'premium', 'vip')
);
10000件データをINSERTしてみましょう。
INSERT INTO test_table (id, age, plan)
SELECT
ROW_NUMBER() OVER (ORDER BY RANDOM()) AS id,
abs(random()) % 100 AS age,
CASE
WHEN abs(random()) % 100 < 70 THEN 'basic'
WHEN abs(random()) % 100 < 95 THEN 'premium'
ELSE 'vip'
END AS plan
FROM TABLE(GENERATOR(ROWCOUNT => 10000));
次にPrivacy Policyを作成し、テーブルに関連付けます。
Privacy BudgetはPrivacy Policyの作成時に暗黙的に作成され、個別に作成することはできません。
CREATE OR REPLACE PRIVACY POLICY my_priv_policy
AS ( ) RETURNS PRIVACY_BUDGET ->
PRIVACY_BUDGET(BUDGET_NAME=> 'analysts');
ALTER TABLE test_table ADD PRIVACY POLICY my_priv_policy NO ENTITY KEY;
最後にクエリしてみましょう。
select
plan,
count(*) as count,
dp_interval_low(count),
dp_interval_high(count)
from test_table group by plan;
すると以下のようなクエリ結果を得ることができます。
PLAN | COUNT | DP_INTERVAL_LOW(COUNT) | DP_INTERVAL_HIGH(COUNT) |
---|---|---|---|
basic | 6947 | 6941 | 6953 |
premium | 2937 | 2931 | 2943 |
vip | 122 | 116 | 128 |
真の統計量にノイズが付与された値となります。
DP_INTERVAL_LOW
関数とDP_INTERVAL_HIGH
関数でノイズの値の下限と上限を知ることができます。
次に消費したPrivacy Budgetの確認をしてみましょう。以下のクエリを実行すると
SELECT *
FROM TABLE(SNOWFLAKE.DATA_PRIVACY.CUMULATIVE_PRIVACY_LOSSES(
'test_dp_db.test_schema.my_priv_policy'));
このような結果になります。
POLICY_DATABASE | POLICY_SCHEMA | POLICY_NAME | BUDGET_NAME | CONSUMER_ACCOUNT | BUDGET_SPENT |
---|---|---|---|---|---|
TEST_DP_DB | TEST_SCHEMA | MY_PRIV_POLICY | analysts | GB89463.WADATUMI_DEV | 1.2 |
BUDGET_SPENT
が消費したPrivacy Budgetの値です。差分プライバシーで保護されたテーブルに対してクエリをするたびにこの値が増えていきます。
まとめ
この記事ではSnowflake上でのプライバシー保護のための強力な道具となる差分プライバシーについて簡単に解説しました。ぜひお試しください!
Snowlfake データクラウドのユーザ会 SnowVillage のメンバーで運営しています。 Publication参加方法はこちらをご参照ください。 zenn.dev/dataheroes/articles/db5da0959b4bdd
Discussion