Snowflake マスキングポリシーを使ってみた

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 ロールの作成、付与

各ユーザーに適したロールの作成および付与をします。

今回は以下の権限を設定していきます。

  • 全てのユーザーに付与する権限
    1. ウェアハウス(testwh)USAGE権限
    2. データベース(testdb)USAGE権限
    3. スキーマ(testsc)USAGE権限
    4. テーブル(testTB)SELECT権限
  • ポリシー管理者のみに付与する権限
    1. マスキングポリシー作成権限
    2. マスキングポリシー適用権限

作成するロールは以下の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学習の参考になれば幸いです。

執筆担当者プロフィール
福濵 比南

福濵 比南(日本ビジネスシステムズ株式会社)

2023年度入社。Data&AIプラットフォーム部所属。

担当記事一覧