こんにちは、小澤です!皆さんは、Snowflakeのダイナミックデータマスキングをご存じでしょうか?ダイナミックデータマスキングとは、マスキングポリシーを使用して、条件に当てはまるユーザに特定の列の元の値を見えなくする機能です。
今回は、ダイナミックデータマスキングに使用するマスキングポリシーを皆さんにご紹介します!
本記事でわかること
- マスキングポリシーとは
- 行アクセスポリシーとの違い
- ロールによる制御
- マスキングポリシーの実装方法
マスキングポリシーとは
Snowflakeのマスキングポリシーは、見る人の権限に応じてデータの表示内容を自動で変える仕組みです。たとえば、顧客の電話番号を権限のない人には「***-****-****」のように隠し、権限のある人には元の値を見せられます。データを直接書き換えず、権限に応じてマスキングを動的に行えます。

行アクセスポリシーとの違い
マスキングポリシーによく似た機能として、行アクセスポリシーがあります。行アクセスポリシーは、見る人の権限に応じて表示する行を制御する仕組みです。たとえば、営業担当には自分の担当地域のデータだけを見せ、本社管理者には全件を見せることができます。マスキングポリシーは、列に対する制御であるのに対し、行アクセスポリシーは行に対する制御を行うことができます。

行アクセスポリシーの詳細は、以下のブログで紹介しているので、ぜひご覧ください!
Snowflake: 行アクセスポリシー | Engineer Boost
ロールによる制御
Snowflakeのマスキングポリシーでは、ロールによる制御を行うことが一般的なベストプラクティスです。ロールごとに閲覧可否を分けることで、権限管理がわかりやすくなり、個人情報や機密情報を安全に扱えます。
ロールによる制御時には、以下のシステム関数を使用します。

ビューやテーブルを単純にクエリする場合は、現在のセッションでアクティブになっているロールと、オブジェクトを呼び出すロールは同じになります。
しかし、所有者権限のプロシージャやタスクなどは、セッションでアクティブになっているロールと、オブジェクトを呼び出したロールは異なることがあります。その場合は、INVOKER_ROLEやIS_GRANTED_TO_INVOKER_ROLEを使用することが適切です。
実装
それでは、ロール制御を用いたマスキングポリシーを実装していきます!
※sysadminとsecurityadminの権限を持っているユーザでログインしてください。
データベース・スキーマ・テーブル作成&データ挿入
データベース・スキーマ・テーブルの作成と、データ挿入をします。customerテーブルのtel列をマスキングポリシーを用いて、マスキングしていきます。
use role sysadmin;
-- データベースの作成
create database hanasnow;
-- スキーマの作成
create schema hanasnow.sc_masking_policy;
-- customerテーブルの作成
create table hanasnow.sc_masking_policy.customer (
id int,
name varchar,
city varchar,
tel varchar
)
;
-- データの挿入
INSERT INTO hanasnow.sc_masking_policy.customer (id, name, city, tel) VALUES
(1, '山田太郎', '東京', '03-1234-5678'),
(2, '鈴木花子', '大阪', '06-2345-6789'),
(3, '佐藤次郎', '名古屋', '052-345-6789');
ロール作成&権限付与
下記の2つのロールを作成します。
- hana_manager…tel列の元の値を閲覧可能
- hana_member…tel列の元の値を閲覧不可
-- ロールの作成&権限付与
-- hana_manager(権限あり)
use role securityadmin;
create role hana_manager;
grant role hana_manager to role sysadmin;
grant usage on database hanasnow to role hana_manager;
grant usage on schema hanasnow.sc_masking_policy to role hana_manager;
grant select on table hanasnow.sc_masking_policy.customer to role hana_manager;
-- hana_member(権限なし)
use role securityadmin;
create role hana_member;
grant role hana_member to role sysadmin;
grant usage on database hanasnow to role hana_member;
grant usage on schema hanasnow.sc_masking_policy to role hana_member;
grant select on table hanasnow.sc_masking_policy.customer to role hana_member;
マスキングポリシーの作成&付与
managerロールの場合は元の値を返し、memberロールの場合はマスクされた値(***-****-****)をかえすようなマスキングポリシーを作成します。
use role sysadmin;
-- create masking policy
CREATE OR REPLACE MASKING POLICY hanasnow.sc_masking_policy.tel_mask
AS (val VARCHAR)
RETURNS VARCHAR ->
CASE
WHEN CURRENT_ROLE() = 'HANA_MANAGER' THEN val
ELSE '***-****-****'
END;
-- set masking policy
ALTER TABLE hanasnow.sc_masking_policy.customer
MODIFY COLUMN tel
SET MASKING POLICY hanasnow.sc_masking_policy.tel_mask;
結果確認
それぞれのロールで結果を確認しましょう!


hana_managerロールでは元のデータが表示され、hana_memberロールではマスクされた値が表示されることが確認できました!
まとめ
今回は、マスキングポリシーを用いて、Snowflakeに接続する方法を紹介しました!皆さんもマスキングポリシーを使って、個人情報の保護や、セキュリティ対策にぜひ活用してみてください!
今回は以上です!ありがとうございました!



コメント