機密データを自動的に分類

機密データの自動分類は、機密データの自動検出とタグ付けを可能にするサーバーレス機能です。この機能は、特定のスキーマ内のテーブルを継続的に監視し、 ネイティブ および カスタム 分類カテゴリを使用して列を分類します。

機密データの自動分類により、データエンジニアとスチュワードは以下のことが可能になります。

  • テーブルを自動的に分類することが、社内のガバナンスとコンプライアンスのニーズにどのように合致するかを実証します。

  • 機密データが適切にタグ付けされていることを確認します。

  • 機密データを保護するために、適切なアクセス制御が行われていることを確認します。

始めましょう

機密データを自動的に分類する基本的なワークフローは以下のとおりです。

  1. システムタグ を分類後に自動的に適用するかどうかを含め、スキーマ内の機密データを自動的に分類する頻度を制御する 分類プロファイル を作成します。

  2. オプションとして、分類プロファイルを使用してユーザー定義タグをシステムタグにマッピングし、機密データを含む列をその分類に基づいてユーザー定義タグに関連付けることができます。

  3. オプションとして、 カスタム分類子 を分類プロファイルに追加することで、機密データをユーザー定義のセマンティックカテゴリとプライバシーカテゴリで自動的に分類することができます。

  4. スキーマに分類プロファイルをセットして、スキーマ内のテーブルが自動的に分類されるようにします。

このワークフローのエンドツーエンドの例については、 を参照してください。

分類プロファイルについて

データエンジニアは、 CLASSIFICATION_PROFILE クラス のインスタンスを作成して分類プロファイルを作成し、スキーマ内のテーブルを自動的に分類するために使用する基準を定義します。この基準には以下が含まれます。

  • テーブルが自動的に分類されるまでに存在すべき期間。

  • 過去に分類されたテーブルが再分類されるまでの期間。

  • システムタグとカスタムタグを分類後の列に自動的にセットするかどうか。提案されたタグをSnowflakeで自動的に適用させるか、提案されたタグの割り当てを確認してから自分で適用するかを決めることができます。

  • システム分類タグとユーザー定義オブジェクトタグ間の マッピング によりユーザー定義タグを自動的に適用できるようにします。

データエンジニアがスキーマに分類プロファイルを割り当てると、スキーマのテーブル内の機密データは、プロファイルで定義されたスケジュールで自動的に分類されます。データエンジニアは、複数のスキーマに同じ分類プロファイルを割り当てることができます。また、スキーマごとに異なる分類基準をセットする必要がある場合は、複数の分類プロファイルを作成することもできます。

データを自動的に分類するプロセスでは、テーブル内の生データにアクセスする必要があります。生データには、列にマスキングポリシーが割り当てられているテーブルが含まれます。しかし、Snowflakeは内部ロールを使用してデータを自動的に分類することで、保護されたデータへのアクセスを規制するという意図を維持しています。内部ロールはマスキングポリシーで保護されたデータにアクセスできますが、このロールはユーザーからはアクセスできません。

CREATE CLASSIFICATION_PROFILE コマンドを使用して分類プロファイルを作成する例については、 を参照してください。

タグマッピングについて

分類プロファイルを使用して、 SEMANTIC_CATEGORY システムタグ を、1つまたは複数の オブジェクトタグ にマッピングすることができます。このタグマッピングにより、機密データを含む列には、その分類に基づいてユーザー定義タグが自動的に割り当てられます。タグマップは、分類プロファイルの作成時に追加することも、後で <分類プロファイル名>!SET_TAG_MAP メソッドを呼び出すことによって追加することもできます。

ユーザー定義のオブジェクトタグにはマスキングポリシーを関連付けることができるため、タグマップを使用して、自動の タグを使用したマスキング を有効にすることができます。分類後にタグの自動適用を選択すると、データの分類に基づいてマスキングポリシーで列を保護するプロセス全体を自動化できます。新しいデータがスキーマに追加されると、タグを使用したマスキングポリシーが機密データを含む列に自動的に割り当てられます。

分類プロファイルの作成時にタグマップを定義する場合でも、作成後にタグマップを定義する場合でも、マップの内容は 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'
      ]
    }
  ]
}
Copy

このマッピングに基づき、メールアドレスの列があり、分類プロセスでその列にこれらのアドレスが含まれていると判断された場合、 tag_db.sch.pii = 'Confidential' タグがメールアドレスを含む列にセットされます。

タグマップが、タグ、タグ値、およびカテゴリ値をマップする複数の JSON オブジェクトを含む場合、 JSON オブジェクトの順序は、競合がある場合に列にセットされるタグと値を決定します。JSON オブジェクトを、左から右へ、または JSON を形式化する場合は上から下へ、希望する割り当て順で指定します。

Tip

column_tag_map フィールドの各オブジェクトには、必須キーが1つだけあります: tag_nametag_valuesemantic_categories キーを省略した場合、ユーザー定義のタグはSEMANTIC_CATEGORYシステムタグが適用されているすべての列に適用されるため、ユーザー定義のタグの値が指定された列のSEMANTIC_CATEGORYタグの値と一致します。

手動で割り当てられたタグと自動分類で適用されたタグが競合すると、エラーが発生します。これらのエラーのトラッキングについては、 トラブルシューティング をご覧ください。

自動カスタム分類の実装

Snowflakeでは、カスタムのロジックを使用して機密データの特定と分類を行う カスタムの分類機能 を定義できます。例えば、正規表現を使用してICD-10コードを特定し、セマンティックカテゴリの ICD_10_CODES に属するものとして分類するカスタムの分類機能を作成できます。

カスタムの分類機能を作成したら、分類プロファイルに追加することで、Snowflakeでそのロジックに基づいてデータを自動的に分類できるようになります。カスタムの分類機能は、分類プロファイルを作成するときに追加できます。また、 <分類プロファイル名>!SET_CUSTOM_CLASSIFIERS メソッドを呼び出して追加することもできます。

分類プロファイルにカスタムの分類機能とタグマップの両方を追加することで、強力なガバナンスソリューションになります。機密に関するナレッジに基づいてデータを自動的に分類し、ユーザー定義のタグを適用することで追跡が可能になります。このユーザー定義のタグを使用して タグを使用したマスキング を実装すると、データがスキーマに追加された場合、ドメイン固有の機密データがマスキングポリシーによって自動的に保護されるようになります。

重要

自動分類は、リファレンスではなく、カスタムの分類機能の定義を保存します。カスタムの分類機能を変更する場合は、SET_CUSTOM_CLASSIFIERSメソッドを使用して、新しい定義で分類プロファイルを更新する必要があります。

自動分類結果の表示

自動分類の結果は、以下の方法で表示できます。

  • SYSTEM$GET_CLASSIFICATION_RESULT ストアドプロシージャを呼び出します。例:

    CALL SYSTEM$GET_CLASSIFICATION_RESULT('mydb.sch.t1');
    
    Copy

    分類プロセスが完了するまで、結果を返すことはできません。自動分類プロセスは、スキーマに分類プロファイルをセットしてから1時間経たないと開始されません。

  • DATA_CLASSIFICATION_LATEST ビューをクエリするには、 SNOWFLAKE.GOVERNANCE_VIEWER データベースロールが付与されたロールを使用します。例:

    SELECT * FROM snowflake.account_usage.data_classification_latest;
    
    Copy

    結果が表示されるのは、分類が完了してから3時間後になる場合があります。

制限事項

  • リーダーアカウントに分類プロファイルをセットすることはできません。

  • ビューを自動的に分類することはできません。

  • スキーマにセットできる分類プロファイルは1つだけです。

  • 同じ分類プロファイルを10,000件以上のスキーマにセットすることはできません。

  • スキーマでは最大1億のテーブルを分類できます。

  • テーブルに次のような特性がある場合、自動的には分類できません。

    • 列数が10,000以上ある。

    • 255文字以上の名前を持つ列がある。

    • $ 文字を含む名前の列がある。

    • 共有によるテーブル。

アクセス制御

このセクションでは、分類プロファイルを操作し、機密データの自動分類を有効にする権限とロールについて説明します。

タスク

必要な権限/ロール

注意

分類プロファイルの作成

SNOWFLAKE.CLASSIFICATION_ADMIN データベースロール

このデータベースロールを他のロールに付与する情報については、 SNOWFLAKE データベースロールの使用 を参照してください。

スキーマのCREATE SNOWFLAKE.DATA_PRIVACY.CLASSIFICATION_PROFILE

分類プロファイルインスタンスを作成するスキーマで、この権限が必要です。

スキーマへの分類プロファイルのセット

次のいずれかを使用します。

  • EXECUTE AUTO CLASSIFICATION(アカウント)

  • EXECUTE AUTO CLASSIFICATION(スキーマ)

デフォルトでは、スキーマの所有者がスキーマに対するEXECUTE AUTO CLASSIFICATIONの権限を持っています。

データベースに対する権限

分類プロファイルを設定しているスキーマを含むデータベースの権限が少なくとも1つ必要です。

スキーマに対する権限

自動的に分類させるテーブルを含むスキーマの権限が少なくとも1つ必要です。EXECUTE AUTO CLASSIFICATIONの権限がこの条件を満たしています。

次のいずれかを使用します。

  • 分類プロファイルインスタンスのOWNERSHIP。

  • 分類プロファイルの<classification_profile>!PRIVACY_USERインスタンスロール。

PRIVACY_USERインスタンスロールを他のロールに付与する方法については、 インスタンスロール をご覧ください。

アカウントにおける APPLY TAG

分類プロファイルインスタンスで メソッド を呼び出します

<classification_profile>!PRIVACY_USER インスタンスロール

このインスタンスロールを他のロールに付与する情報については、 インスタンスロール を参照してください。

分類プロファイルのリスト

<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';
Copy
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';
Copy
USAGE_IN_CURRENCY_DAILY (ORGANIZATION_USAGE)

SERVICE_TYPE 列の SENSITIVE_DATA_CLASSIFICATION に注目し、自動分類の日次コストを取得できます。クレジットではなく、通貨でコストを決定するには、このビューを使用します。

基本的な例: スキーマ内のテーブルの自動分類

スキーマ内のテーブルを自動的に分類するには、以下の手順を実行します。

  1. 管理者として、データエンジニアに、スキーマ内のテーブルを自動的に分類するために必要な ロールと権限 を与えます。

    USE ROLE ACCOUNTADMIN;
    
    GRANT USAGE ON DATABASE mydb TO ROLE data_engineer;
    GRANT EXECUTE AUTO CLASSIFICATION ON SCHEMA mydb.sch 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 APPLY TAG ON ACCOUNT TO ROLE data_engineer;
    
    Copy
  2. データエンジニアのロールに切り替えます。

    USE ROLE data_engineer;
    
    Copy
  3. CLASSIFICATION_PROFILE クラスのインスタンスとして、 分類プロファイルを作成 します。

    CREATE OR REPLACE SNOWFLAKE.DATA_PRIVACY.CLASSIFICATION_PROFILE
      my_classification_profile(
        {
          'minimum_object_age_for_classification_days': 0,
          'maximum_classification_validity_days': 30,
          'auto_tag': true
        });
    
    Copy
  4. インスタンスに対して DESCRIBE メソッドを呼び出し、そのプロパティを確認します。

    SELECT my_classification_profile!DESCRIBE();
    
    Copy
  5. スキーマに分類プロファイルインスタンスをセットすると、スキーマ内のテーブルを監視し、機密データかどうかを自動的に分類するバックグラウンドプロセスが開始されます。

    ALTER SCHEMA mydb.sch
     SET CLASSIFICATION_PROFILE = 'mydb.sch.my_classification_profile';
    
    Copy

    注釈

    スキーマに分類プロファイルをセットしてから、Snowflakeがスキーマの分類を開始するまで、1時間の遅延があります。

  6. 1時間待ってから、 SYSTEM$GET_CLASSIFICATION_RESULT ストアドプロシージャを呼び出し、自動分類の結果を取得してください。

    CALL SYSTEM$GET_CLASSIFICATION_RESULT('mydb.sch.t1');
    
    Copy
  7. スキーマ内のテーブルを自動的に分類する必要がなくなった場合は、スキーマから分類プロファイルの設定を解除します。

    ALTER SCHEMA mydb.sch UNSET CLASSIFICATION_PROFILE;
    
    Copy
  8. DROP CLASSIFICATION_PROFILE コマンドを使用して、不要な分類プロファイルをドロップします。

例: タグマップとカスタム分類子の使用

  1. 管理者として、データエンジニアに、スキーマ内のテーブルを自動的に分類し、列にタグをセットするために必要な ロールと権限 を与えます。

  2. 分類プロファイルを作成します。

    CREATE OR REPLACE SNOWFLAKE.DATA_PRIVACY.CLASSIFICATION_PROFILE
      my_classification_profile(
        {
          'minimum_object_age_for_classification_days': 0,
          'maximum_classification_validity_days': 30,
          'auto_tag': true
        });
    
    Copy
  3. インスタンスの 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']
        }]});
    
    Copy

    あるいは、分類プロファイルを作成するときに、このタグマップを追加することもできます。

  4. SET_CUSTOM_CLASSIFIERS メソッドを呼び出して、 カスタム分類子 を分類プロファイルに追加します。これにより、機密データをユーザー定義のセマンティックカテゴリとプライバシーカテゴリで自動的に分類することができます。

    CALL my_classification_profile!set_custom_classifiers(
      {
        'medical_codes': medical_codes!list(),
        'finance_codes': finance_codes!list()
      });
    
    Copy

    または、分類プロファイルの作成時にカスタム分類子を追加することもできます。

  5. インスタンスの DESCRIBE メソッドを呼び出して、タグマップとカスタム分類子が分類プロファイルに追加されたことを確認します。

    SELECT my_classification_profile!DESCRIBE();
    
    Copy
  6. スキーマに分類プロファイルインスタンスをセットします。

    ALTER SCHEMA mydb.sch
     SET CLASSIFICATION_PROFILE = 'mydb.sch.my_classification_profile';
    
    Copy
  7. tag_db.sch.pii タグにマスキングポリシーをアタッチして、タグベースのマスキングを有効にします。

    ALTER TAG tag_db.sch.pii SET MASKING POLICY pii_mask;
    
    Copy

例: 自動分類を有効にする前の分類プロファイルのテスト

  1. 管理者として、データエンジニアに、スキーマ内のテーブルを自動的に分類し、列にタグをセットするために必要な ロールと権限 を与えます。

  2. タグマップとカスタム分類子を使用して分類プロファイルを作成します。

    CREATE OR REPLACE SNOWFLAKE.DATA_PRIVACY.CLASSIFICATION_PROFILE my_classification_profile(
      {
        'minimum_object_age_for_classification_days':0,
        '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()
        }
      }
    );
    
    Copy
  3. 自動分類を有効にする前に、 SYSTEM$CLASSIFY ストアドプロシージャを呼び出して、 table1 テーブルのタグマッピングをテストします。

    CALL SYSTEM$CLASSIFY(
     'db.sch.table1',
     'db.sch.my_classification_profile'
    );
    
    Copy

    出力の 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
        }
      }
    }
    
  4. 分類プロファイルに基づく自動分類が望ましい結果をもたらすことを確認したら、スキーマに分類プロファイルインスタンスをセットします。

    ALTER SCHEMA mydb.sch
     SET CLASSIFICATION_PROFILE = 'mydb.sch.my_classification_profile';
    
    Copy

トラブルシューティング

デフォルトでは、Snowflakeはユーザーの イベントテーブル を使用して機密データの自動分類に関連するイベントをログに記録します。分類イベントがログに記録されないようにするには、 ENABLE_AUTOMATIC_SENSITIVE_DATA_CLASSIFICATION_LOG アカウントパラメーターをFALSEに設定します。

以下のクエリを使用すると、イベントテーブルからのエラーメッセージを確認できます。

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;
Copy

エラーメッセージの例を示します。出力が切り捨てられ、 "failure_reason" キーとその値(エラーメッセージ)が表示されています。

エラー

"failure_reason":"NO_TAGGING_PRIVILEGE"

原因

自動分類に使用されたロールにタグを設定する権限がない。

解決策

自動分類に使用するロールに必要な権限を付与します。詳細については、 タグの権限 をご覧ください。

エラー

"failure_reason":"MANUALLY_APPLIED_VALUE_PRESENT"

原因

別のタグが手動で列に設定されている。

解決策

手動で列に設定したタグを保持するかどうか決定します。保持しない場合は、先にタグの設定を外してから、自動分類またはSYSTEM$CLASSIFYストアドプロシージャを使用してテーブルを分類します。

エラー

"failure_reason":"TAG_NOT_ACCESSIBLE_OR_AUTHORIZED"

原因

分類に使用されたロールがタグにアクセスできない。

解決策

  • タグが存在しない場合は、タグを作成します。

  • タグが存在する場合は、タグまたはタグを含むデータベースおよびスキーマに対する権限をスキーマの分類に使用したロールに付与します。

イベントテーブルのメッセージの詳細については、 ログメッセージの表示 をご覧ください。