こんにちはk.takahashiです。
やりたいこと
データ利用促進の際にデータを社内の方に活用をしてもらう一方で
特定の人だけ重要度の高い機密情報へはアクセスを制御したいみたいなことがよく起こります。
そんな特定のアカウント・グループにカラムごとデータを見せたくない場合は
ダイナミックデータマスキングで表示するデータを制御することが可能です。
ダイナミックデータマスキング
ダイナミックデータマスキングは、クエリ時にテーブルおよびビューの列内のプレーンテキストデータを動的にマスクする列レベルのセキュリティ機能です。
動的とは常にデータを隠す(静的マスキング)のではなく、クエリ実行時にユーザーがどのレベルのアクセス権を持っているかをシステムが認識し、権限によって適切な表示をされた値が返ってくるようになります。
以上図のように動的にマスキングすることで元データの内容を変更せず
権限ベースで機密情報の保護が可能になります。
ダイナミックデータマスキング デモ
例としてカスタマーサポートのメンバークラスには機密情報を隠し
マネージャークラスは閲覧できるマスキングを作成してみましょう。
実践
①サンプルデータ
今回は以下ののようなCUSTOMERSテーブルを対象にマスキングをかけます。
機密情報に当たるCONTACT_NUMBER、CREDIT_CARD_NUMBERの情報を隠すようにしましょう。
--サンプルデータ作成
USE ROLE SYSADMIN;
CREATE DATABASE CUSTOMERS_DB;
CREATE SCHEMA CUSTOMERS_SCHEMA;
CREATE WAREHOUSE CUSTOMERS_WH
with warehouse_size = 'XSMALL'
warehouse_type = 'standard'
auto_suspend = 60
initially_suspended = TRUE
auto_resume = TRUE ;
CREATE OR REPLACE TABLE CUSTOMERS
(
CUSTOMER_ID NUMBER,
CUSTOMER_NAME VARCHAR,
STATE VARCHAR,
REGIST_DATE DATE,
CONTACT_NUMBER VARCHAR,
CREDIT_CARD_NUMBER VARCHAR
);
INSERT INTO CUSTOMERS
VALUES(100,'Phosphophyllite','3.5','2011-09-23','888-999-000','78673421'),
(101,'Antarcticite','3','2009-11-12','777-444-555','34567842'),
(103,'Cinnabar','2','2011-08-15','999-888-777','98765432'),
(104,'Cairngorm','7','2012-02-28','444-555-666','24681357'),
(105,'Bort','10','2013-04-17','333-222-111','13579246'),
(106,'Alexandrite','8.5','2014-09-30','666-777-888','98765432'),
(107,'lapis lazuli','5.5','2015-11-25','222-333-444','86421357');
②ロールの付与
次にメンバーとマネージャーのroleを作成します。
ポイントとしては、セキュリティ管理者(SECURITYADMIN ロールを持つユーザー)またはアカウントの MANAGE GRANTS 権限があるロールがアクセス権限を付与できます。
今回のケースではセキュリティ担当部署がrole権限の一元管理をしやすくするために
SECURITYADMINを使用して権限付与を行うといった想定の元進めます。
また、MEMBERSで実行可能なことはMANAGERSも可能に
MANAGERSで実行可能なことはSYSADMINも可能に権限を階層化させています。
-- MEMBERS roleの作成
USE ROLE SECURITYADMIN;
CREATE ROLE MEMBERS;
GRANT USAGE ON DATABASE CUSTOMERS_DB TO ROLE MEMBERS;
GRANT USAGE ON SCHEMA CUSTOMERS_DB.CUSTOMERS_SCHEMA TO ROLE MEMBERS;
GRANT SELECT ON TABLE CUSTOMERS_DB.CUSTOMERS_SCHEMA.CUSTOMERS TO ROLE MEMBERS;
-- MANAGERS roleの作成
CREATE ROLE MANAGERS;
GRANT ROLE MEMBERS TO ROLE MANAGERS;
GRANT ROLE MANAGERS TO ROLE SYSADMIN;
③マスキング
本題のマスキングを行っていきます。
■ポイント
・マスキングポリシーの作成は親DBおよびスキーマの権限が必要
・マスキングポリシーはスキーマレベルのオブジェクトである
・マスキングポリシーを適用する列の型は前後で同じでなければいけない
・ALTERコマンドでマスキングポリシーをテーブルに適用させる
マスキングポリシーはCASE文で条件分岐をさせて、roleの振り分けやマスキングの仕方を指定できます。
また、ハッシュ化の指定、外部関数の使用、半構造化データの使用も可能です。
-- マスキングポリシーの作成
USE ROLE SYSADMIN;
USE SCHEMA CUSTOMERS_SCHEMA;
--CONTACT_NUMBERのマスキングを作成
CREATE OR REPLACE MASKING POLICY CONTACT_NUMBER_MASK AS (VAL VARCHAR) RETURNS VARCHAR ->
CASE
WHEN CURRENT_ROLE() IN ('MANAGERS') THEN VAL
ELSE REGEXP_REPLACE(VAL,'.+\-','******')
END;
--CREDIT_CARD_NUMBERのマスキングを作成
CREATE OR REPLACE MASKING POLICY CREDIT_CARD_NUMBER_MASK AS (VAL VARCHAR) RETURNS VARCHAR ->
CASE
WHEN CURRENT_ROLE() IN ('MANAGERS') THEN VAL
ELSE '********'
END;
--マスキングポリシーの適用
ALTER TABLE CUSTOMERS MODIFY COLUMN CONTACT_NUMBER SET MASKING POLICY CONTACT_NUMBER_MASK;
ALTER TABLE CUSTOMERS MODIFY COLUMN CREDIT_CARD_NUMBER SET MASKING POLICY CREDIT_CARD_NUMBER_MASK;
④検証
最後にroleごとに表示されたデータの見え方が変わっているのか確認をします。
以下の結果でメンバーはCONTACT_NUMBER、CREDIT_CARD_NUMBERがマスキングされているのに対し
マネージャーは問題なくデータを閲覧できていることが分かります。
-- メンバー 検証
USE ROLE MEMBERS;
SELECT * FROM CUSTOMERS;
-- マネージャー 検証
USE ROLE MANAGERS;
SELECT * FROM CUSTOMERS;
マスキングポリシーのオブジェクト確認
Snowflake環境におけるマスキングポリシーの状況は
SNOWFLAKE内のACCOUNT_USAGEで確認が可能です。
権限管理をする担当部署の方はマスキングポリシーの監視が可能になります。
表示される指標(公式ドキュメントより一部抜粋)
POLICY_NAME | マスキングポリシーの名前 |
POLICY_ID | マスキングポリシーの識別子 |
POLICY_CATALOG | マスキングポリシーが属するデータベース |
POLICY_OWNER | マスキング ポリシーを所有するロールの名前 |
POLICY_BODY | マスキングポリシーの定義 |
CREATED | マスキングポリシーが作成された日時 |
さいごに
今回はSnowflakeでダイナミックマスキングポリシーを設定する方法を紹介しました。
truestarではSnowflakeの検討、導入支援や環境構築からアプリ開発まで幅広くサポート可能です。
Snowflakeに゙興味がある、導入済みだけどもっとうまく活用したい等々ありましたら、ぜひこちらからご相談ください!