Snowflake

Dynamic Data Maskingとは?Snowflakeのデータマスキング

2026-03-21
更新: 2026-03-27
NicheeLab編集部

Snowflake Dynamic Data Masking(DDM)は、テーブルの元データを変更することなく、クエリ結果のカラム値をユーザーのロールに応じてリアルタイムにマスクする機能です。Masking Policyオブジェクトを作成してカラムに適用するだけで、機密データ(個人情報・クレジットカード番号・メールアドレス等)の保護を実現できます。Enterprise Edition以上が必要です。

Dynamic Data Maskingの仕組み

DDMはSnowflakeのサービスレイヤーでクエリ実行時に評価されます。カラムに設定されたMasking Policyの条件式がクエリの実行ロールに基づいて評価され、条件に一致する場合はマスク済みの値が返却されます。

クエリ実行フロー:

[SELECT email FROM customers]
       │
       ▼
[サービスレイヤー: Masking Policy評価]
       │
       ├─ 実行ロール = DATA_ADMIN → 元データ返却: [email protected]
       │
       └─ 実行ロール = ANALYST   → マスク済み返却: ****@****.com

Masking Policyの作成

Masking PolicyはCREATE MASKING POLICYで作成します。入力データ型と戻り値の型は同じである必要があります。

-- メールアドレスのマスキング
CREATE OR REPLACE MASKING POLICY email_mask AS
  (val STRING) RETURNS STRING ->
    CASE
      WHEN IS_ROLE_IN_SESSION('DATA_ADMIN') THEN val
      WHEN IS_ROLE_IN_SESSION('ANALYST')    THEN REGEXP_REPLACE(val, '.+@', '****@')
      ELSE '********'
    END;

-- 数値(給与)のマスキング
CREATE OR REPLACE MASKING POLICY salary_mask AS
  (val NUMBER) RETURNS NUMBER ->
    CASE
      WHEN IS_ROLE_IN_SESSION('HR_ADMIN') THEN val
      ELSE 0
    END;

-- 日付のマスキング(生年月日を年のみに)
CREATE OR REPLACE MASKING POLICY dob_mask AS
  (val DATE) RETURNS DATE ->
    CASE
      WHEN IS_ROLE_IN_SESSION('DATA_ADMIN') THEN val
      ELSE DATE_FROM_PARTS(YEAR(val), 1, 1)
    END;

ロール判定関数

関数動作推奨度
IS_ROLE_IN_SESSION()現在のセッションロール階層にロールが含まれるかを判定推奨
CURRENT_ROLE()現在のアクティブロール名を返す階層を考慮しないため非推奨
IS_GRANTED_TO_INVOKER_ROLE()呼び出し元の権限を判定(ストアドプロシージャ内で使用)特定用途向け

IS_ROLE_IN_SESSION()はロール階層を考慮するため、子ロールから継承されたロールも正しく判定できます。CURRENT_ROLE()はアクティブロールの名前のみを返すため、ロール階層を無視してしまう問題があります。

Masking Policyの適用

作成したMasking Policyは、ALTER TABLE ... ALTER COLUMN ... SET MASKING POLICYでカラムに適用します。

-- 既存テーブルのカラムにポリシー適用
ALTER TABLE customers
  ALTER COLUMN email SET MASKING POLICY email_mask;

ALTER TABLE employees
  ALTER COLUMN salary SET MASKING POLICY salary_mask;

ALTER TABLE employees
  ALTER COLUMN date_of_birth SET MASKING POLICY dob_mask;

-- ポリシーの解除
ALTER TABLE customers
  ALTER COLUMN email UNSET MASKING POLICY;

-- テーブル作成時にポリシーを適用
CREATE TABLE sensitive_data (
  id NUMBER,
  ssn STRING WITH MASKING POLICY ssn_mask,
  email STRING WITH MASKING POLICY email_mask
);

Tag-based Masking

Tag-based Maskingは、オブジェクトタグとMasking Policyを紐付けることで、タグが付与されたすべてのカラムに自動的にマスキングを適用する仕組みです。カラムが数百〜数千ある大規模環境で、手動でカラムごとにポリシーを設定する手間を削減します。

-- Step 1: タグの作成
CREATE OR REPLACE TAG pii_type
  ALLOWED_VALUES 'email', 'phone', 'ssn', 'name';

-- Step 2: タグにMasking Policyを紐付け
ALTER TAG pii_type SET
  MASKING POLICY email_mask  FOR 'email',
  MASKING POLICY phone_mask  FOR 'phone',
  MASKING POLICY ssn_mask    FOR 'ssn',
  MASKING POLICY name_mask   FOR 'name';

-- Step 3: カラムにタグを適用(ポリシーが自動適用される)
ALTER TABLE customers ALTER COLUMN email
  SET TAG pii_type = 'email';

ALTER TABLE customers ALTER COLUMN phone_number
  SET TAG pii_type = 'phone';

-- タグの値に応じて対応するMasking Policyが自動適用される

直接適用 vs Tag-based Masking

方式設定単位管理性適したケース
直接適用(ALTER COLUMN SET)カラム単位少数カラムなら簡単小規模・個別制御が必要
Tag-based Maskingタグ値単位大規模で一括管理数百カラム・PII分類が明確

ポリシーの優先順位

1つのカラムに対して直接適用のMasking PolicyとTag-based Masking Policyの両方が設定された場合、直接適用のポリシーが優先されます。

  • 直接適用(ALTER COLUMN SET MASKING POLICY)が最優先
  • Tag-based Maskingはカラムに直接ポリシーが設定されていない場合のみ有効
  • 1つのカラムに複数のMasking Policyを直接適用することはできない

エディション要件

機能StandardEnterpriseBusiness Critical
Dynamic Data Masking×
Tag-based Masking×
Row Access Policy×
Object Tagging×
External Tokenization××

ポリシーの管理と確認

-- アカウント内のMasking Policyの一覧
SELECT * FROM TABLE(INFORMATION_SCHEMA.POLICY_REFERENCES(
  POLICY_NAME => 'email_mask'
));

-- カラムに適用されているポリシーを確認
DESCRIBE TABLE customers;

-- SHOW MASKING POLICIES でスキーマ内のポリシー一覧
SHOW MASKING POLICIES IN SCHEMA my_db.my_schema;

-- ポリシーの定義を確認
DESCRIBE MASKING POLICY email_mask;

試験対策のポイント

  • DDMはEnterprise Edition以上が必要
  • Masking Policyの入力型と戻り値の型は同一でなければならない
  • IS_ROLE_IN_SESSION()はロール階層を考慮し、CURRENT_ROLE()は考慮しない
  • 1つのカラムに直接適用できるMasking Policyは1つのみ
  • 直接適用ポリシーはTag-based Maskingより優先される
  • 元データは変更されず、クエリ結果のみマスクされる(Dynamic)
  • Tag-based MaskingはALTER TAG SET MASKING POLICYで紐付ける

サンプル問題

Dynamic Data Masking

問題 1

あるテーブルのemail カラムに直接 Masking Policy が適用されており、同時にそのカラムにはTag-based Masking Policy が設定されたタグも付与されている。クエリ実行時にどちらのポリシーが評価されるか?

  1. A. Tag-based Masking Policy が優先される
  2. B. 直接適用された Masking Policy が優先される
  3. C. 両方のポリシーが順番に評価され、より厳格な結果が返される
  4. D. 競合エラーが発生し、クエリは失敗する

正解: B

Snowflakeでは、カラムに直接適用(ALTER COLUMN SET MASKING POLICY)されたMasking Policyが、Tag-based Masking Policyよりも優先されます。両方が設定されている場合、直接適用のポリシーのみが評価され、Tag-based Maskingは無視されます。競合エラーは発生しません。

よくある質問

Dynamic Data MaskingとStatic Data Maskingの違いは何ですか?

Dynamic Data Masking(DDM)はクエリ実行時にリアルタイムでデータをマスクする仕組みで、元データは変更されません。クエリを実行するユーザーのロールに応じて、マスク済み/未マスクのどちらの値が返されるかが決まります。一方、Static Data Maskingは元データ自体を不可逆に変換する手法で、Snowflakeのネイティブ機能ではなく外部ツールで実現します。SnowPro試験で問われるのはDDMです。

Masking Policyを使うにはどのエディションが必要ですか?

Dynamic Data MaskingはEnterprise Edition以上で利用可能です。Standard Editionでは使用できません。Tag-based Masking PolicyもEnterprise Edition以上が必要です。同様にEnterprise以上を要求する機能にはRow Access Policy、Column-level Security、Object Tagging等があります。

1つのカラムに複数のMasking Policyを設定できますか?

いいえ。1つのカラムに設定できるMasking Policyは1つだけです。ただし1つのMasking Policy内でCASE文やIS_ROLE_IN_SESSION関数を使い、複数ロールに対して異なるマスク処理を定義することは可能です。また、Tag-based MaskingではタグとMasking Policyの紐付けにより、データ型単位でポリシーを一括適用できます。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate完全解説|入門試験の攻略

SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.