第2章 アカウント管理とデータガバナンス(Account Mgmt & Governance, 20%)
🎯 この節の学習目標
動的データマスキング(Dynamic Data Masking)は、列(カラム)単位で、クエリを実行するロールに応じて値の見え方を変える機能です。Enterpriseエディション以上で利用できます。ポイントは次の3つです。
💡 具体例:メールアドレスのマスキング
-- マスキングポリシーを独立したオブジェクトとして作成する
CREATE MASKING POLICY email_mask AS (val STRING) RETURNS STRING ->
CASE
WHEN IS_ROLE_IN_SESSION('PII_READER') THEN val
ELSE '*** MASKED ***'
END;
-- 列に適用する
ALTER TABLE customers MODIFY COLUMN email
SET MASKING POLICY email_mask;
-- 解除する場合
ALTER TABLE customers MODIFY COLUMN email
UNSET MASKING POLICY;
CURRENT_ROLE() はセッションのプライマリロール名だけを返すのに対し、IS_ROLE_IN_SESSION('ロール名') はプライマリ・セカンダリロールとその階層まで含めて判定できるため、ロール階層を活かしたポリシーに向いています。1つのポリシーを複数のテーブルの列に使い回せる点も、ポリシーを独立オブジェクトにする利点です。
関連機能としてExternal Tokenization(外部トークン化)があります。これはデータのロード前に外部のトークン化プロバイダーで値をトークンに置き換えておき、クエリ時にマスキングポリシー内から外部関数でデトークン化する方式です。「保存時点で生データを持たない」点が動的マスキングとの違いです。
行アクセスポリシー(Row Access Policy)は、クエリ実行ロールなどの条件に応じてどの行を返すかを制御します。こちらもEnterpriseエディション以上の機能で、ポリシーをスキーマオブジェクトとして作成しテーブルに適用する構造はマスキングと同様です。
-- 営業担当は自分の地域の行だけ見えるようにするポリシー
CREATE ROW ACCESS POLICY region_policy AS (region STRING) RETURNS BOOLEAN ->
CURRENT_ROLE() = 'SALES_MANAGER'
OR region = (SELECT r.region FROM region_map r
WHERE r.role_name = CURRENT_ROLE());
-- テーブルに適用する(対象列を指定)
ALTER TABLE orders ADD ROW ACCESS POLICY region_policy ON (region);
ポリシーがBOOLEANを返し、TRUEになった行だけが結果に含まれます。条件に合わない行は、そのロールにとって「存在しない」ように見えます。
📝 試験のポイント
1つのテーブルに行アクセスポリシーとマスキングポリシーを併用できます。このとき評価順は「先に行アクセスポリシーで行が絞られ、次にマスキングポリシーで列がマスクされる」、つまり行→列の順です。また、同じ列を行アクセスポリシーの判定列とマスキングポリシーの対象列の両方にすることはできない、という制約もあわせて覚えておくと安心です。
オブジェクトタグ(tag)は、オブジェクトに付けられるキー/値ペアのラベルです。タグ自体もスキーマオブジェクトとして作成し、テーブル・列・ウェアハウスなど幅広いオブジェクトに付与できます。
-- タグを作成し、許可する値を制限することもできる
CREATE TAG confidentiality ALLOWED_VALUES 'public', 'internal', 'restricted';
-- テーブルや列に付与する
ALTER TABLE customers SET TAG confidentiality = 'restricted';
ALTER TABLE customers MODIFY COLUMN email
SET TAG confidentiality = 'restricted';
-- ウェアハウスに付けてコスト配賦にも使える
ALTER WAREHOUSE analysis_wh SET TAG cost_center = 'analytics';
タグの代表的な使い道は次の3つです。
また、Snowflakeには自動データ分類(Classification)機能があり、テーブルをスキャンして個人情報らしい列(氏名・メールアドレスなど)を検出し、システム定義タグで分類できます。「どこに機密データがあるか分からない」状態の解消に役立ち、タグベースマスキングと組み合わせることで検出から保護までを体系化できます。
マスキング・行アクセスに加えて、Snowflakeにはプライバシーポリシー(Privacy Policies)と呼ばれる機能群もあります。代表例が、集計結果しか返さないことを強制する集計ポリシー(aggregation policy)(最低限の行数を集計しないと結果を返さないため、個人単位の行の特定を防げます)と、特定の列をSELECTの出力に含めることを禁止するプロジェクションポリシー(projection policy)(結合キーとしては使えるが値そのものは見せない、といった制御ができます)です。いずれもポリシーをオブジェクトとして作成して適用するという枠組みはマスキングポリシーと共通で、データクリーンルームのようなプライバシー重視の共有シナリオで活用されます。
「誰が・いつ・どのデータにアクセスしたか」を追跡するには、SNOWFLAKEデータベースの ACCOUNT_USAGE.ACCESS_HISTORY ビューを使います(ACCOUNT_USAGEスキーマの詳細は2-7で扱います)。
1つのクエリに対して各ガバナンス機能がどの順で働くかを図で整理します。
図:ガバナンス機能の評価順。行アクセスポリシー(行)→マスキングポリシー(列)の順に適用され、アクセスの事実はACCESS_HISTORYに記録される
✅ この節のまとめ
問1. 動的データマスキングの説明として正しいものはどれか。
正解:B
マスキングポリシーは独立したスキーマオブジェクトで、列に適用され、クエリ実行時に動的に評価されます。Aは誤りで、元データは変更されません(だからこそ「動的」マスキングです)。Cは誤りで、1つのポリシーを複数テーブルの複数列に使い回せます。Dは誤りで、動的データマスキングはEnterpriseエディション以上の機能です。
問2. 1つのテーブルに行アクセスポリシーとマスキングポリシーの両方が適用されている場合の評価順として正しいものはどれか。
正解:B
評価順は「行→列」です。まず行アクセスポリシーが行の可視性を決め、可視となった行に対してマスキングポリシーが列の値を変換します。AとCはこの順序の理解を問う誤答です。Dは誤りで、併用は可能です(ただし同じ列を行アクセスポリシーの判定列とマスキング対象列の両方にはできません)。
問3. 「個人情報を含む列に共通タグを付け、そのタグが付いた列すべてに自動的にマスキングが適用されるようにしたい」。この要件を満たす機能はどれか。
正解:A
マスキングポリシーをタグに関連付けると、そのタグが付与された列すべてにポリシーが自動適用されます。列が増えてもタグを付けるだけで統制が効くのが利点です。BのExternal Tokenizationはロード前のトークン化方式でありタグ連動の仕組みではありません。Cは行の可視性の制御で列のマスキングではありません。Dは接続元IPの制御であり、データ保護の機能ではありません。
問4. ACCOUNT_USAGE.ACCESS_HISTORYビューの説明として正しいものはどれか。
正解:C
ACCESS_HISTORYはクエリ単位でアクセス・変更されたオブジェクトと列を記録し、ビュー経由でも基になるテーブル・列まで追跡できるため、機密データの利用監査やリネージの構成に使えます。Aはログイン履歴(LOGIN_HISTORY)、Bはクレジット消費(WAREHOUSE_METERING_HISTORY)の説明で、いずれも別のビューです。Dは対象を不当に狭めた説明で、ACCESS_HISTORYの目的とは異なります。