こんにちは!Bucciです。
半年くらい前に集約ポリシーに関する記事を書いた際、
投影ポリシーについても紹介します、と言っておきながら、すっかり(しっかり)忘れておりました。
リリースから日が空いてしまいましたが、本記事で見ていきたいと思います!
snowflakeのデータマネジメント機能の概要についてはこちらの記事にも分かりやすくまとまっているので
全体像を知りたい方はぜひご一読ください。
おさらい:機密データの保護に使える機能
個人情報等の機密データを保護するためにSnowflakeが提供している機能はいくつかあります。
過去ご紹介してきた機能と今回紹介する機能はこんな感じです。
機能 | 詳細 | 公式ドキュメント |
---|---|---|
ダイナミックデータマスキング | 特定の列内のデータを動的にマスクする | ダイナミックデータマスキングについて |
集約ポリシー | 個別の行へのアクセスは許可せず、集計情報のみアクセス許可を与える | Aggregation policies(英語) |
投影ポリシー | 特定の列へのアクセスを制御する ←この記事でやるよ | Projection policies(英語) |
投影ポリシーはどんな時に使える?
投影ポリシーは上記表の通り、ロールに応じて「特定の列へのアクセスを制限する」機能です。
例えば、クレジットカードの顧客リストがあったとして
課金処理を行う経理スタッフ ⇒クレジットカード番号が必要
顧客サポートスタッフ ⇒クレジットカード番号は不要なので、見せたくない
というケースでは、
経理スタッフと顧客サポートスタッフのロールを分けた上で
クレジットカード番号を含む列を参照できる/できない、をロールごとに設定できる…といったイメージです。
やってみよう!
今回は上記で挙げたケースを想定してやってみましょう。
・クレジットカード番号が入ったテーブルがある
・クレジットカード番号はFINANCEロールからは参照できるがSUPPORTロールからは参照できないようにしたい
ではやっていきましょう!
サンプルデータ作成
SYSADMINロールでサンプルデータを作って、FINANCEおよびSUPPORTロールでSELECTできるようにします。
--サンプルデータ作成 USE ROLE SYSADMIN; CREATE DATABASE CUSTOMERS_DB; CREATE SCHEMA CUSTOMERS_SCHEMA; CREATE OR REPLACE TABLE CUSTOMERS ( CUSTOMER_ID NUMBER, CUSTOMER_NAME VARCHAR, STATE VARCHAR, REGIST_DATE DATE, PHONE_NUMBER VARCHAR, CREDIT_CARD_NUMBER VARCHAR ); INSERT INTO CUSTOMERS VALUES(100,'Phosphophyllite','3.5','2011-09-23','019-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','019-777-888','98765432'), (107,'lapis lazuli','5.5','2015-11-25','019-333-444','86421357');
--作ったテーブルのSELECT権限をFINANCEロールに付与 GRANT USAGE ON DATABASE CUSTOMERS_DB TO ROLE FINANCE; GRANT USAGE ON SCHEMA CUSTOMERS_DB.CUSTOMERS_SCHEMA TO ROLE FINANCE; GRANT SELECT ON TABLE CUSTOMERS_DB.CUSTOMERS_SCHEMA.CUSTOMERS TO ROLE FINANCE; --作ったテーブルのSELECT権限をSUPPORTロールに付与 GRANT USAGE ON DATABASE CUSTOMERS_DB TO ROLE SUPPORT; GRANT USAGE ON SCHEMA CUSTOMERS_DB.CUSTOMERS_SCHEMA TO ROLE SUPPORT; GRANT SELECT ON TABLE CUSTOMERS_DB.CUSTOMERS_SCHEMA.CUSTOMERS TO ROLE SUPPORT;
投影ポリシーの作成と適用
SAMPLE_POLICYという投影ポリシーを作成していきます。
FINANCEの時は投影制限しない、それ以外のロール(SUPPORT含む)では制限してね!と定義します。
そのように定義ポリシーをクレジットカード番号のカラムに適用しています。
この辺りの流れはダイナミックマスキングポリシーや集約ポリシーと同じですね。
--投影ポリシーの作成
CREATE OR REPLACE PROJECTION POLICY SAMPLE_POLICY
AS () RETURNS PROJECTION_CONSTRAINT ->
CASE
WHEN CURRENT_ROLE() = 'FINANCE'
THEN PROJECTION_CONSTRAINT(ALLOW => true)
ELSE PROJECTION_CONSTRAINT(ALLOW => false)
END;
--最初に作ったテーブルのクレジットカード番号列に投影ポリシーを適用
ALTER TABLE CUSTOMERS
MODIFY COLUMN CREDIT_CARD_NUMBER
SET PROJECTION POLICY SAMPLE_POLICY;
それぞれのロールでクエリしてみる
まず、FINANCEでクエリすると…クレジットカード番号が見れていますね。
では、SUPPORTロールではどうでしょうか?
狙い通り、クレジットカード番号の列は制限されてるわよ、と言われました!
では、クレジットカード番号以外の列なら見れるか、Selectしてみましょう。
クレジットカード番号以外は問題なくクエリできました!!
さいごに
この記事ではsnowflakeのデータガバナンス機能の1つ、投影ポリシーについて紹介しました。
ポリシーを作って適用する、という簡単なステップで制御できましたね…!
あくまで投影を制限するポリシーなので、制限しているカラムを結合キーとして使用することはできるのも便利なところです。
一方で、投影ポリシーで保護しているテーブルと保護していないテーブルを結合した場合、
保護していないテーブル側からは情報が参照できてしまうのでそのあたりは注意が必要です。
truestarではSnowflakeの検討、導入支援や環境構築からアプリ開発まで幅広くサポート可能です。
Snowflakeに興味がある、導入済みだけどもっとうまく活用したい等々ありましたら、ぜひこちらからご相談ください!