機密データの分類結果の表示と追跡

このトピックでは、機密データの分類結果を表示および追跡する方法と、分類タグを追跡して機密データを監視する方法について説明します。

Trust Centerを使用した分類結果の表示

トラストセンターで機密データの分類結果を表示するには、以下の手順を実行します。

  1. |sf-web-interface-link|必要な権限を持つユーザーとして :ref:` にサインイン <label-classify_trust_center_access_control>` します。

  2. ナビゲーションメニューで Governance & security » Trust Center を選択します。

  3. Data Security タブを選択します。

  4. 次のいずれかを実行します。

    • 機密データのセキュリティに関する高いレベルの洞察を取得したい場合は、 Dashboard タブを選択します。詳細については、 ダッシュボードページの確認 をご参照ください。

    • 機密データを含むと分類されたすべてのテーブルとビューをリストしたい場合は、 Sensitive objects タブを選択します。

      ページが開いたら、テーブルを選択して、機密データがある列、それらの列の :ref:` セマンティックカテゴリ <label-classify_categories>` 、およびタグが列に適用されたかどうかを確認します。

ダッシュボードページの確認

Dashboard ページは、分類されているデータベースやテーブルの数など、機密データのセキュリティに関する高いレベルの洞察を提供します。このページには、次のタイルが含まれています。

タイル

説明

Objects by compliance category

オブジェクト内の情報の型に基づいて、規制やその他のコンプライアンス基準の対象となる可能性のあるデータを含むオブジェクトの数を識別します。

注釈

コンプライアンスカテゴリとセマンティックカテゴリ間のマッピングはすべてを網羅しているわけではありません。Snowflakeがサポートするネイティブセマンティックカテゴリのみがコンプライアンスカテゴリにマッピングされます。完全なマッピングについては、 コンプライアンスカテゴリとそのセマンティックカテゴリ をご参照ください。

データにどの規制や法律が適用されるかを判断し、適用される規制や法律に準拠していることを確認する責任はあなただけにあります。

Objects by semantic category

最も一般的なセマンティックカテゴリと、それらのカテゴリに属するデータを含むオブジェクトの数を識別します。

Databases monitored by auto-classification

機密データ分類によって現在監視されているデータベースを識別します。誰かがデータベースレベルでプロファイルを設定するのではなく、 SQL を使用してデータベース内のスキーマに分類プロファイルを直接設定した場合、データベースは部分的に監視されます。

Classification status

機密データについて現在モニターされているすべてのデータベースが分類されているかどうかを識別します。

Sensitive data masking status

機密データが :doc:` マスキングポリシー </user-guide/security-column-ddm-intro>` によって保護されているかどうかを識別します。マスキングポリシーは、タグベースのポリシーでも、手動で列に適用されたものでもかまいません。

機密データを含むすべての列にマスキングポリシーが関連付けられている場合、テーブルは 完全にマスクされます。機密データを含む一部の列のみがマスキングポリシーに関連付けられている場合、テーブルは 部分的にマスクされます

コンプライアンスカテゴリとそのセマンティックカテゴリ

注釈

データにどの規制や法律が適用されるかを判断し、適用される規制や法律に準拠していることを確認する責任はあなただけにあります。機密データ分類内のコンプライアンスカテゴリは、取り組みを支援するためのすぐに使えるツールキットを提供するように設計されていますが、すべてを網羅するものではありません。 Snowflakeがサポートする :doc:` ネイティブセマンティックカテゴリ </user-guide/classify-native>` のみがコンプライアンスカテゴリにマッピングされます。

警告

HIPAA データ要件は、対象エンティティとビジネスアソシエイトが、厳密な管理的、物理的、および技術的な保護手段を通じて、保護対象健康情報(PHI)の機密性、整合性、および入手可能性を保護することを義務付けています。HIPAA に準拠しない場合、重大なペナルティが科せられる可能性があります。PHI に関連するセマンティックカテゴリは :ref:`label-classify_sensitive_information`に含まれています。

次のテーブルを使用して :ref:` ダッシュボードページ <label-classify_trust_center_review_dashboard>` 上の Objects by compliance category タイルを理解します。

コンプライアンスカテゴリ

ネイティブセマンティックカテゴリ

ロケール

デジタル個人データ保護法( DPDPA )

DATE_OF_BIRTH

なし

DRIVERS_LICENSE

インド( IN )

EMAIL

なし

NAME

なし

NATIONAL_IDENTIFIER

インド( IN )

PHONE_NUMBER

なし

STREET_ADDRESS

なし

TAX_IDENTIFIER

インド( IN )

一般データ保護規則( GDPR )

AGE

なし

DRIVERS_LICENSE

オーストリア( AT )、ベルギー( BE )、ブルガリア( BG )、クロアチア( HR )、キプロス( CY )、チェコ共和国( CZ )、デンマーク( DK )、エストニア( EE )、フィンランド( FI )、フランス( FR )、ドイツ( DE )、ギリシャ( GR )、ハンガリー( HU )、アイルランド( IE )、イタリア( IT )、ラトビア( LV )、リトアニア( LT )、ルクセンブルク( LU )、マルタ( MT )、オランダ( NL )、ポーランド( PL )、ポルトガル( PT )、ルーマニア( RO )、スロバキア( SK )、スロベニア( SI )、スペイン( ES )、スウェーデン( SE )

EMAIL

なし

ETHNICITY

なし

GENDER

なし

IBAN

なし

IMEI

なし

IP_ADDRESS

なし

NAME

なし

NATIONAL_IDENTIFIER

オーストリア( AT )、ベルギー( BE )、ブルガリア( BG )、クロアチア( HR )、キプロス( CY )、チェコ共和国( CZ )、デンマーク( DK )、エストニア( EE )、フィンランド( FI )、フランス( FR )、ドイツ( DE )、ギリシャ( GR )、ハンガリー( HU )、アイルランド( IE )、ラトビア( LV )、リトアニア( LT )、ルクセンブルク( LU )、マルタ( MT )、オランダ( NL )、ポーランド( PL )、ポルトガル( PT )、ルーマニア( RO )、スロバキア( SK )、スロベニア( SI )、スペイン( ES )、スウェーデン( SE )、イギリス( UK )

PASSPORT

オーストリア( AT )、ベルギー( BE )、ブルガリア( BG )、クロアチア( HR )、キプロス( CY )、チェコ共和国( CZ )、デンマーク( DK )、エストニア( EE )、フィンランド( FI )、フランス( FR )、ドイツ( DE )、ギリシャ( GR )、ハンガリー( HU )、アイルランド( IE )、イタリア( IT )、ラトビア( LV )、リトアニア( LT )、ルクセンブルク( LU )、マルタ( MT )、オランダ( NL )、ポーランド( PL )、ポルトガル( PT )、ルーマニア( RO )、スロバキア( SK )、スロベニア( SI )、スペイン( ES )、スウェーデン( SE )

PAYMENT_CARD

なし

PHONE_NUMBER

なし

SALARY

なし

TAX_IDENTIFIER

オーストリア( AT )、キプロス( CY )、フランス( FR )、ドイツ( DE )、ギリシャ( GR )、ハンガリー( HU )、イタリア( IT )、マルタ( MT )、オランダ( NL )、ポーランド( PL )、ポルトガル( PT )、スロベニア( SI )、スペイン( ES )、スウェーデン( SE )

VIN

なし

グラムリーチブライリー法( GLBA )

BANK_ACCOUNT

米国( US )

DRIVERS_LICENSE

米国( US )

NAME

米国( US )

NATIONAL_IDENTIFIER

米国( US )

PASSPORT

米国( US )

PAYMENT_CARD

なし

STREET_ADDRESS

米国( US )

TAX_IDENTIFIER

米国( US )

医療保険の携行性と責任に関する法律( HIPAA )

ADMINISTRATIVE_AREA_1

米国( US )

ADMINISTRATIVE_AREA_2

米国( US )

AGE

なし

CITY

米国( US )

DATE_OF_BIRTH

なし

EMAIL

なし

ETHNICITY

なし

IMEI

なし

IP_ADDRESS

なし

MEDICAL_DATA

なし

MEDICAL_SPECIALTY

なし

NAME

なし

NATIONAL_IDENTIFIER

米国( US )

PHONE_NUMBER

米国( US )

POSTAL_CODE

米国( US )

STREET_ADDRESS

米国( US )

URL

なし

VIN

なし

ペイメントカード業界( PCI )

PAYMENT_CARD

なし

個人を識別できる情報( PII )

DATE_OF_BIRTH

なし

DRIVERS_LICENSE

なし

EMAIL

なし

NAME

なし

NATIONAL_IDENTIFIER

なし

PHONE_NUMBER

なし

STREET_ADDRESS

なし

TAX_IDENTIFIER

なし

SQL を使用した分類結果の表示

SQL を使用してシステム関数を呼び出したり、アカウント使用状況ビューをクエリしたりすることで、データ分類の結果を表示できます。

特定のテーブルの分類結果の取得

特定のテーブルの結果を表示するには、SYSTEM$GET_CLASSIFICATION_RESULT 関数を呼び出します。

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

分類プロセスが完了するまで結果は利用できません。自動分類プロセスは、データベースに分類プロファイルを設定してから1時間後まで開始されません。

最新の分類結果のクエリ

最新の分類結果を表示するには、DATA_CLASSIFICATION_LATEST ビューをクエリします。最新より前の分類結果は表示されません。たとえば、SNOWFLAKE.GOVERNANCE_VIEWER データベースロールが付与されたロールを使用できます。ACCOUNTADMIN を使用する、または SNOWFLAKE データベースに対する IMPORTED PRIVILEGES を持っているなど、他の権限でもアクセスできる場合があります。

SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.DATA_CLASSIFICATION_LATEST;

分類が完了してから3時間経過するまで、結果は表示されない場合があります。以前の分類結果を表示するには、:ref:`label-classify_view_history_sql`を参照してください。

分類履歴のクエリ

過去365日間のすべての分類イベントを表示するには、DATA_CLASSIFICATION_HISTORY ビューをクエリします。たとえば、SNOWFLAKE.GOVERNANCE_VIEWER データベースロールが付与されたロールを使用できます。ACCOUNTADMIN を使用する、または SNOWFLAKE データベースに対する IMPORTED PRIVILEGES を持っているなど、他の権限でもアクセスできる場合があります。

SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.DATA_CLASSIFICATION_HISTORY;

分類履歴をクエリするには、次の例を使用します。

データベース、スキーマ、テーブル名による分類履歴のフィルター

次の例では、データベース名、スキーマ名、およびテーブル名でフィルタリングし、特定のテーブルのすべての分類イベントを新しいものから古いものの順に返します。

SELECT
    database_id,
    database_name,
    schema_id,
    schema_name,
    table_id,
    table_name,
    trigger_type,
    classified_on,
    table_deleted_on,
    result
  FROM SNOWFLAKE.ACCOUNT_USAGE.DATA_CLASSIFICATION_HISTORY
  WHERE database_name = 'MY_DB'
    AND schema_name = 'MY_SCHEMA'
    AND table_name = 'EMPLOYEES'
  ORDER BY classified_on DESC;

出力は、同じ EMPLOYEES テーブルの2つの分類イベントを示しています。EMAIL 列を識別した2025年2月の手動分類と、EMAIL 列と SSN 列の両方を識別した2025年3月のその後の自動分類です。結果は新しいものから古いものの順に並べられており、分類結果が時間の経過とともにどのように変化するかを示しています。

+-------------+---------------+-----------+-------------+----------+------------+---------------------+---------------------------+----------------+--------------------------------+
| DATABASE_ID | DATABASE_NAME | SCHEMA_ID | SCHEMA_NAME | TABLE_ID | TABLE_NAME | TRIGGER_TYPE        | CLASSIFIED_ON             | TABLE_DELETED_ON | RESULT                         |
+-------------+---------------+-----------+-------------+----------+------------+---------------------+---------------------------+----------------+--------------------------------+
| 10          | MY_DB         | 100       | MY_SCHEMA   | 1234     | EMPLOYEES  | AUTO CLASSIFICATION | 2025-03-01 08:00:00 -0800 | NULL           | {"EMAIL": {...}, "SSN": {...}} |
| 10          | MY_DB         | 100       | MY_SCHEMA   | 1234     | EMPLOYEES  | MANUAL              | 2025-02-15 14:30:00 -0800 | NULL           | {"EMAIL": {...}}               |
+-------------+---------------+-----------+-------------+----------+------------+---------------------+---------------------------+----------------+--------------------------------+

テーブル ID によるフィルター

次の例では、テーブル ID で分類履歴をフィルタリングし、特定のテーブルのすべての分類イベントを最新のものから順に返します。

注釈

分類後にテーブルの名前が変更された場合は、ID でフィルタリングすると役立つ可能性があります。

SELECT
    database_id,
    database_name,
    schema_id,
    schema_name,
    table_id,
    table_name,
    trigger_type,
    classified_on,
    table_deleted_on,
    result
  FROM SNOWFLAKE.ACCOUNT_USAGE.DATA_CLASSIFICATION_HISTORY
  WHERE table_id = 1234
  ORDER BY classified_on DESC;

イベントの間にテーブルの名前が EMPLOYEES から EMPLOYEES_NEW に変更された場合でも、出力は同じテーブル(ID 1234)の2つの分類イベントを示します。クエリは名前ではなくテーブル ID でフィルタリングするため、名前の変更に関係なく両方のイベントが返されます。

+-------------+---------------+-----------+-------------+----------+---------------+---------------------+---------------------------+----------------+--------------------------------+
| DATABASE_ID | DATABASE_NAME | SCHEMA_ID | SCHEMA_NAME | TABLE_ID | TABLE_NAME    | TRIGGER_TYPE        | CLASSIFIED_ON             | TABLE_DELETED_ON | RESULT                         |
+-------------+---------------+-----------+-------------+----------+---------------+---------------------+---------------------------+----------------+--------------------------------+
| 10          | MY_DB         | 100       | MY_SCHEMA   | 1234     | EMPLOYEES_NEW | AUTO CLASSIFICATION | 2025-03-01 08:00:00 -0800 | NULL           | {"EMAIL": {...}, "SSN": {...}} |
| 10          | MY_DB         | 100       | MY_SCHEMA   | 1234     | EMPLOYEES     | MANUAL              | 2025-02-15 14:30:00 -0800 | NULL           | {"EMAIL": {...}}               |
+-------------+---------------+-----------+-------------+----------+---------------+---------------------+---------------------------+----------------+--------------------------------+

過去7日間の分類イベント数のカウント

次の例は、過去7日間の分類イベントの数を示しています。

SELECT
    COUNT(*) AS classification_count
  FROM SNOWFLAKE.ACCOUNT_USAGE.DATA_CLASSIFICATION_HISTORY
  WHERE classified_on >= DATEADD(DAY, -7, CURRENT_TIMESTAMP());
+----------------------+
| CLASSIFICATION_COUNT |
+----------------------+
| 42                   |
+----------------------+

1つのテーブルの分類実行の比較

次の例では、テーブルの直近2回の分類の実行を比較し、実行間に分類が変更された列のみを返します。結果の各行には、次のいずれかの値を持つ change_type 列が含まれます。

  • ADDED:列は前回の実行では分類されませんでした。PREV_* 列は NULL です。

  • REMOVED:列は前回の実行では分類されましたが、現在の実行では分類されませんでした。CURR_* 列は NULL です。

  • CHANGED:列は両方の実行に存在しますが、セマンティックカテゴリまたはプライバシーカテゴリが異なります。

両方の実行で分類が同一であった列は、結果から除外されます。

WITH ranked AS (
    SELECT
        table_id,
        database_id,
        schema_id,
        database_name,
        schema_name,
        table_name,
        classified_on,
        trigger_type,
        result,
        ROW_NUMBER() OVER (PARTITION BY table_id ORDER BY classified_on DESC) AS rn
      FROM SNOWFLAKE.ACCOUNT_USAGE.DATA_CLASSIFICATION_HISTORY
      WHERE table_id = 1234
    ),
  curr_cols AS (
      SELECT r.table_id, r.database_id, r.schema_id,
          r.database_name, r.schema_name, r.table_name,
          r.classified_on, r.trigger_type,
          c.key AS column_name, c.value AS column_result
        FROM ranked r, LATERAL FLATTEN(input => r.result) c
        WHERE r.rn = 1
  ),
  prev_cols AS (
      SELECT r.table_id,
          r.classified_on, r.trigger_type,
          c.key AS column_name, c.value AS column_result
        FROM ranked r, LATERAL FLATTEN(input => r.result) c
        WHERE r.rn = 2
  )
  SELECT
      curr.database_id,
      curr.database_name,
      curr.schema_id,
      curr.schema_name,
      curr.table_id,
      curr.table_name,
      prev.classified_on AS previous_classified_on,
      curr.classified_on AS current_classified_on,
      COALESCE(curr.column_name, prev.column_name) AS column_name,
      CASE
        WHEN prev.column_name IS NULL THEN 'ADDED'
        WHEN curr.column_name IS NULL THEN 'REMOVED'
        ELSE 'CHANGED'
      END AS change_type,
      prev.column_result:recommendation.semantic_category::STRING AS prev_semantic_category,
      curr.column_result:recommendation.semantic_category::STRING AS curr_semantic_category,
      prev.column_result:recommendation.privacy_category::STRING AS prev_privacy_category,
      curr.column_result:recommendation.privacy_category::STRING AS curr_privacy_category
    FROM curr_cols curr
    FULL OUTER JOIN prev_cols prev
      ON curr.table_id = prev.table_id
      AND curr.column_name = prev.column_name
    WHERE prev.column_name IS NULL
      OR curr.column_name IS NULL
      OR curr.column_result:recommendation.semantic_category != prev.column_result:recommendation.semantic_category
      OR curr.column_result:recommendation.privacy_category != prev.column_result:recommendation.privacy_category
    ORDER BY column_name;

出力は、直近の2回の実行の間に分類が変更された3つの列を示しています。現在の実行では DATE_OF_BIRTH と SSN が新たに識別(ADDED)されましたが、PHONE は前の実行では分類されましたが、現在の実行では表示されなくなりました(REMOVED)。EMAIL のように両方の実行で分類が同じままであった列は、結果から除外されます。

+-------+---------+-----------+-------------+----------+------------+---------------------+---------------------+---------------+-------------+---------------+---------------+--------------+------------------+
| DB_ID | DB_NAME | SCHEMA_ID | SCHEMA_NAME | TABLE_ID | TABLE_NAME | PREV_CLASSIFIED_ON  | CURR_CLASSIFIED_ON  | COLUMN_NAME   | CHANGE_TYPE | PREV_SEMANTIC | CURR_SEMANTIC | PREV_PRIVACY | CURR_PRIVACY     |
+-------+---------+-----------+-------------+----------+------------+---------------------+---------------------+---------------+-------------+---------------+---------------+--------------+------------------+
| 10    | MY_DB   | 100       | MY_SCHEMA   | 1234     | EMPLOYEES  | 2025-02-15 14:30:00 | 2025-03-01 08:00:00 | DATE_OF_BIRTH | ADDED       | NULL          | DATE_OF_BIRTH | NULL         | QUASI_IDENTIFIER |
| 10    | MY_DB   | 100       | MY_SCHEMA   | 1234     | EMPLOYEES  | 2025-02-15 14:30:00 | 2025-03-01 08:00:00 | PHONE         | REMOVED     | PHONE_NUMBER  | NULL          | IDENTIFIER   | NULL             |
| 10    | MY_DB   | 100       | MY_SCHEMA   | 1234     | EMPLOYEES  | 2025-02-15 14:30:00 | 2025-03-01 08:00:00 | SSN           | ADDED       | NULL          | US_SSN        | NULL         | IDENTIFIER       |
+-------+---------+-----------+-------------+----------+------------+---------------------+---------------------+---------------+-------------+---------------+---------------+--------------+------------------+

JSON 列の分類結果の表示

半構造化データが JSON 形式の場合、Snowflakeは、 ARRAY、 VARIANT または OBJECT タイプの列を分類できます。この分類の結果には、次のような特徴があります。

  • 結果オブジェクトには object_path_results フィールドが含まれます。このフィールドはオブジェクトをリストします。各オブジェクトは、ネイティブセマンティックカテゴリに分類された半構造化データのフィールドに対応します。

  • 半構造化データのフィールドに機密データが含まれている場合、*列*のセマンティックカテゴリは MULTIPLE になります。半構造化データのフィールドのセマンティックカテゴリを取得するには、結果の object_path_results フィールドを使用します。

例として、Snowflakeが次のテーブルを分類するとします。

+-----------------------------------------------------------+---------------+-----------------------------------------------------+
| ARRAY_COL                                                 | FIRST_NAME    | OBJECT_COL                                          |
+-----------------------------------------------------------+---------------+-----------------------------------------------------+
| [ { "email": "alice@example.com" }, { "email": "b..." } ] | "Joe"         | { "email": "jane@domain.com", "phone": "206-..." }  |
+-----------------------------------------------------------+---------------+-----------------------------------------------------+

分類結果は次のようになります。

{
  "ARRAY_COL": {
    "object_path_results": {
      "ARRAY_COL:[$$].email": {
        "alternates": [],
        "recommendation": {
          "confidence": "HIGH",
          "coverage": 1,
          "details": [],
          "privacy_category": "IDENTIFIER",
          "semantic_category": "EMAIL"
        }
      }
    },
    "recommendation": {
      "confidence": "HIGH",
      "details": [],
      "privacy_category": "IDENTIFIER",
      "semantic_category": "MULTIPLE"
    },
    "valid_value_ratio": 1
  },
  "FIRST_NAME": {
    "alternates": [],
    "recommendation": {
      "confidence": "HIGH",
      "coverage": 1,
      "details": [],
      "privacy_category": "IDENTIFIER",
      "semantic_category": "NAME"
    },
    "valid_value_ratio": 1
  },
  "OBJECT_COL": {
    "object_path_results": {
      "OBJECT_COL:email": {
        "alternates": [],
        "recommendation": {
          "confidence": "HIGH",
          "coverage": 1,
          "details": [],
          "privacy_category": "IDENTIFIER",
          "semantic_category": "EMAIL"
        }
      },
      "OBJECT_COL:phone": {
        "alternates": [],
        "recommendation": {
          "confidence": "HIGH",
          "coverage": 1,
          "details": [
            {
              "coverage": 1,
              "semantic_category": "US_PHONE_NUMBER"
            },
            {
              "coverage": 1,
              "semantic_category": "JP_PHONE_NUMBER"
            }
          ],
          "privacy_category": "IDENTIFIER",
          "semantic_category": "PHONE_NUMBER"
        }
      }
    },
    "recommendation": {
      "confidence": "HIGH",
      "details": [],
      "privacy_category": "IDENTIFIER",
      "semantic_category": "MULTIPLE"
    },
    "valid_value_ratio": 1
  }
}

タグを使用して機密データを追跡する

Snowflakeが機密データを分類すると、機密データを含む列に、システム定義およびユーザー定義のタグを提案または自動的に適用します。機密データを含む列にはこれらのタグが割り当てられているため、クエリを実行し、タグを追跡する関数を呼び出すことで、機密データを監視できます。

たとえば、分類され、セマンティックカテゴリが割り当てられたすべての列をリストアップするには、以下のクエリを実行します。

SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.TAG_REFERENCES
  WHERE TAG_NAME = 'SEMANTIC_CATEGORY'
  ORDER BY object_database, object_schema, object_name, column_name;

どのセマンティックカテゴリが hr_data テーブルの fname 列に割り当てられているかを判断する場合、次のクエリを実行して SEMANTIC_CATEGORY タグの値を取得できます。

SELECT SYSTEM$GET_TAG(
    'SNOWFLAKE.CORE.SEMANTIC_CATEGORY',
    'hr_data.fname',
    'COLUMN'
    );

タグを追跡するさまざまな方法については、 オブジェクトタグの監視 をご参照ください。