Snowflakeのタグベースのマスキングポリシーをタグの値でマスク可否を判断するようにして試してみた

Snowflakeのタグベースのマスキングポリシーをタグの値でマスク可否を判断するようにして試してみた

Clock Icon2025.04.24

さがらです。

Snowflakeのタグベースのマスキングポリシーをタグの値でマスク可否を判断するようにして試してみたので、その内容をまとめてみます。

※タグベースのマスキングポリシーについては3年前もブログに書いたことがあったのですが、タグの値でマスク可否を判断する検証をしていなかったので、改めてやってみます。

タグベースのマスキングポリシーのメリット

まずマスキングポリシー自体ですが、タグを介さなくても設定は可能です。以下のブログが参考になると思います。

https://dev.classmethod.jp/articles/try-masking-policy-and-row-access-policy/

一方で、タグベースのマスキングポリシーのメリットは以下の点にあります。

  • タグに対して一度マスキングポリシーを設定すれば、以降は該当するタグをカラムに設定するだけでそのカラムにマスキングの設定ができる
  • タグ自体の値を用いて、マスキング処理を行うか判断できるマスキングポリシーを作成できる

タグベースのマスキングポリシー自体については、以下の公式Docsも参考になると思います。

https://docs.snowflake.com/en/user-guide/tag-based-masking-policies

また、今回の検証では下記のブログも参考にさせて頂きました。

https://medium.com/snowflake/snowflake-tag-based-masking-policies-3b83f767d612

やってみた

ということで、実際にやってみた内容を書いていきます。

データベース・スキーマの作成

まず、マスキングポリシーとタグを管理するデータベース・スキーマを作成します。

use role sysadmin;
create or replace database security;
create or replace schema security.masking;
create or replace schema security.tags;

次に、マスキング対象のデータを管理するデータベースを作成します。(スキーマはデフォルトで作成されるpublicを使用します。)

use role sysadmin;
create or replace database app_data;
create or replace schema app_data.public;

ロールの作成

次に、検証に利用するロールを作成します。

  • dev_role:開発者ロールの想定、個人情報のデータはマスキングされず見ることができる
  • analysis_role:分析者ロールの想定、個人情報のデータはマスキングされる
use role securityadmin;         
create or replace role analysis_role;     
create or replace role dev_role;

-- sysadminの子ロールに
grant role dev_role to role sysadmin;
grant role analysis_role to role sysadmin;

-- securityデータベースの権限付与
grant usage on database security to role sysadmin;
grant usage on database security to role dev_role;

grant usage on all schemas in database security to role sysadmin;
grant usage on all schemas in database security to role dev_role;

-- app_dataデータベースの権限付与
grant usage on database app_data to role sysadmin;
grant usage on database app_data to role dev_role;
grant usage on database app_data to role analysis_role;

grant usage on all schemas in database app_data to role sysadmin;
grant usage on all schemas in database app_data to role dev_role;
grant usage on all schemas in database app_data to role analysis_role;

-- app_data.publicスキーマのselect権限をfuture grantで付与
grant select on future tables in schema app_data.public to role analysis_role;

-- securityデータベースの各スキーマの権限を付与
grant all on schema security.masking to role sysadmin;
grant all on schema security.tags    to role sysadmin;

-- app_data.publicスキーマでテーブルの作成権限をdev_roleに付与
grant create table on schema app_data.public to role dev_role;

-- 既に作成済のウェアハウスcompute_whの権限を付与
grant usage on warehouse compute_wh to role dev_role;
grant usage on warehouse compute_wh to role analysis_role;

-- タグに対するマスキングポリシー付与権限をsysadminに付与
use role accountadmin;
grant apply masking policy on account to role sysadmin;

タグの作成とタグベースのマスキングポリシーの作成・付与

次に、タグの作成とタグベースのマスキングポリシーの作成・付与を行います。

タグベースのマスキングポリシーでタグの値でマスク可否を判断するように設定していますが、これはsystem$get_tag_on_current_column('security.tags.pii_info') = 'pii'のところで行っております。

use role sysadmin;
use schema security.tags;

-- タグの作成
create or replace tag pii_info comment = 'pii flag: "pii" or "-"';

use schema security.masking;

-- string用のマスキングポリシーの作成
create or replace masking policy pii_mask_string
  as (val string)
  returns string ->
    case
      when system$get_tag_on_current_column('security.tags.pii_info') = 'pii'
           and current_role() = 'ANALYSIS_ROLE'
      then '***masked***'
      else val
    end;

-- number用のマスキングポリシーの作成
create or replace masking policy pii_mask_number
  as (val number)
  returns number ->
    case
      when system$get_tag_on_current_column('security.tags.pii_info') = 'pii'
           and current_role() = 'ANALYSIS_ROLE'
      then -9999
      else val
    end;

-- 作成したタグに、作成したマスキングポリシーを付与
alter tag security.tags.pii_info
  set masking policy security.masking.pii_mask_string;

alter tag security.tags.pii_info
  set masking policy security.masking.pii_mask_number;

-- dev_roleでも作成したタグを付与できるように、権限を付与
grant apply on tag security.tags.pii_info to role dev_role;

sysadminで作成したテーブルにタグを付与し、analysis_roleからマスキングされているか確認

まず、タグもマスキングポリシーも作成したsysadminでテーブルを作成し、analysis_roleからマスキングされているか確認してみます。

テーブルの作成は以下のクエリで行います。

use role sysadmin;
use schema app_data.public;

create or replace table customer_sys (
  id     number  with tag (security.tags.pii_info = '-'),
  email  string  with tag (security.tags.pii_info = 'pii'),
  phone  string  with tag (security.tags.pii_info = 'pii'),
  amount number  with tag (security.tags.pii_info = 'pii'),
  dob    date    with tag (security.tags.pii_info = '-')
);

insert into customer_sys values
  (1,'john.doe@example.com','123-456-7890',1000,'1980-01-01'),
  (2,'jane@example.com'    ,'098-765-4321',2000,'1990-12-12');

sysadminから確認すると、マスキングはされていません。

-- sysadminから確認 ※マスキングされない
use role sysadmin;
select * from app_data.public.customer_sys;

2025-04-24_09h54_40

analysis_roleから確認すると、security.tags.pii_info = 'pii'を付与した3つのカラムが、それぞれ指定したマスキングポリシーが適用されてマスキングされていることがわかります。

use role analysis_role;
select * from app_data.public.customer_sys;

2025-04-24_09h55_04

dev_roleで作成したテーブルにタグを付与し、analysis_roleからマスキングされているか確認

次に、PII_INFOのタグをapplyする権限だけもっているdev_roleでテーブルを作成してタグを付与し、analysis_roleからマスキングされているか確認してみます。

テーブルの作成は以下のクエリで行います。

use role dev_role;
use schema app_data.public;

create or replace table customer_dev (
  id        number  with tag (security.tags.pii_info = '-'),
  name      string  with tag (security.tags.pii_info = 'pii'),
  ssn       string  with tag (security.tags.pii_info = 'pii'),
  salary    number  with tag (security.tags.pii_info = 'pii')
);

insert into customer_dev values
  (1,'alice','999-99-9999',75000),
  (2,'bob'  ,'888-88-8888',63000);

dev_roleから確認すると、マスキングはされていません。

-- dev_roleから確認 ※マスキングされない
use role dev_role;
select * from app_data.public.customer_dev;

2025-04-24_09h55_54

analysis_roleから確認すると、security.tags.pii_info = 'pii'を付与した3つのカラムが、それぞれ指定したマスキングポリシーが適用されてマスキングされていることがわかります。

マスキングポリシーもタグも別の管理者ロール(今回はsysadmin)で作成されていて、タグの付与権限だけをもっているロールで作成したテーブルであっても、無事にマスキング処理が確認できました!これならば、「タグやマスキングポリシーの管理はsysadminなどの管理者ロールで行い、実際のタグの付与はテーブルの作成を行う開発者ロールで行う」という運用が出来ますね。

-- analysis_roleから確認 ※マスキングされる
use role analysis_role;
select * from app_data.public.customer_dev;

2025-04-24_09h56_24

最後に

Snowflakeのタグベースのマスキングポリシーをタグの値でマスク可否を判断するようにして試してみました。

タグやマスキングポリシーの管理を中央集権で管理者ロールで行い、タグの付与だけを各開発者ロールで行うという形で運用できますので、統制しやすいと思います。ぜひご活用ください!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.