第2章 アカウント管理とデータガバナンス / 想定学習時間:30〜40分 / 最終確認:2026年8月

2-4. データガバナンス(マスキング・行アクセス・タグ・リネージ)

🎯 この節の学習目標

1. 動的データマスキング(列レベルセキュリティ)

動的データマスキング(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(外部トークン化)があります。これはデータのロード前に外部のトークン化プロバイダーで値をトークンに置き換えておき、クエリ時にマスキングポリシー内から外部関数でデトークン化する方式です。「保存時点で生データを持たない」点が動的マスキングとの違いです。

2. 行アクセスポリシー(行レベルセキュリティ)

行アクセスポリシー(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つのテーブルに行アクセスポリシーとマスキングポリシーを併用できます。このとき評価順は「先に行アクセスポリシーで行が絞られ、次にマスキングポリシーで列がマスクされる」、つまり行→列の順です。また、同じ列を行アクセスポリシーの判定列とマスキングポリシーの対象列の両方にすることはできない、という制約もあわせて覚えておくと安心です。

3. オブジェクトタグとタグベースマスキング

オブジェクトタグ(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)(結合キーとしては使えるが値そのものは見せない、といった制御ができます)です。いずれもポリシーをオブジェクトとして作成して適用するという枠組みはマスキングポリシーと共通で、データクリーンルームのようなプライバシー重視の共有シナリオで活用されます。

4. ACCESS_HISTORYによる監査とリネージ

「誰が・いつ・どのデータにアクセスしたか」を追跡するには、SNOWFLAKEデータベースの ACCOUNT_USAGE.ACCESS_HISTORY ビューを使います(ACCOUNT_USAGEスキーマの詳細は2-7で扱います)。

5. ガバナンス機能の評価の流れ

1つのクエリに対して各ガバナンス機能がどの順で働くかを図で整理します。

クエリ実行SELECT * FROM customers(実行ロール:analyst)
まず行の絞り込み
行アクセスポリシーの評価ポリシーがTRUEを返した行だけが対象に残る
次に列のマスク
マスキングポリシーの評価列ごとにロール条件を判定し、値を変換(タグベースマスキング含む)
結果の返却
クエリ結果見てよい行×見てよい形の列だけが返る
ACCESS_HISTORYアクセスされたオブジェクト・列を記録(監査・リネージ)

図:ガバナンス機能の評価順。行アクセスポリシー(行)→マスキングポリシー(列)の順に適用され、アクセスの事実はACCESS_HISTORYに記録される

✅ この節のまとめ

練習問題

問1. 動的データマスキングの説明として正しいものはどれか。

  1. マスキングポリシーを適用すると、テーブルに保存されている元の値がマスク済みの値に書き換えられる
  2. マスキングポリシーはスキーマレベルのオブジェクトとして作成し、列に適用する。クエリ実行時にロールなどの条件で結果の見え方が変わる
  3. マスキングポリシーはテーブルごとに1つだけ作成でき、他のテーブルと共有できない
  4. マスキングはStandardエディションを含むすべてのエディションで利用できる
解答と解説を見る

正解:B

マスキングポリシーは独立したスキーマオブジェクトで、列に適用され、クエリ実行時に動的に評価されます。Aは誤りで、元データは変更されません(だからこそ「動的」マスキングです)。Cは誤りで、1つのポリシーを複数テーブルの複数列に使い回せます。Dは誤りで、動的データマスキングはEnterpriseエディション以上の機能です。

問2. 1つのテーブルに行アクセスポリシーとマスキングポリシーの両方が適用されている場合の評価順として正しいものはどれか。

  1. 先にマスキングポリシーで列がマスクされ、その結果に対して行アクセスポリシーが評価される
  2. 先に行アクセスポリシーで行が絞り込まれ、残った行に対してマスキングポリシーが評価される
  3. 両ポリシーは同時に評価され、順序は保証されない
  4. 行アクセスポリシーとマスキングポリシーは同一テーブルに併用できない
解答と解説を見る

正解:B

評価順は「行→列」です。まず行アクセスポリシーが行の可視性を決め、可視となった行に対してマスキングポリシーが列の値を変換します。AとCはこの順序の理解を問う誤答です。Dは誤りで、併用は可能です(ただし同じ列を行アクセスポリシーの判定列とマスキング対象列の両方にはできません)。

問3. 「個人情報を含む列に共通タグを付け、そのタグが付いた列すべてに自動的にマスキングが適用されるようにしたい」。この要件を満たす機能はどれか。

  1. タグベースマスキング(マスキングポリシーをタグに関連付ける)
  2. External Tokenization
  3. 行アクセスポリシー
  4. ネットワークポリシー
解答と解説を見る

正解:A

マスキングポリシーをタグに関連付けると、そのタグが付与された列すべてにポリシーが自動適用されます。列が増えてもタグを付けるだけで統制が効くのが利点です。BのExternal Tokenizationはロード前のトークン化方式でありタグ連動の仕組みではありません。Cは行の可視性の制御で列のマスキングではありません。Dは接続元IPの制御であり、データ保護の機能ではありません。

問4. ACCOUNT_USAGE.ACCESS_HISTORYビューの説明として正しいものはどれか。

  1. ユーザーのログイン成功・失敗の履歴を記録するビューである
  2. ウェアハウスのクレジット消費履歴を記録するビューである
  3. クエリがアクセス・変更したオブジェクトを列レベルまで記録し、ビュー経由のアクセスでも基のテーブルまで遡れる。監査やリネージに使える
  4. マスキングポリシーの定義変更の履歴だけを記録するビューである
解答と解説を見る

正解:C

ACCESS_HISTORYはクエリ単位でアクセス・変更されたオブジェクトと列を記録し、ビュー経由でも基になるテーブル・列まで追跡できるため、機密データの利用監査やリネージの構成に使えます。Aはログイン履歴(LOGIN_HISTORY)、Bはクレジット消費(WAREHOUSE_METERING_HISTORY)の説明で、いずれも別のビューです。Dは対象を不当に狭めた説明で、ACCESS_HISTORYの目的とは異なります。