커스텀 분류기를 사용해서 커스텀 의미 범주를 구현해요
커스텀 분류기를 사용해서 커스텀 의미 범주를 구현해요
민감한 데이터 분류에는 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;
예시
사용자 지정 분류기로 데이터를 분류하는 대략적인 접근 방식은 다음과 같아요:
-
분류할 테이블을 식별해요.
-
SQL을 사용하여 다음 작업을 수행해요.
-
사용자 지정 분류기 인스턴스를 만들어요.
-
인스턴스에 사용자 지정 의미 범주와 정규 표현식을 추가해요.
-
테이블을 분류해요.
테이블을 분류하는 사용자 지정 분류기를 만들려면 다음 단계를 완료해요:
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%';