커스텀 분류기를 사용해서 커스텀 의미 범주를 구현해요

커스텀 분류기를 사용해서 커스텀 의미 범주를 구현해요

Enterprise Edition 기능

민감한 데이터 분류에는 Enterprise Edition 이상이 필요해요. 업그레이드에 대해 문의하려면 Snowflake 지원에 연락해 주세요.

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을 사용하여 다음 작업을 수행해요.

  3. 사용자 지정 분류기 인스턴스를 만들어요.

  4. 인스턴스에 사용자 지정 의미 범주와 정규 표현식을 추가해요.

  5. 테이블을 분류해요.

테이블을 분류하는 사용자 지정 분류기를 만들려면 다음 단계를 완료해요:

data.tables.employee_roster 테이블을 생각해 봐요. 이 테이블의 열 중 하나에는 내부 직원 식별자가 포함되어 있어요.

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

이 테이블에는 개인 이메일 주소, 근무 위치, 관리자 정보와 같은 다른 식별 열도 포함될 수 있어요. 데이터 소유자는 열이 올바르게 태그되어 테이블을 모니터링할 수 있도록 테이블을 분류할 수 있어요.

이 예시에서 데이터 소유자는 자신의 역할에 다음 권한이 이미 부여되어 있어요:

  • 분류할 테이블에 대한 OWNERSHIP

  • 테이블이 포함된 스키마에 대한 OWNERSHIP

  • 스키마와 테이블이 포함된 데이터베이스에 대한 USAGE

SNOWFLAKE.CLASSIFICATION_ADMIN 데이터베이스 역할을 데이터 소유자 역할에 부여하여 데이터 소유자가 테이블을 분류할 수 있게 해요:

USE ROLE ACCOUNTADMIN;
GRANT DATABASE ROLE SNOWFLAKE.CLASSIFICATION_ADMIN
  TO ROLE data_owner;

데이터 소유자로서 사용자 지정 분류기 인스턴스를 저장할 스키마를 만들어요:

USE ROLE data_owner;
CREATE SCHEMA data.classifiers;

CREATE CUSTOM_CLASSIFIER 명령을 사용하여 data.classifiers 스키마에 사용자 지정 분류기 인스턴스를 만들어요:

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

원하는 경우 검색 경로를 다음과 같이 업데이트할 수 있어요:

  • 클래스의 새 인스턴스를 만들 때 클래스의 정규화된 이름을 지정하지 않아도 되도록 SNOWFLAKE.DATA_PRIVACY를 추가해요.

  • 인스턴스에서 메서드를 호출하거나 인스턴스와 함께 명령을 사용할 때 인스턴스의 정규화된 이름을 지정하지 않아도 되도록 DATA.CLASSIFIERS를 추가해요.

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  |
+----------------------------------+---------------+---------------+-------------+-----------------+---------+-------------+

인스턴스에서 custom_classifier!ADD_REGEX 메서드를 호출하여 열의 내부 직원 ID를 식별하는 시스템 태그와 정규 표현식을 지정해요. 이 예시에서 값 정규 표현식은 여섯 자리 직원 ID와 일치해요. 열 이름 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와 같은 유효하지 않은 값은 반환되지 않습니다.

자세한 내용은 String functions (regular expressions)를 참조하세요.

인스턴스에 추가한 정규 표현식을 확인하려면 인스턴스에서 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 메서드를 호출하세요.

테이블을 분류하려면 SYSTEM$CLASSIFY_SCHEMA 저장 프로시저를 호출하세요.

인스턴스가 더 이상 필요하지 않으면 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%';

더 알아보기 (Learn more)