Snowflake Dynamic Data Masking(DDM)は、テーブルの元データを変更することなく、クエリ結果のカラム値をユーザーのロールに応じてリアルタイムにマスクする機能です。Masking Policyオブジェクトを作成してカラムに適用するだけで、機密データ(個人情報・クレジットカード番号・メールアドレス等)の保護を実現できます。Enterprise Edition以上が必要です。
DDMはSnowflakeのサービスレイヤーでクエリ実行時に評価されます。カラムに設定されたMasking Policyの条件式がクエリの実行ロールに基づいて評価され、条件に一致する場合はマスク済みの値が返却されます。
クエリ実行フロー:
[SELECT email FROM customers]
│
▼
[サービスレイヤー: Masking Policy評価]
│
├─ 実行ロール = DATA_ADMIN → 元データ返却: [email protected]
│
└─ 実行ロール = ANALYST → マスク済み返却: ****@****.comMasking 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は、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は、オブジェクトタグと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が自動適用される| 方式 | 設定単位 | 管理性 | 適したケース |
|---|---|---|---|
| 直接適用(ALTER COLUMN SET) | カラム単位 | 少数カラムなら簡単 | 小規模・個別制御が必要 |
| Tag-based Masking | タグ値単位 | 大規模で一括管理 | 数百カラム・PII分類が明確 |
1つのカラムに対して直接適用のMasking PolicyとTag-based Masking Policyの両方が設定された場合、直接適用のポリシーが優先されます。
| 機能 | Standard | Enterprise | Business 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;Dynamic Data Masking
問題 1
あるテーブルのemail カラムに直接 Masking Policy が適用されており、同時にそのカラムにはTag-based Masking Policy が設定されたタグも付与されている。クエリ実行時にどちらのポリシーが評価されるか?
正解: 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の紐付けにより、データ型単位でポリシーを一括適用できます。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...