使用自定义分类器实现自定义语义类别

CUSTOM_CLASSIFIER 分类 允许数据工程师根据他们对自己数据的了解来扩展其敏感数据分类能力。若要将敏感数据分类为 自定义语义类别,请在架构中创建 CUSTOM_CLASSIFIER 类的实例,并调用实例方法以添加与该实例关联的正则表达式。

有关使用 CUSTOM_CLASSIFIER 实例创建自定义语义类别的端到端示例,请参阅 示例

命令和方法

支持以下方法和 SQL 命令:

访问控制

下列各节总结了使用实例所需的各种对象的角色和权限。

角色

您可以使用以下角色进行自定义分类:

  • SNOWFLAKE.CLASSIFICATION_ADMIN:使您能够创建自定义分类器实例的数据库角色。

  • custom_classifier!PRIVACY_USER:实例角色,使您能够在实例上调用以下方法:

    • ADD_REGEX

    • LIST

    • DELETE_CATEGORY

  • 对拥有实例 OWNERSHIP 权限的账户角色可以运行以下命令:

    • DROP CUSTOM_CLASSIFIER

    • SHOW CUSTOM_CLASSIFIER

权限

要创建和管理实例,您可以选择为角色授予 CREATE SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER 权限,或向角色授予 PRIVACY_USER 实例角色。

您可以将实例角色授予账户角色和数据库角色,以便其他用户能够使用自定义分类器实例:

GRANT SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER ROLE <name>!PRIVACY_USER
  TO ROLE <role_name>

REVOKE SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER ROLE <name>!PRIVACY_USER
  FROM ROLE <role_name>

GRANT SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER ROLE <name>!PRIVACY_USER
  TO DATABASE ROLE <database_role_name>

REVOKE SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER ROLE <name>!PRIVACY_USER
  FROM DATABASE ROLE <database_role_name>

其中:

name

指定自定义分类器实例的名称。

role_name

指定账户角色的名称。

database_role_name

指定数据库角色的名称。

您必须使用仓库在实例上调用方法。

要为自定义角色 my_classification_role 授予所需的实例角色和权限,以创建和使用 CUSTOM_CLASSIFIER 类的实例,请执行以下语句:

USE ROLE ACCOUNTADMIN;
GRANT DATABASE ROLE SNOWFLAKE.CLASSIFICATION_ADMIN
  TO ROLE my_classification_role;
GRANT USAGE ON DATABASE mydb TO ROLE my_classification_role;
GRANT USAGE ON SCHEMA mydb.instances TO ROLE my_classification_role;
GRANT USAGE ON WAREHOUSE wh_classification TO ROLE my_classification_role;

如果您想启用特定角色(例如 data_analyst)以使用特定实例,请执行以下操作:

GRANT SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER ROLE
  mydb.sch.my_instance!PRIVACY_USER TO ROLE data_analyst;

示例

使用自定义分类器对数据进行分类的高级方法如下:

  1. 确定要分类的表。

  2. 使用 SQL 执行以下操作:

    1. 创建一个自定义分类器实例。

    2. 将自定义语义类别和正则表达式添加到实例中。

    3. 对表进行分类。

完成以下步骤以创建用于对表进行分类的自定义分类器:

  1. 以表 data.tables.employee_roster 为例,其中某一列包含内部员工标识符。

    +-------------+------------------------+
    | EMPLOYEE_ID | EMPLOYEE_NAME          |
    +-------------+------------------------+
    | 100001      | Employee A             |
    | 100002      | Employee B             |
    | 100003      | Employee C             |
    +-------------+------------------------+
    

    该表还可能包含其他身份识别列,例如个人电子邮件地址、工作地点以及上级信息。数据所有者可以对表进行分类,确保正确标记列,以便对表进行监控。

    在此示例中,数据所有者已经为其角色授予了以下权限:

    • 对表的 OWNERSHIP 权限,以便进行分类。

    • 对包含表的架构的 OWNERSHIP 权限。

    • 对包含架构和表的数据库的 USAGE 权限。

  2. 允许数据所有者通过将 SNOWFLAKE.CLASSIFICATION_ADMIN 数据库角色授予数据所有者角色来对表进行分类:

    USE ROLE ACCOUNTADMIN;
    GRANT DATABASE ROLE SNOWFLAKE.CLASSIFICATION_ADMIN
      TO ROLE data_owner;
    
  3. 作为数据所有者,创建一个架构来存储您的自定义分类器实例:

    USE ROLE data_owner;
    CREATE SCHEMA data.classifiers;
    
  4. 使用 CREATE CUSTOM_CLASSIFIER 命令在 data.classifiers 架构中创建自定义分类器实例:

    CREATE OR REPLACE SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER internal_ids();
    

    您可以选择性地更新您的 搜索路径,如下所示:

    • 添加 SNOWFLAKE.DATA_PRIVACY,这样在创建类的新实例时,不必指定类的完全限定名称。

    • 添加 DATA.CLASSIFIERS,这样在调用实例的方法或使用与实例相关的命令时,不必指定实例的完全限定名称。

  5. 使用 SHOW CUSTOM_CLASSIFIER 命令列出您创建的每个实例。例如:

    SHOW SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER;
    

    返回:

    +----------------------------------+---------------+---------------+-------------+-----------------+---------+-------------+
    | created_on                       | name          | database_name | schema_name | current_version | comment | owner       |
    +----------------------------------+---------------+---------------+-------------+-----------------+---------+-------------+
    | 2023-09-08 07:00:00.123000+00:00 | INTERNAL_IDS  | DATA          | CLASSIFIERS | 1.0             | None    | DATA_OWNER  |
    +----------------------------------+---------------+---------------+-------------+-----------------+---------+-------------+
    
  6. 调用实例上的 custom_classifier!ADD_REGEX 方法,以指定系统标签和正则表达式,从而识别列中的内部员工 IDs。在本示例中,值正则表达式匹配六位员工 IDs。匹配列名 EMP.*ID.* 和注释的正则表达式是可选的:

    CALL internal_ids!ADD_REGEX(
      SEMANTIC_CATEGORY => 'EMPLOYEE_ID',
      PRIVACY_CATEGORY => 'IDENTIFIER',
      VALUE_REGEX => '^[0-9]{6}$',
      COL_NAME_REGEX => 'EMP.*ID.*',
      DESCRIPTION => 'Add a regex to identify employee IDs in a column',
      THRESHOLD => 0.8
    );
    

    返回:

    +---------------+
    |   ADD_REGEX   |
    +---------------+
    | EMPLOYEE_ID   |
    +---------------+
    

    小技巧

    在向自定义分类器实例添加正则表达式之前,请先测试该正则表达式。例如:

    SELECT employee_id
    FROM employee_roster
    WHERE employee_id REGEXP('^[0-9]{6}$');
    
    +-------------+
    | EMPLOYEE_ID |
    +-------------+
    | 100001      |
    | 100002      |
    | 100003      |
    +-------------+
    

    在此查询中,仅返回与正则表达式匹配的有效值。该查询不会返回无效值,例如 xyz

    有关详细信息,请参阅 字符串函数(正则表达式)

  7. 对实例调用 custom_classifier!LIST 方法以验证添加到实例的正则表达式:

    SELECT internal_ids!LIST();
    

    返回:

    +--------------------------------------------------------------------------------+
    | INTERNAL_IDS!LIST()                                                            |
    +--------------------------------------------------------------------------------+
    | {                                                                              |
    |   "EMPLOYEE_ID": {                                                             |
    |     "col_name_regex": "EMP.*ID.*",                                             |
    |     "description": "Add a regex to identify employee IDs in a column",         |
    |     "privacy_category": "IDENTIFIER",                                          |
    |     "threshold": 0.8,                                                          |
    |     "value_regex": "^[0-9]{6}$"                                                |
    |   }                                                                            |
    | }                                                                              |
    +--------------------------------------------------------------------------------+
    

    要删除类别,请对实例调用 custom_classifier!DELETE_CATEGORY 方法。

  8. 调用 SYSTEM$CLASSIFY_SCHEMA 存储过程对表进行分类。

  9. 如果不再需要该实例,请使用 DROP CUSTOM_CLASSIFIER 命令从系统中移除自定义分类器实例:

    DROP SNOWFLAKE.DATA_PRIVACY.CUSTOM_CLASSIFIER data.classifiers.internal_ids;
    

审计自定义分类器

您可以使用以下查询来审计自定义分类器实例的创建、向实例添加正则表达式以及删除实例的操作。

  • 若要审计自定义分类器实例的创建,请使用以下查询:

    SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
    WHERE query_text ILIKE 'create % snowflake.data_privacy.custom_classifier%';
    
  • 要对将正则表达式添加到特定实例的操作进行审计,请使用以下查询并将 DB.SCH.MY_INSTANCE 替换为您要审计的实例名称:

    SELECT
        QUERY_HISTORY.user_name,
        QUERY_HISTORY.role_name,
        QUERY_HISTORY.query_text,
        QUERY_HISTORY.query_id
      FROM
        SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY query_history,
        SNOWFLAKE.ACCOUNT_USAGE.ACCESS_HISTORY access_history,
          TABLE(FLATTEN(input => access_history.direct_objects_accessed)) flattened_value
    WHERE flattened_value.value:"objectName" = 'DB.SCH.MY_INSTANCE!ADD_REGEX'
    AND QUERY_HISTORY.query_id = ACCESS_HISTORY.query_id;
    
  • 若要审计删除自定义分类器实例的操作,请使用以下查询:

    SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
    WHERE query_text ILIKE 'drop % snowflake.data_privacy.custom_classifier%';