機密データを自動的に分類¶
機密データの自動分類は、機密データの自動検出とタグ付けを可能にするサーバーレス機能です。この機能は、特定のスキーマ内のテーブルを継続的に監視し、 ネイティブ および カスタム 分類カテゴリを使用して列を分類します。
機密データの自動分類により、データエンジニアとスチュワードは以下のことが可能になります。
テーブルを自動的に分類することが、社内のガバナンスとコンプライアンスのニーズにどのように合致するかを実証します。
機密データが適切にタグ付けされていることを確認します。
機密データを保護するために、適切なアクセス制御が行われていることを確認します。
始めましょう¶
機密データを自動的に分類する基本的なワークフローは以下のとおりです。
システムタグ を分類後に自動的に適用するかどうかを含め、スキーマ内の機密データを自動的に分類する頻度を制御する 分類プロファイル を作成します。
オプションとして、分類プロファイルを使用してユーザー定義タグをシステムタグにマッピングし、機密データを含む列をその分類に基づいてユーザー定義タグに関連付けることができます。タグマッピングは、分類プロファイルの作成時に追加することも、作成後に追加することもできます。
オプションとして、 カスタム分類子 を分類プロファイルに追加することで、機密データをユーザー定義のセマンティックカテゴリとプライバシーカテゴリで自動的に分類することができます。カスタム分類子は、分類プロファイルの作成時に追加することも、作成後に追加することもできます。
スキーマに分類プロファイルをセットして、スキーマ内のテーブルが自動的に分類されるようにします。
このワークフローのエンドツーエンドの例については、 例 を参照してください。
分類プロファイルについて¶
データエンジニアは、 CLASSIFICATION_PROFILE クラス のインスタンスを作成して分類プロファイルを作成し、スキーマ内のテーブルを自動的に分類するために使用する基準を定義します。この基準には以下が含まれます。
テーブルが自動的に分類されるまでに存在すべき期間。
過去に分類されたテーブルが再分類されるまでの期間。
自動分類後の列にシステムタグとカスタムタグをセットするかどうか。
システム分類タグとユーザー定義オブジェクトタグ間の マッピング によりユーザー定義タグを自動的に適用できるようにします。
データエンジニアがスキーマに分類プロファイルを割り当てると、スキーマのテーブル内の機密データは、プロファイルで定義されたスケジュールで自動的に分類されます。データエンジニアは、複数のスキーマに同じ分類プロファイルを割り当てることができます。また、スキーマごとに異なる分類基準をセットする必要がある場合は、複数の分類プロファイルを作成することもできます。
データを自動的に分類するプロセスでは、テーブル内の生データにアクセスする必要があります。生データには、列にマスキングポリシーが割り当てられているテーブルが含まれます。しかし、Snowflakeは内部ロールを使用してデータを自動的に分類することで、保護されたデータへのアクセスを規制するという意図を維持しています。内部ロールはマスキングポリシーで保護されたデータにアクセスできますが、このロールはユーザーからはアクセスできません。
CREATE CLASSIFICATION_PROFILE コマンドを使用して分類プロファイルを作成する例については、 例 を参照してください。
タグマッピングについて¶
分類プロファイルを使用して、 SEMANTIC_CATEGORY システムタグ を、1つまたは複数の オブジェクトタグ にマッピングすることができます。このタグマッピングにより、機密データを含む列には、その分類に基づいてユーザー定義タグが自動的に割り当てられます。タグマップは、分類プロファイルの作成時に追加することも、後で <分類プロファイル名>!SET_TAG_MAP メソッドを呼び出すことによって追加することもできます。
ユーザー定義オブジェクトタグにはマスキングポリシーを関連付けることができるため、タグマップを使用して、 タグベースの自動マスキング を有効にすることができ、 SEMANTIC_CATEGORY システムタグに沿った列の保護が容易になります。
分類プロファイルの作成時にタグマップを定義する場合でも、作成後にタグマップを定義する場合でも、マップの内容は JSON オブジェクトとして指定されます。この JSON オブジェクトには、 'column_tag_map'
キーが含まれます。このキーは、ユーザー定義タグ、そのタグの文字列値、およびタグがマッピングされるセマンティックカテゴリを指定するオブジェクトの配列です。タグマップが分類プロファイルに関連付けられ、スキーマ内のテーブルを自動的に分類した後、タグはセマンティックカテゴリに対応する列に割り当てられます。
以下はタグマップの例です。
'tag_map': {
'column_tag_map': [
{
'tag_name':'tag_db.sch.pii',
'tag_value':'Highly Confidential',
'semantic_categories':[
'NAME',
'NATIONAL_IDENTIFIER'
]
},
{
'tag_name': 'tag_db.sch.pii',
'tag_value':'Confidential',
'semantic_categories': [
'EMAIL'
]
}
]
}
このマッピングに基づき、メールアドレスの列があり、分類プロセスでその列にこれらのアドレスが含まれていると判断された場合、 tag_db.sch.pii = 'Confidential'
タグがメールアドレスを含む列にセットされます。
タグマップが、タグ、タグ値、およびカテゴリ値をマップする複数の JSON オブジェクトを含む場合、 JSON オブジェクトの順序は、競合がある場合に列にセットされるタグと値を決定します。JSON オブジェクトを、左から右へ、または JSON を形式化する場合は上から下へ、希望する割り当て順で指定します。
Tip
'column_tag_map'
フィールドの各オブジェクトには、必須キーが1つだけあります: 'tag_name'
。ユーザー定義タグの値を指定しない場合、分類プロセスでは、推奨される SEMANTIC_CATEGORY タグの値が適用されます。
手動で割り当てられたタグと自動分類で適用されたタグが競合すると、エラーが発生します。これらのエラーのトラッキングについては、 トラブルシューティング をご覧ください。
自動分類結果の表示¶
自動分類の結果は、以下の方法で表示できます。
SYSTEM$GET_CLASSIFICATION_RESULT ストアドプロシージャを呼び出します。例:
CALL SYSTEM$GET_CLASSIFICATION_RESULT('mydb.sch.t1');
DATA_CLASSIFICATION_LATEST ビューをクエリするには、 SNOWFLAKE.GOVERNANCE_VIEWER データベースロールが付与されたロールを使用します。例:
SELECT * FROM snowflake.account_usage.data_classification_latest;
制限事項¶
リーダーアカウントに分類プロファイルをセットすることはできません。
スキーマにセットできる分類プロファイルは1つだけです。
同じ分類プロファイルを10,000件以上のスキーマにセットすることはできません。
スキーマには最大10,000件のテーブルを分類できます。
アクセス制御¶
このセクションでは、分類プロファイルを操作し、機密データの自動分類を有効にする権限とロールについて説明します。
タスク |
必要な権限/ロール |
メモ |
---|---|---|
分類プロファイルの作成 |
SNOWFLAKE.CLASSIFICATION_ADMIN データベースロール |
このデータベースロールを他のロールに付与する情報については、 SNOWFLAKE データベースロールの使用 を参照してください。 |
スキーマにおける CREATE SNOWFLAKE.DATA_PRIVACY.CLASSIFICATION_PROFILE |
分類プロファイルインスタンスを作成するスキーマで、この権限が必要です。 |
|
分類プロファイルインスタンスで メソッド を呼び出します |
<classification_profile>!PRIVACY_USER インスタンスロール |
このインスタンスロールを他のロールに付与する情報については、 インスタンスロール を参照してください。 |
スキーマへの分類プロファイルのセット |
アカウントにおける EXECUTE AUTO CLASSIFICATION |
この権限はデフォルトで ACCOUNTADMIN に付与されており、この権限を他のロールに付与することもできます。 |
スキーマにおける MODIFY |
自動分類したいテーブルを含むスキーマでこの権限が必要です。 |
|
アカウントにおける APPLY TAG |
||
分類プロファイルのリスト |
<classification_profile>!PRIVACY_USER インスタンスロール |
|
分類プロファイルのドロップ |
分類プロファイルインスタンスにおける OWNERSHIP |
データエンジニアのロールにこれらの権限とデータベースロールを付与する例については、 基本的な例: スキーマ内のテーブルの自動分類 を参照してください。
機密データを自動的に分類するコスト¶
機密データの自動分類では、 サーバーレスのコンピューティングリソース を使用してスキーマ内のテーブルを分類するため、クレジットが消費されます。この消費の価格については、 Snowflakeサービス利用テーブル のテーブル5を参照してください。
ACCOUNT_USAGE および ORGANIZATION_USAGE スキーマのビューをクエリすることで、機密データの自動分類に費やされた量を確認できます。クレジット消費を監視するには、以下のビューをクエリします。
- METERING_HISTORY ビュー(ACCOUNT_USAGE)
SERVICE_TYPE
列のSENSITIVE_DATA_CLASSIFICATION
に注目し、自動分類の時間当たりのコストを取得できます。例:SELECT service_type, start_time, end_time, entity_id, name, credits_used_compute, credits_used_cloud_services, credits_used, budget_id FROM snowflake.account_usage.metering_history WHERE service_type = 'SENSITIVE_DATA_CLASSIFICATION';
- METERING_DAILY_HISTORY ビュー(ACCOUNT_USAGE と ORGANIZATION_USAGE)
SERVICE_TYPE
列のSENSITIVE_DATA_CLASSIFICATION
に注目し、自動分類の日次コストを取得できます。例:SELECT service_type, usage_date, credits_used_compute, credits_used_cloud_services, credits_used FROM snowflake.account_usage.metering_daily_history WHERE service_type = 'SENSITIVE_DATA_CLASSIFICATION';
- USAGE_IN_CURRENCY_DAILY (ORGANIZATION_USAGE)
SERVICE_TYPE
列のSENSITIVE_DATA_CLASSIFICATION
に注目し、自動分類の日次コストを取得できます。クレジットではなく、通貨でコストを決定するには、このビューを使用します。
例¶
基本的な例: スキーマ内のテーブルの自動分類¶
スキーマ内のテーブルを自動的に分類するには、以下の手順を実行します。
管理者として、データエンジニアに、スキーマ内のテーブルを自動的に分類するために必要な ロールと権限 を与えます。
USE ROLE ACCOUNTADMIN; GRANT USAGE ON DATABASE mydb TO ROLE data_engineer; GRANT MODIFY ON SCHEMA mydb.sch TO ROLE data_engineer; GRANT SELECT ON TABLE mydb.sch.t1 TO ROLE data_engineer; GRANT DATABASE ROLE SNOWFLAKE.CLASSIFICATION_ADMIN TO ROLE data_engineer; GRANT CREATE SNOWFLAKE.DATA_PRIVACY.CLASSIFICATION_PROFILE ON SCHEMA mydb.sch TO ROLE data_engineer; GRANT EXECUTE AUTO CLASSIFICATION ON ACCOUNT TO ROLE data_engineer; GRANT APPLY TAG ON ACCOUNT TO ROLE data_engineer;
データエンジニアのロールに切り替えます。
USE ROLE data_engineer;
CLASSIFICATION_PROFILE クラスのインスタンスとして、 分類プロファイルを作成 します。
CREATE OR REPLACE SNOWFLAKE.DATA_PRIVACY.CLASSIFICATION_PROFILE my_classification_profile( { 'minimum_object_age_for_classification_days': 1, 'maximum_classification_validity_days': 30, 'auto_tag': true });
インスタンスに対して DESCRIBE メソッドを呼び出し、そのプロパティを確認します。
SELECT my_classification_profile!DESCRIBE();
スキーマに分類プロファイルインスタンスをセットすると、スキーマ内のテーブルを監視し、機密データかどうかを自動的に分類するバックグラウンドプロセスが開始されます。
ALTER SCHEMA mydb.sch SET CLASSIFICATION_PROFILE = 'mydb.sch.my_classification_profile';
SYSTEM$GET_CLASSIFICATION_RESULT ストアドプロシージャを呼び出して、自動分類の結果を取得します。
CALL SYSTEM$GET_CLASSIFICATION_RESULT('mydb.sch.t1');
スキーマ内のテーブルを自動的に分類する必要がなくなった場合は、スキーマから分類プロファイルの設定を解除します。
ALTER SCHEMA mydb.sch UNSET CLASSIFICATION_PROFILE;
DROP CLASSIFICATION_PROFILE コマンドを使用して、不要な分類プロファイルをドロップします。
例: タグマップとカスタム分類子の使用¶
管理者として、データエンジニアに、スキーマ内のテーブルを自動的に分類し、列にタグをセットするために必要な ロールと権限 を与えます。
分類プロファイルを作成します。
CREATE OR REPLACE SNOWFLAKE.DATA_PRIVACY.CLASSIFICATION_PROFILE my_classification_profile( { 'minimum_object_age_for_classification_days': 1, 'maximum_classification_validity_days': 30, 'auto_tag': true });
インスタンスの SET_TAG_MAP メソッドを呼び出して、 タグマップ を分類プロファイルに追加します。これにより、機密データを含む列にカスタムタグを自動的に適用することができます。
CALL my_classification_profile!SET_TAG_MAP( {'column_tag_map':[ { 'tag_name':'my_db.sch1.pii', 'tag_value':'sensitive', 'semantic_categories':['NAME'] }]});
あるいは、分類プロファイルを作成するときに、このタグマップを追加することもできます。
SET_CUSTOM_CLASSIFIERS メソッドを呼び出して、 カスタム分類子 を分類プロファイルに追加します。これにより、機密データをユーザー定義のセマンティックカテゴリとプライバシーカテゴリで自動的に分類することができます。
CALL my_classification_profile!set_custom_classifiers( { 'medical_codes': medical_codes!list(), 'finance_codes': finance_codes!list() });
または、分類プロファイルの作成時にカスタム分類子を追加することもできます。
インスタンスの DESCRIBE メソッドを呼び出して、タグマップとカスタム分類子が分類プロファイルに追加されたことを確認します。
SELECT my_classification_profile!DESCRIBE();
スキーマに分類プロファイルインスタンスをセットします。
ALTER SCHEMA mydb.sch SET CLASSIFICATION_PROFILE = 'mydb.sch.my_classification_profile';
tag_db.sch.pii
タグにマスキングポリシーをアタッチして、タグベースのマスキングを有効にします。ALTER TAG tag_db.sch.pii SET MASKING POLICY pii_mask;
例: 自動分類を有効にする前の分類プロファイルのテスト¶
管理者として、データエンジニアに、スキーマ内のテーブルを自動的に分類し、列にタグをセットするために必要な ロールと権限 を与えます。
タグマップとカスタム分類子を使用して分類プロファイルを作成します。
CREATE OR REPLACE SNOWFLAKE.DATA_PRIVACY.CLASSIFICATION_PROFILE my_classification_profile2( { 'minimum_object_age_for_classification_days':1, 'auto_tag':true, 'tag_map': { 'column_tag_map':[ { 'tag_name':'tag_db.sch.pii', 'tag_value':'highly sensitive', 'semantic_categories':['NAME','NATIONAL_IDENTIFIER'] }, { 'tag_name':'tag_db.sch.pii', 'tag_value':'sensitive', 'semantic_categories':['EMAIL','MEDICAL_CODE'] } ] }, 'custom_classifiers': { 'medical_codes': medical_codes!list(), 'finance_codes': finance_codes!list() } } );
自動分類を有効にする前に、 SYSTEM$CLASSIFY ストアドプロシージャを呼び出して、
table1
テーブルのタグマッピングをテストします。CALL SYSTEM$CLASSIFY( 'db.sch.table1', 'db.sch.my_classification_profile' );
出力の
tags
キーには、タグがセットされたかどうかの詳細(セットされていればtrue
、そうでなければfalse
)、セットされたタグの名前、タグの値が含まれます。{ "classification_profile_config": { "classification_profile_name": "db.schema.my_classification_profile" }, "classification_result": { "EMAIL": { "alternates": [], "recommendation": { "confidence": "HIGH", "coverage": 1, "details": [], "privacy_category": "IDENTIFIER", "semantic_category": "EMAIL", "tags": [ { "tag_applied": true, "tag_name": "snowflake.core.semantic_category", "tag_value": "EMAIL" }, { "tag_applied": true, "tag_name": "snowflake.core.privacy_category", "tag_value": "IDENTIFIER" }, { "tag_applied": true, "tag_name": "tag_db.sch.pii", "tag_value": "sensitive" } ] }, "valid_value_ratio": 1 }, "FIRST_NAME": { "alternates": [], "recommendation": { "confidence": "HIGH", "coverage": 1, "details": [], "privacy_category": "IDENTIFIER", "semantic_category": "NAME", "tags": [ { "tag_applied": true, "tag_name": "snowflake.core.semantic_category", "tag_value": "NAME" }, { "tag_applied": true, "tag_name": "snowflake.core.privacy_category", "tag_value": "IDENTIFIER" }, { "tag_applied": true, "tag_name": "tag_db.sch.pii", "tag_value": "highly sensitive" } ] }, "valid_value_ratio": 1 } } }
分類プロファイルに基づく自動分類が望ましい結果をもたらすことを確認したら、スキーマに分類プロファイルインスタンスをセットします。
ALTER SCHEMA mydb.sch SET CLASSIFICATION_PROFILE = 'mydb.sch.my_classification_profile';
トラブルシューティング¶
自動分類エラーは、アカウントのデフォルト イベントテーブル に永続化されます。エラーメッセージにアクセスするには、以下のクエリを使用します。
SELECT
record_type,
record:severity_text::string log_level,
parse_json(value) error_message
FROM log_db.log_schema.log_table
WHERE record_type='LOG' and scope:name ='snow.automatic_sensitive_data_classification'
ORDER BY log_level;