🚀

【Snowflake】機密データの自動分類機能を使ってみた

2024/12/11に公開

(この記事は、Snowflake Advent Calendar 2024 シリーズ2 の 11日目の記事です)

はじめに

こんにちは!システムサポートの斎藤です。

みなさんは、Snowflake に機密データを自動で分類して、システムタグを付与してくれる機能があることはご存じですか?
指定したテーブルの各列について、列名や列に格納されているデータ値を参考にして個人情報・機密情報などをSnowflake側で判断し、対応するシステムタグを付与する機能です。
付与されたシステムタグは、さらに行アクセスポリシーやマスキングポリシー等の機能と組み合わせることで、機密データに対するアクセス制御を設定することも可能です。
組織のデータプライバシー規制を満たすために非常に有用な機能と言えるでしょう。

今回は上記の機能を用いて、データを自動分類する方法を紹介します!

本記事で分かること

本記事では Snowflake のデータ分類機能を用いて、スキーマ内のテーブルを自動分類し、機密データが含まれる列に対して自動でシステムタグを設定する方法を紹介します。
具体的には以下の内容について理解することができます。

  • 機密データの自動分類機能について
  • 機密データの自動分類機能の設定方法

機密データの自動分類機能とは

自動分類機能( Sensitive Data Auto-Classification )とは、スキーマ内のテーブルを列名やデータに基づいて自動で分類し、個人情報や機密情報などの重要なデータに関連する列にシステムタグを付与する機能です。
付与されるシステムタグは以下の2種類です。どちらも SNOWFLAKE.CORE スキーマに存在します。

システムタグ 付与対象
セマンティック
カテゴリ
個人の情報を含むデータ
例)NAME(名)、AGE(年齢)、GENDER(性別) etc...
プライバシー
カテゴリ
セマンティックカテゴリに分類されたデータのうち、以下に分類されるデータ
①識別子:個人を一意に識別可能なデータ
 例)NAME(名前)、EMAIL(メールアドレス) etc...
②準識別子:2 つ以上の組み合わせで個人を一意に識別可能なデータ
 例)GENDER(性別)、AGE(年齢) etc...
③機密:個人の特定には至らないがプライバシー上開示すべきでないデータ
 例)SALARY(給与)

自動分類が可能な列は、以下の 4 種類です。

  • スキーマ内の既存のテーブルの列
  • スキーマ内の新しいテーブルの列
  • スキーマ内のテーブルの新しい列または変更された列
  • 再度分類が必要な可能性がある、過去に分類されたテーブルの列

機能の詳細については、Snowflake 公式ドキュメントの以下もご参照ください。
https://docs.snowflake.com/en/user-guide/classify-auto

また、タグ機能自体については、以下をご参照ください。
https://docs.snowflake.com/en/user-guide/object-tagging

補足として、自動分類機能の分類方法を拡張する「カスタム分類」という機能も存在します。
ユーザー独自のセマンティックカテゴリ定義や、正規表現を用いた分類判断が可能ですが、今回の記事では扱わずシステム標準の分類方法を用います。
カスタム分類については、以下をご参照ください。
https://docs.snowflake.com/en/user-guide/classify-custom

機密データの自動分類機能を使ってみよう!

それでは、実際に機密データの自動分類機能を設定して、動作の確認をしてみましょう!
今回は以下の列を持つ従業員マスタテーブルを作成し、個人情報や機密情報に関連する列がどのように自動分類されるかを確認します。

  • 会社に関する列(会社名・部署)
  • 個人に関する列(名前・苗字・年齢・住所・電話番号)
  • 所属や給与に関する列(従業員番号・給与・グレード・入社日・退職日)
  • データに関する列(登録日・更新日)

また、データの分類を行うための必要な権限設定は以下です。

権限またはロール テーブルの分類 列にシステムタグを設定する システムタグを表示する
テーブルまたはビューに対する SELECT
テーブルに対する OWNERSHIP
アカウントに対する APPLY TAG
ACCOUNTADMIN ロール

事前準備

使用するロール・DB・スキーマ・ウェアハウスを作成します。
作成したロールは SYSADMIN 配下の階層に設定し、現在のユーザーに割り当てます。
また、タグの設定を確認するため、アカウントに対する APPLY TAG 権限も付与します。

USE ROLE ACCOUNTADMIN;
CREATE ROLE IF NOT EXISTS tutorial_role;

GRANT CREATE DATABASE ON ACCOUNT TO ROLE tutorial_role;
GRANT APPLY TAG ON ACCOUNT TO ROLE tutorial_role;

CREATE WAREHOUSE IF NOT EXISTS tutorial_wh;
GRANT USAGE ON WAREHOUSE tutorial_wh TO ROLE tutorial_role;

GRANT ROLE tutorial_role TO ROLE SYSADMIN;
SET my_user = CURRENT_USER();
GRANT ROLE tutorial_role TO USER IDENTIFIER($my_user);

USE ROLE tutorial_role;

CREATE DATABASE IF NOT EXISTS tutorial_db;
USE DATABASE tutorial_db;
CREATE SCHEMA IF NOT EXISTS sch;

使用するデータの登録

続いて機密データの分類を行うテーブルを作成し、データを登録します。
(既存のテーブルを使用する場合は、対象テーブルの所有者権限、もしくは対象テーブルの SELECT 権限とアカウントに対する APPLY TAG 権限が必要です)

-- テーブルの作成
USE ROLE tutorial_role;
USE DATABASE tutorial_db;
USE SCHEMA sch;

CREATE TABLE EMPLOYEE_MST (
	EMPLOYEE_ID NUMBER NOT NULL,
	COMPANY VARCHAR,
	DEPARTURE VARCHAR,
	FIRST_NAME VARCHAR,
	LAST_NAME VARCHAR,
	AGE NUMBER,
	ADDRESS VARCHAR,
	PHONE_NUMBER VARCHAR,
	SALARY NUMBER,
	GRADE VARCHAR,
	JOINING_DATE DATE,
	LEAVING_DATE DATE,
	INS_DATE DATE,
	UPD_DATE DATE,
	CONSTRAINT PK_EMPLOEE_MST PRIMARY KEY (EMPLOYEE_ID)
);
-- データの登録
INSERT INTO TUTORIAL_DB.SCH.EMPLOYEE_MST (EMPLOYEE_ID, COMPANY, DEPARTURE, FIRST_NAME, LAST_NAME, AGE, ADDRESS, PHONE_NUMBER, SALARY, GRADE, JOINING_DATE, LEAVING_DATE, INS_DATE, UPD_DATE) VALUES 
('1', 'CompanyC', 'HR', 'WBBPT', 'DPCPD', 37, '3MJW4Y7RG2', '5946670441', 97587.69, 'A', '2016-06-28', NULL, '2024-11-25 03:03:19', '2024-11-25 03:03:19'),
('2', 'CompanyB', 'Marketing', 'NGTUW', 'BAFPL', 34, '40XP4JI62L', '2632506604', 58467.2, 'C', '2018-01-07', NULL, '2024-11-25 03:03:19', '2024-11-25 03:03:19'),
('3', 'CompanyA', 'Marketing', 'PAZOX', 'PNSSD', 54, 'QRG06JAYDJ', '6595951314', 134695.97, 'D', '2013-11-28', NULL, '2024-11-25 03:03:19', '2024-11-25 03:03:19'),
('4', 'CompanyB', 'Engineering', 'TUNNU', 'BNUJW', 32, 'VW6E31I9HB', '1482915636', 96670.65, 'C', '2002-11-22', NULL, '2024-11-25 03:03:19', '2024-11-25 03:03:19'),
('5', 'CompanyD', 'Marketing', 'IBRFY', 'RWTDP', 51, '58TWPO4J0T', '6698866890', 113841.34, 'D', '2010-02-07', NULL, '2024-11-25 03:03:19', '2024-11-25 03:03:19')

データの自動分類

次に作成したテーブルのデータを自動分類します。
以下の手順で実行してください。

  1. データベースから対象のスキーマ配下の [テーブル] を選択し、画面右上の「…」を開く
  2. 「機密データを分類してタグ付け」を選択

  1. 「続行するにはウェアハウスを選択してください」のメッセージが表示された場合、事前準備で作成したウェアハウス「tutorial_wh」を選択

  1. 「データを自動的にタグ付け」にチェックを入れ、分類を行うテーブルを選択
    その後、「機密データを分類してタグ付け」を選択

  1. 分類が完了し、「確認済み」のマークがテーブルに付与されタグが自動的に付与される
    「結果を表示」を選択して確認

  1. 自動でデータが分類され、付与されたタグが表示される
    ※「推奨セマンティックカテゴリ」列には、左から分類精度・セマンティックカテゴリタグ・プライバシーカテゴリタグが表示される
     今回「 AGE 」カラムは分類精度が3段階中3と最も高く、セマンティックカテゴリタグは「 AGE 」、プライバシーカテゴリタグは「 QUASI_IDENTIFIER 」(準識別子)が付与されている

  1. テーブルのカラムタブを表示すると、自動でタグ付けされていることが確認できる

  1. テーブルのDDLを確認すると、タグが追加されている

また、アカウントに対する APPLY TAG 権限がないロールでは、付与されたシステムタグを DDL から確認することはできない

補足:サンプルデータの件数を5000件に増やして再度分類すると、別の列にもタグが付与された
列名だけでなくデータも判断基準に使用されるため、データ量によっても分類精度が左右される

まとめ

本記事では、以下について学習しました。

  • 機密データの自動分類機能について
  • 機密データの自動分類機能の設定方法

自動分類機能によりシステムタグを付与することで、個人情報や機密情報をより効率的に保護することが可能です。
皆さんもぜひ活用してみてください!

https://www.sts-inc.co.jp/snowflake/

Discussion