Data&AIプラットフォーム部所属の福濵です。2023年に入社しSnowflakeについて基礎から勉強しています。
本記事では、Snowflakeのマスキングポリシーの概要および実装について、ご紹介します。
マスキングポリシー概要
Snowflakeのマスキングポリシーとは、指定したユーザーに対しテーブル、ビューの列内のデータをマスキングする(別データで見えないようにする)ためのルールのことです。
マスキングポリシーを指定のテーブルやビューの列に適用させることで、条件に当てはまったユーザーは、本来あるはずのデータの参照ができなくなります。その代わりに、あらかじめ指定された別データが見えるようになります。
使用される場面の一例です。
- クレジットの支払い方法でクレジット番号の下4桁のみ表示される
- それ以外の番号は「***」などでマスキングされて表示される
Snowflakeのマスキングポリシーの特長として以下が挙げられます。
- ポリシーを一度記述すれば、同じポリシーを別オブジェクトに何度でも使用可能
- オブジェクト所有者でも条件によってはマスキングの対象になる
- クエリしたユーザーによって選択的にマスキングできる
本記事では、ユーザーに付与されたロールで判別する、マスキングポリシーを作成します。
参考:列レベルのセキュリティについて | Snowflake Documentation
マスキングポリシー実装
実装内容
以下のテーブルのPASS列にマスキングポリシーを適用します。
アカウント管理者の他に新たにユーザーを3つ作成し、マスキングされるユーザーとされないユーザーの挙動を確認します。
testTB
ID | NAME | PASS |
1 | 小松 | PPjF9S7p |
2 | 池本 | il_lo2ke |
3 | 結城 | oRwKhVy_ |
4 | 飯田 | GmDOe8BA |
5 | 松坂 | P2uWlX2z |
以下は使用するユーザー一覧および役割です。
- userX
- アカウント管理者
- 事前準備で使用
- userP
- ポリシー管理者
- マスキングポリシー(pass_policy)を適用するユーザー
- userA
- テーブル(testTB)を参照するユーザー
- ポリシー対象外
- userB
- テーブル(testTB)を参照するユーザー
- ポリシー対象
また、本実装は以下のドキュメントを参考にしています。
参考:
CREATE MASKING POLICY | Snowflake Documentation
ALTER TABLE ... ALTER COLUMN | Snowflake Documentation
事前準備
userX(アカウント管理者)で以下のオブジェクトを作成します。
- データベース(testdb)
- スキーマ(testsc)
- ウェアハウス(testwh)
- ユーザー(userP、userA、userB)
データベース、スキーマ、ウェアハウス
実行したコマンドです。
--データベース作成、適用
create database testdb;
use database testdb;
--スキーマ作成、適用
create schema testsc;
use schema testsc;
--ウェアハウス作成、適用
create warehouse testwh;
use warehouse testwh;
ユーザー
実行したコマンドです。
--ユーザー作成
--ポリシー管理者(userP)作成
create user userP
password = 'test12345';
--一般ユーザー(userA,userB)作成
create user userA
password = 'test12345';
create user userB
password = 'test12345';
手順1 ロールの作成、付与
各ユーザーに適したロールの作成および付与をします。
今回は以下の権限を設定していきます。
- 全てのユーザーに付与する権限
- ウェアハウス(testwh)USAGE権限
- データベース(testdb)USAGE権限
- スキーマ(testsc)USAGE権限
- テーブル(testTB)SELECT権限
- ポリシー管理者のみに付与する権限
- マスキングポリシー作成権限
- マスキングポリシー適用権限
作成するロールは以下の4つです。
- roleP:5,6の権限を持たせ、userPに付与。
- roleA:userAに付与。
- roleB:userBに付与。
- role_public:1~4の権限を持たせ、roleP、roleA、roleBに付与。
実行したコマンドです。
--ロール作成
create role roleP;
create role roleA;
create role roleB;
create role role_public;
--権限付与
grant usage on database testdb to role role_public;
grant usage on schema testsc to role role_public;
grant usage on warehouse testwh to role role_public;
grant select on table testtb to role role_public;
--マスキングポリシー作成権限付与
grant create masking policy on schema testsc to role roleP;
grant apply masking policy on account to role roleP;
--ロール、ユーザー付与
grant role role_public to role roleP;
grant role role_public to role roleA;
grant role role_public to role roleB;
grant role roleP to user userP;
grant role roleA to user userA;
grant role roleB to user userB;
手順2 マスキングポリシーの作成、適用
userP(ポリシー管理者)でマスキングポリシー(pass_policy)を作成し、対象列へ適用します。
今回は、testTBテーブルのpass列のデータに対し以下のようにポリシーを設定します。
- 参照ユーザーの使用ロールが「roleA」の時はマスキングをしない
- それ以外のロールは「********」でマスキングをする
実行したコマンドです。
--オブジェクトの指定
use role rolep;
use warehouse testwh;
use database testdb;
use schema testsc;
--マスキングポリシーの作成
create masking policy pass_policy as(val varchar)
returns varchar ->
case
when current_role() IN ('ROLEA') then val
else '********'
END;
--ポリシーの適用
alter table testtb modify column pass set masking policy pass_policy;
※ Snowflake内ではオブジェクト名は全て大文字で認識するため、「ROLEA」と記載しないと機能しないので注意
手順3 確認
userA、userB、userXのそれぞれでtestTBを参照し、PASS列の出力内容を確認します。
userA
--オブジェクトの指定
use role roleA;
use warehouse testwh;
use database testdb;
use schema testsc;
--確認
select * from testtb;
roleAロールを使用しているため、PASS列の内容を参照できました。
userB
--オブジェクトの指定
use role roleb;
use warehouse testwh;
use database testdb;
use schema testsc;
--確認
select * from testtb;
roleA以外のロールのため、PASS列が「********」でマスキングされています。
userX
--オブジェクトの指定
use role accountadmin;
use warehouse testwh;
use database testdb;
use schema testsc;
--確認
select * from testtb;
オブジェクト所有者である、userX(アカウント管理者)もマスキング対象ユーザーのためPASS列を参照することができません。
おわりに
今回は、Snowflakeのマスキングポリシーの概要および実装についてご紹介しました。
マスキングポリシーはデータ保護のために使用される機能です。本記事では、「ROLEA」をマスキング条件としましたが、条件を追加して「ROLEB」の場合はNULL値を返すなど、ルールを柔軟に作成できます。
本記事がSnowflake学習の参考になれば幸いです。