태그 기반 마스킹 정책

이 항목에서는 태그 기반 마스킹 정책에 대한 개념과 열 데이터 보호를 위한 태그 기반 마스킹 정책의 예를 제시합니다.

이 항목의 내용:

개요

태그 기반 마스킹 정책은 오브젝트 태깅과 마스킹 정책 기능을 결합하여 ALTER TAG 명령을 사용하여 태그에 대한 마스킹 정책을 설정할 수 있도록 합니다. 마스킹 정책 서명의 데이터 타입과 열의 데이터 타입이 일치하면 태그가 지정된 열이 마스킹 정책의 조건에 따라 자동으로 보호됩니다. 이에 따라 보호해야 하는 열 데이터는 데이터 보호를 위해 열에 수동으로 적용되는 마스킹 정책이 더 이상 필요하지 않으므로 데이터 보호 작업이 간소화됩니다. 열에 직접 할당된 마스킹 정책과 태그 기반 마스킹 정책으로 열을 보호할 수 있습니다. 열이 이 두 가지 마스킹 정책을 모두 참조하는 경우 열에 직접 할당된 마스킹 정책이 태그 기반 마스킹 정책보다 우선합니다.

태그는 Snowflake가 지원하는 각 데이터 타입 에 대해 한 가지 마스킹 정책을 지원할 수 있습니다. 초기 열 데이터 보호 작업을 단순화하려면 각 데이터 타입(예: STRING, NUMBER, TIMESTAMP_LTZ)에 대해 권한 있는 역할은 원시 데이터를 보고 권한 없는 역할은 마스킹된 상태의 고정된 값을 볼 수 있도록 허용하는 일반 마스킹 정책을 만드십시오.

정책 관리자, 태그 관리자, 데이터 관리자의 결정에 따라 태그에 할당된 정책을 기준으로 열 데이터를 보호하거나 열에 할당된 태그의 태그 문자열 값을 기준으로 열 데이터를 보호하도록 마스킹 정책 조건을 작성할 수 있습니다.

태그 기반 마스킹 정책의 예는 이 항목의 태그 기반 마스킹 정책 사용하기 를 참조하십시오.

이점

사용 편의성

태그에 하나 이상의 마스킹 정책을 간단히 할당할 수 있습니다. 정책 관리자는 기존 워크플로를 중단하지 않고 정책을 추가하거나 바꿀 수 있습니다.

확장성

태그 기반 정책의 경우 정책 관리자가 한 번만 정책을 작성해 태그에 할당하면 태그가 설정된 수준 에 따라 많은 오브젝트에 정책을 적용할 수 있습니다. 따라서 새 열이 생성되거나 바뀔 때마다 단일 정책을 단일 열에 수동으로 할당하는 번거로움이 대폭 감소합니다.

포괄성

정책 관리자는 각 데이터 타입에 대한 정책을 만들고 이러한 정책을 전부 단일 태그에 할당할 수 있습니다. 테이블 수준에서 태그가 적용된 후 열 데이터 타입이 정책에 지정된 데이터 타입과 일치하는 경우 테이블의 모든 열이 보호됩니다.

향후의 오브젝트 보호

테이블에 태그 기반 마스킹 정책을 할당하면 마스킹 정책이 모든 새 테이블 열에 자동으로 적용됩니다. 이 동작은 향후 권한 부여 와 유사합니다.

유연성

태그 기반 마스킹 정책에서는 CREATE TABLE 문에서 마스킹 정책을 지정하는 대신 테이블 DDL 관리를 단순화하는 데 도움이 되는 대안을 제공합니다. 관리자는 테이블 생성 시에 마스킹 정책을 할당하거나 태그 계보 를 사용하는 태그에 정책을 할당하는 방법으로 마스킹 정책을 할당할 수 있습니다.

고려 사항

  • 태그가 마스킹 정책 및 테이블과는 다른 스키마에 저장되는 태그 기반 마스킹 정책의 경우, 마스킹 정책과 테이블을 포함하는 스키마를 복제하면 복제된 테이블이 복제된 스키마가 아닌 원본 스키마의 마스킹 정책으로 보호됩니다.

    하지만 태그, 마스킹 정책, 테이블이 모두 스키마에 존재하는 태그 기반 마스킹 정책의 경우, 스키마를 복제하면 원본 스키마가 아닌 복제된 스키마에서 테이블이 마스킹 정책으로 보호됩니다.

  • 복제와 태그 기반 마스킹 정책에 관해서는 정책 복제 고려 사항 을 참조하십시오.

  • Snowflake에서 안전하게 데이터 공유 및 이 기능에 대한 자세한 내용은 다음을 참조하십시오.

제한 사항

기존의 모든 마스킹 정책 제한 사항 이 태그 기반 마스킹 정책에 적용됩니다.

태그 기반 마스킹 정책을 사용할 때 다음의 추가 제한 사항에 유의하십시오.

데이터 타입

태그는 각 데이터 타입에 대해 한 가지 마스킹 정책을 지원할 수 있습니다. 예를 들어, 태그에 이미 NUMBER 데이터 타입에 대한 마스킹 정책이 있는 경우 NUMBER 데이터 타입을 사용하는 다른 마스킹 정책을 같은 태그에 할당할 수 없습니다.

시스템 태그

시스템 태그 에는 마스킹 정책을 할당할 수 없습니다.

오브젝트 삭제하기

태그에 마스킹 정책이 할당되면 마스킹 정책도, 태그도 삭제할 수 없습니다. 마찬가지로, 태그에 정책이 할당되면 해당 태그와 마스킹 정책이 포함된 상위 스키마와 데이터베이스도 삭제할 수 없습니다. 자세한 내용은 이 항목의 태그에 마스킹 정책 할당하기 섹션을 참조하십시오.

구체화된 뷰

기본 테이블이 태그 기반 마스킹 정책으로 보호되는 경우 구체화된 뷰를 만들 수 없습니다. 추가적인 세부 정보는 마스킹 정책 및 구체화된 뷰 를 참조하십시오.

구체화된 뷰가 있고 이후에 기본 테이블에 태그 기반 마스킹 정책이 추가되는 경우 구체화된 뷰를 쿼리할 수 없으며, 구체화된 뷰는 이제 무효화됩니다. 구체화된 뷰를 계속 사용하려면 태그 기반 마스킹 정책을 설정 해제하고 구체화된 뷰를 다시 만들거나 재개 한 다음에 쿼리하십시오.

행 액세스 정책

마스킹 정책 서명 또는 행 액세스 정책 서명에서 주어진 테이블 또는 뷰 열을 지정할 수 있습니다. 다시 말해, 마스킹 정책 서명과 행 액세스 정책 서명에 모두 동시에 같은 열을 지정할 수 없습니다.

조건 열

마스킹된 열은 마스킹 정책에서 조건 열로 사용할 수 없습니다.

매핑 테이블

태그 기반 마스킹 정책으로 보호되는 열이 포함된 테이블은 매핑 테이블로 사용할 수 없습니다.

가상 열

가상 열에 태그를 할당할 수는 있지만 태그 기반 마스킹 정책을 할당할 수는 없습니다. 태그 기반 정책이 가상 열에 할당된 경우 런타임에 열에 대한 쿼리가 실패합니다.

태그 기반 마스킹 정책 관리하기

마스킹 정책과 태그에 대한 기존 권한은 마스킹 정책과 태그를 관리하는 DDL과 함께 태그 기반 마스킹 정책에 적용됩니다.

하지만 정책과 태그가 같은 상위 데이터베이스/스키마에 있을 때는 APPLY MASKING POLICY 권한, ALTER TAG 명령, DROP/REPLACE 작업에 대한 추가 업데이트가 있습니다.

권한

전역 APPLY MASKING POLICY 권한이 있는 역할은 태그에 대한 마스킹 정책을 할당하고 바꿀 수 있습니다.

예를 들어, TAG_ADMIN 사용자 지정 역할에 전역 APPLY MASKING POLICY 권한을 부여하는 방법은 다음과 같습니다.

use role securityadmin;

grant apply masking policy on account to role tag_admin;

태그에 마스킹 정책 할당하기

ALTER TAG 명령을 사용하여 태그에 대한 마스킹 정책을 설정하거나 태그에서 마스킹 정책을 설정 해제합니다. ALTER TAG 명령의 구문을 사용하면 단일 문에서 태그에 여러 마스킹 정책을 할당할 수 있습니다.

ALTER TAG <tag_name> SET MASKING POLICY <masking_policy_name> [ , MASKING POLICY <masking_policy_2_name> , ... ]

ALTER TAG <tag_name> UNSET MASKING POLICY <masking_policy_name> [ , MASKING POLICY <masking_policy_2_name> , ... ]

예를 들어, 다음과 같이 ssn_mask 라는 마스킹 정책을 security 라는 태그에 할당할 수 있습니다.

-- set
alter tag security set masking policy ssn_mask;

-- unset

alter tag security unset masking policy ssn_mask;

ALTER TAG 사용법 노트 외에도, 다음 사항에 유의하십시오.

  • 한 태그에는 데이터 타입당 마스킹 정책이 하나만 있을 수 있습니다. 예를 들어, STRING 데이터 타입에 대한 정책 한 개, NUMBER 데이터 타입에 대한 정책 한 개 등이 있을 수 있습니다.

  • 마스킹 정책이 열을 이미 보호하고 마스킹 정책이 적용된 태그가 같은 열에 설정된 경우, 열에 직접 할당된 마스킹 정책이 태그에 할당된 마스킹 정책보다 우선합니다.

  • 태그가 마스킹 정책에 할당된 경우에는 태그를 삭제 할 수 없습니다.

  • 마스킹 정책이 태그에 할당된 경우에는 마스킹 정책을 삭제 할 수 없습니다.

마스킹 정책 및 태그 관리에 대한 자세한 내용은 다음을 참조하십시오.

태그의 마스킹 정책 바꾸기

태그에 마스킹 정책을 설정한 후 태그에 대한 마스킹 정책을 다른 마스킹 정책으로 바꾸는 두 가지 경로가 있습니다.

ALTER TAG 문은 마스킹 정책 이름을 지정해야 합니다.

  • 한 문의 태그에서 정책을 설정 해제한 다음, 다른 문의 태그에 대해 새 정책을 설정합니다.

    alter tag security unset masking policy ssn_mask;
    
    alter tag security set masking policy ssn_mask_2;
    
  • 단일 문에서 FORCE 키워드를 사용해 정책을 바꿉니다.

    데이터 타입 이 같은 정책이 태그에 이미 설정된 경우 FORCE 키워드를 사용하면 정책이 바뀝니다.

    alter tag security set masking policy ssn_mask_2 force;
    

    중요

    태그에 대한 마스킹 정책을 바꿀 때는 주의하십시오.

    바꾸는 시점과 열에 대한 쿼리에 따라 두 개의 개별 문에서 정책을 바꾸도록 선택하면 UNSET 작업과 SET 작업 사이의 시간 간격에서 열 데이터가 보호되지 않으므로 데이터 누수로 이어질 수 있습니다.

    하지만 대체 정책에서 정책 조건이 다른 경우 FORCE 키워드를 지정하면 (이전에는) 사용자가 데이터에 액세스할 수 있었고 정책을 바꾸면 더 이상 액세스할 수 없으므로 액세스 권한 부족으로 이어질 수 있습니다.

    정책을 바꾸기 전에 내부 데이터 관리자와 상의하여 태그 기반 마스킹 정책으로 데이터를 보호하고 필요에 따라 마스킹 정책을 바꾸기 위한 최선의 접근 방식을 조정합니다.

상위 데이터베이스 및 스키마

2022_07 동작 변경 번들을 사용하면 다음과 같은 경우에 데이터베이스와 스키마에서 DROP 및 REPLACE 작업을 수행할 수 없습니다.

  • 태그 및 마스킹 정책이 같은 스키마에 있을 때.

  • 테이블 또는 뷰가 다른 스키마에 있을 때.

  • 테이블 또는 뷰의 보호된 열이 마스킹 정책과 태그를 포함하는 스키마와는 다른 스키마에 존재합니다.

번들을 사용하면 다음 네 가지 명령에 영향을 미칩니다.

  • DROP DATABASE

  • DROP SCHEMA

  • CREATE OR REPLACE DATABASE

  • CREATE OR REPLACE SCHEMA

자세한 내용은 공지 를 참조하십시오.

조건 인자

조건 마스킹 정책 을 태그에 할당할 수 있습니다. 열에 태그를 할당한 후, 인자의 데이터 타입이 열의 데이터 타입과 일치하는 경우 조건 인자는 이름을 기준으로 테이블의 열에 매핑됩니다.

다음 경우에는 조건 마스킹 정책이 열에 할당되면 쿼리가 실패합니다.

  • 테이블에 정책의 조건 인자와 이름이 같은 열이 없는 경우.

  • 테이블에 정책의 조건 인자 이름과 일치하는 열은 있지만 데이터 타입이 일치하지 않는 경우.

이러한 오류에 대한 자세한 내용은 이 항목의 태그 기반 마스킹 정책 문제 해결하기 를 참조하십시오.

태그 계보

마스킹 정책이 있는 태그를 모든 기본 테이블 오브젝트에 할당하거나 태그를 기본 테이블의 열에 할당할 수 있습니다. 태그 기반 마스킹 정책이 기본 테이블에 할당되면 열 데이터 타입이 마스킹 정책 서명의 데이터 타입과 일치하는 경우 열이 정책으로 보호됩니다.

마스킹 정책이 기본 테이블 열을 보호하므로, 테이블과 뷰를 사용하는 마스킹 정책에 관한 현재의 제한 사항, 고려 사항, 동작 을 기반으로 기본 테이블 열에서 파생된 뷰 열도 보호됩니다.

태그 기반 마스킹 정책 사용하기

아래의 하위 섹션에서는 다음 정보를 제공합니다.

  • 데이터 보호와 유효성 검사를 위해 태그 기반 마스킹 정책과 함께 사용할 일반적인 절차.

  • 태그 기반 마스킹 정책을 구현하기 전에 완료해야 할 필수 단계.

  • 예제에 대한 공통적인 가정 사항의 목록.

  • 다음 시스템 함수의 사용을 포함한 태그 기반 마스킹 정책 사용법의 대표적인 예:

태그 및 정책 검색

Information Schema 테이블 함수 POLICY_REFERENCES 및 Account Usage POLICY_REFERENCES 뷰는 다음 열을 확인함으로써 마스킹 정책과 태그가 서로 참조하는지 여부를 확인하는 데 도움이 될 수 있습니다.

  • TAG_DATABASE

  • TAG_SCHEMA

  • TAG_NAME

  • POLICY_STATUS

POLICY_STATUS 열에는 다음과 같은 네 가지 값이 있을 수 있습니다.

ACTIVE

태그에 의해 열(즉, REF_COLUMN_NAME)이 단일 정책에만 연결되도록 지정합니다.

MULTIPLE_MASKING_POLICY_ASSIGNED_TO_THE_COLUMN

여러 마스킹 정책이 동일한 열에 할당되도록 지정합니다.

COLUMN_IS_MISSING_FOR_SECONDARY_ARG

정책(즉, POLICY_NAME)이 조건부 마스킹 정책이고 테이블(즉, REF_ENTITY_NAME)에 동일한 이름의 열이 없음을 지정합니다.

COLUMN_DATATYPE_MISMATCH_FOR_SECONDARY_ARG

정책이 조건부 마스킹 정책이고 테이블에 마스킹 정책 서명의 데이터 타입과 이름은 같지만 데이터 타입이 다른 열이 있음을 지정합니다.

POLICY_STATUS 열에 가능한 값이 있는 관련 오류 메시지에 대한 자세한 내용은 이 항목의 태그 기반 마스킹 정책 문제 해결하기 를 참조하십시오.

데이터 보호 및 유효성 검사 단계

일반적으로, 태그 기반 마스킹 정책을 사용할 때는 다음 접근 방식에 따르는 것이 좋습니다.

  1. 태그 기반 마스킹 정책에 필요한 모든 태그를 만듭니다.

  2. 태그 기반 마스킹 정책으로 보호하려는 테이블 열을 기반으로 데이터 타입마다 마스킹 정책을 하나씩 만듭니다.

  3. 태그에 마스킹 정책을 할당합니다.

  4. 마스킹 정책이 있는 태그를 테이블 열에 직접 할당하거나 테이블에 할당합니다.

  5. Information Schema를 검사해 태그 기반 정책이 열에 할당되었는지 확인합니다.

  6. 데이터를 쿼리해 의도한 대로 태그 기반 마스킹 정책이 데이터를 보호하는지 확인합니다.

필수 단계

  1. Snowflake 계정에서 기존 태그와 태그의 문자열 값을 식별합니다.

    • Account Usage TAG REFERENCES 뷰를 쿼리하여 모든 태그와 그에 할당된 문자열 값을 가져옵니다.

    • 선택 사항:

      • Account Usage TAGS 뷰(즉, 태그 카탈로그)를 쿼리하여 태그 목록을 가져와 이후에 태그 기반 마스킹 정책을 사용하는 동안 중복된 태그 이름이 지정되지 않도록 합니다.

      • TAG_REFERENCES 및 TAGS 쿼리의 출력을 비교하여 나중에 사용할 수 있는 미할당 태그가 있는지 확인합니다.

      • CREATE TAG 명령을 사용하여 나중에 필요할 태그를 만듭니다. 그렇지 않으면 필요에 따라 태그를 만드십시오.

  2. Snowflake 계정의 기존 정책과 정책 정의를 식별합니다.

    • SHOW MASKING POLICIES 명령을 실행하여 기존 마스킹 정책 목록을 가져옵니다.

    • 이러한 정책을 현재 양식 그대로 태그에 할당할 수 있는지 결정합니다. 필요한 경우 DESCRIBE MASKING POLICY 명령을 실행하여 정책 정의를 가져오십시오. 그렇지 않으면 태그에 할당할 새 정책을 만들 계획을 세우십시오.

  3. 정책 조건이 테이블 열에 설정된 태그 문자열 값을 평가해야 할지 여부의 측면에서 마스킹 정책으로 열 데이터를 보호하는 방법을 결정합니다.

예제에서 일반적으로 가정하는 사항

예제에서는 다음과 같이 가정합니다.

  • 필수 단계가 완료되었습니다.

  • tag_admin 사용자 지정 역할에 다음과 같은 권한이 있습니다.

    • 스키마 수준 CREATE TAG 권한.

    • 전역 APPLY TAG 권한.

    자세한 내용은 태그 권한 을 참조하십시오.

  • masking_admin 사용자 지정 역할에 다음과 같은 권한이 있습니다.

    • 스키마 수준 CREATE MASKING POLICY 권한.

    • governance 데이터베이스와 governance.masking_policies 스키마에 대한 USAGE 권한.

    • 태그에 마스킹 정책을 할당하는 전역 APPLY MASKING POLICY 권한(이 항목의 권한 참조).

    • 오브젝트에 태그(마스킹 정책 포함)를 할당하는 전역 APPLY TAG 권한.

    자세한 내용은 태그 권한 을 참조하십시오.

  • row_access_admin 사용자 지정 역할에 다음과 같은 권한이 있습니다.

    • 스키마 수준 CREATE ROW ACCESS POLICY 권한.

    • governance 데이터베이스와 governance.row_access_policies 스키마에 대한 USAGE 권한.

    • 전역 APPLY ROW ACCESS POLICY 권한.

    자세한 내용은 행 액세스 정책 권한 을 참조하십시오.

  • accounting_admin 사용자 지정 역할에 다음과 같은 권한이 있습니다.

    • finance 데이터베이스와 finance.accounting 스키마에 대한 USAGE 권한.

    • finance.accounting 스키마의 테이블에 대한 SELECT 권한.

  • analyst 사용자 지정 역할에 다음과 같은 권한이 있습니다.

    • finance 데이터베이스와 finance.accounting 스키마에 대한 USAGE 권한.

    • finance.accounting.name_number 테이블에 대한 SELECT 권한.

  • 위에 설명된 사용자 지정 역할이 알맞은 사용자에게 부여됩니다.

    자세한 내용은 액세스 제어 구성하기 섹션을 참조하십시오.

예 1: 태그에 직접 할당된 마스킹 정책을 기반으로 열 데이터 보호하기

이 예에서는 두 가지 마스킹 정책을 태그에 할당한 다음 이 태그를 테이블에 할당합니다. 그 결과, 두 마스킹 정책은 데이터 타입이 정책의 데이터 타입과 일치하는 모든 테이블 열을 보호하게 됩니다.

다음 단계에서는 회계 데이터를 마스킹하는 태그 기반 마스킹 정책을 만듭니다. 예를 들어, 두 개의 열 ACCOUNT_NAMEACCOUNT_NUMBER 가 있는 finance.accounting.name_number 라는 테이블을 생각해 보십시오. 이러한 열의 데이터 타입은 각각 STRING과 NUMBER입니다.

---------------+----------------+
  ACCOUNT_NAME | ACCOUNT_NUMBER |
---------------+----------------+
  ACME         | 1000           |
---------------+----------------+

다음과 같이 ACCOUNT_NAMEACCOUNT_NUMBER 열을 보호하는 태그 기반 마스킹 정책을 만듭니다.

  1. governance.tags 라는 스키마에 accounting 이라는 태그를 만듭니다.

    use role tag_admin;
    use schema governance.tags;
    create or replace tag accounting;
    
  2. ACCOUNT_NAME 및 ACCOUNT_NUMBER 열을 보호하는 다른 마스킹 정책을 만듭니다. 이러한 각각의 정책에서는 ACCOUNTING_ADMIN 사용자 지정 역할만 원시 데이터를 볼 수 있습니다.

    계좌명 정책:

    use role masking_admin;
    use schema governance.masking_policies;
    
    create or replace masking policy account_name_mask as (val string) returns string ->
      case
        when current_role() in ('ACCOUNTING_ADMIN') then val
        else '***MASKED***'
      end;
    

    계좌 번호 정책:

    create or replace masking policy account_number_mask as (val number) returns number ->
      case
        when current_role() in ('ACCOUNTING_ADMIN') then val
        else -1
      end;
    
  3. 두 마스킹 정책을 모두 accounting 태그에 할당합니다. 두 정책 모두 단일 문으로 태그에 할당할 수 있습니다.

    alter tag governance.tags.accounting set
      masking policy account_name_mask,
      masking policy account_number_mask;
    
  4. finance.accounting.name_number 테이블에 accounting 태그를 할당합니다.

    alter table finance.accounting.name_number set tag governance.tags.accounting = 'tag-based policies';
    
  5. Information Schema POLICY_REFERENCES 테이블 함수를 호출하여 ACCOUNT_NAMEACCOUNT_NUMBER 테이블 열이 태그 기반 마스킹 정책으로 보호되는지 확인합니다.

    보호되는 각 열에 대해, 쿼리 결과의 행은 열 이름, 정책 이름, 태그 이름에 적절한 값을 지정해야 합니다.

    use role masking_admin;
    select *
    from table (governance.information_schema.POLICY_REFERENCES(
      REF_ENTITY_DOMAIN => 'TABLE',
      REF_ENTITY_NAME => 'governance.accounting.name_number' )
    );
    

    반환 결과(업데이트된 열 참조):

    -------------+------------------+---------------------+----------------+-------------------+-----------------+-----------------+-------------------+-----------------+----------------------+--------------+------------+------------+---------------+
      POLICY_DB  | POLICY_SCHEMA    | POLICY_NAME         | POLICY_KIND    | REF_DATABASE_NAME | REF_SCHEMA_NAME | REF_ENTITY_NAME | REF_ENTITY_DOMAIN | REF_COLUMN_NAME | REF_ARG_COLUMN_NAMES | TAG_DATABASE | TAG_SCHEMA | TAG_NAME   | POLICY_STATUS |
    -------------+------------------+---------------------+----------------+-------------------+-----------------+-----------------+-------------------+-----------------+----------------------+--------------+------------+------------+---------------+
      GOVERNANCE | MASKING_POLICIES | ACCOUNT_NAME_MASK   | MASKING_POLICY | FINANCE           | ACCOUNTING      | NAME_NUMBER     | TABLE             | ACCOUNT_NAME    | NULL                 | GOVERNANCE   | TAGS       | ACCOUNTING | ACTIVE        |
      GOVERNANCE | MASKING_POLICIES | ACCOUNT_NUMBER_MASK | MASKING_POLICY | FINANCE           | ACCOUNTING      | NAME_NUMBER     | TABLE             | ACCOUNT_NUMBER  | NULL                 | GOVERNANCE   | TAGS       | ACCOUNTING | ACTIVE        |
    -------------+------------------+---------------------+----------------+-------------------+-----------------+-----------------+-------------------+-----------------+----------------------+--------------+------------+------------+---------------+
    
  6. 권한 있는 역할과 권한 없는 역할로 테이블 열을 쿼리하여 Snowflake가 올바른 쿼리 결과를 반환하도록 보장합니다.

    권한 있는 역할:

    use role accounting_admin;
    select * from finance.accounting.name_number;
    

    반환 결과:

    ---------------+----------------+
      ACCOUNT_NAME | ACCOUNT_NUMBER |
    ---------------+----------------+
      ACME         | 1000           |
    ---------------+----------------+
    

    권한 없는 역할:

    use role analyst;
    select* from finance.accounting.name_number;
    

    반환 결과:

    ---------------+----------------+
      ACCOUNT_NAME | ACCOUNT_NUMBER |
    ---------------+----------------+
      ***MASKED*** | -1             |
    ---------------+----------------+
    

예 2: 열 태그 문자열 값을 기반으로 열 데이터 보호하기

이 예에서는 태그 기반 마스킹 정책을 사용하여 열에 할당된 태그의 태그 문자열 값을 기반으로 데이터를 마스킹해야 할지 여부를 결정합니다. 이 마스킹 정책은 SYSTEM$GET_TAG_ON_CURRENT_COLUMN 함수를 마스킹 정책 조건으로 호출하고 태그 문자열 값과 일치하도록 마스킹 정책 조건을 작성함으로써 태그 문자열 값을 동적으로 평가합니다.

다음 단계에서는 회계 데이터를 마스킹하는 태그 기반 마스킹 정책을 만듭니다. 간결성을 위해, 테이블 열에는 각각 STRING과 NUMBER의 두 가지 데이터 타입이 있습니다. 예를 들어 finance.accounting.name_number 라는 테이블은 다음과 같습니다.

---------------+----------------+
  ACCOUNT_NAME | ACCOUNT_NUMBER |
---------------+----------------+
  ACME         | 1000           |
---------------+----------------+

다음과 같이 ACCOUNT_NAMEACCOUNT_NUMBER 열을 보호하는 태그 기반 마스킹 정책을 만듭니다.

  1. governance.tags 라는 스키마에 accounting_col_string 이라는 태그를 만듭니다.

    use role tag_admin;
    use schema governance.tags;
    create tag accounting_col_string;
    
  2. ACCOUNT_NAME 및 ACCOUNT_NUMBER 열을 보호하는 다른 마스킹 정책을 만듭니다. 이러한 각각의 정책에서 열의 현재 태그 문자열 값이 'visible' 로 설정된 경우에만 원시 데이터가 표시됩니다.

    계좌명 정책:

    use role masking_admin;
    use schema governance.masking_policies;
    
    create masking policy account_name_mask_tag_string as (val string) returns string ->
      case
        when system$get_tag_on_current_column('tags.accounting_col_string') = 'visible' then val
        else '***MASKED***'
      end;
    

    계좌 번호 정책:

    create masking policy account_number_mask_tag_string as (val number) returns number ->
      case
        when system$get_tag_on_current_column('tags.accounting_col_string') = 'visible' then val
        else -1
      end;
    

    참고

    tags 스키마와 masking_policies 스키마가 모두 governance 데이터베이스에 존재하므로 이러한 정책에서는 함수 인자에 schema_name.tag_name 오브젝트 이름 형식을 사용합니다. 또는 함수 인자에서 태그의 정규화된 이름을 사용할 수도 있습니다.

    정책 조건의 시스템 함수 인자에 충분히 정규화되지 않은 태그 이름이 포함된 경우 Snowflake는 태그 기반 마스킹 정책으로 보호되는 열에서 쿼리 런타임에 오류를 반환합니다. 예를 들어 이 인자는 스키마 이름이나 데이터베이스 이름을 지정하지 않고 태그 이름을 accounting_col_string 으로만 사용합니다.

    자세한 내용은 오브젝트 이름 확인 섹션을 참조하십시오.

  3. 두 마스킹 정책을 모두 accounting_col_string 태그에 할당합니다. 두 정책 모두 단일 문으로 태그에 할당할 수 있습니다.

    alter tag accounting_col_string set
      masking policy account_name_mask_tag_string,
      masking policy account_number_mask_tag_string;
    
  4. 각 테이블 열에 accounting_col_string 태그를 할당합니다. 이 예에서 ACCOUNT_NAME 열의 태그 문자열 값은 'visible' 이지만, ACCOUNT_NUMBER 열의 태그 문자열 값은 'protect' 로 설정됩니다.

    alter table finance.accounting.name_number modify column
      account_name set tag governance.tags.accounting_col_string = 'visible',
      account_number set tag governance.tags.accounting_col_string = 'protect';
    
  5. Information Schema POLICY_REFERENCES 테이블 함수를 호출하여 ACCOUNT_NAMEACCOUNT_NUMBER 테이블 열이 태그 기반 마스킹 정책으로 보호되는지 확인합니다.

    보호되는 각 열에 대해, 쿼리 결과의 행은 열 이름, 정책 이름, 태그 이름에 적절한 값을 지정해야 합니다.

    select *
    from table (governance.information_schema.policy_references(
      ref_entity_domain => 'TABLE',
      ref_entity_name => 'finance.accounting.name_number' )
    );
    

    반환 결과(업데이트된 열 참조):

    ------------+----------------+--------------------------------+----------------+-------------------+-----------------+-----------------+-------------------+-----------------+----------------------+--------------+------------+-----------------------+---------------+
     POLICY_DB  | POLICY_SCHEMA  | POLICY_NAME                    |  POLICY_KIND   | REF_DATABASE_NAME | REF_SCHEMA_NAME | REF_ENTITY_NAME | REF_ENTITY_DOMAIN | REF_COLUMN_NAME | REF_ARG_COLUMN_NAMES | TAG_DATABASE | TAG_SCHEMA | TAG_NAME              | POLICY_STATUS |
    ------------+----------------+--------------------------------+----------------+-------------------+-----------------+-----------------+-------------------+-----------------+----------------------+--------------+------------+-----------------------+---------------+
     GOVERNANCE | MASKING_POLICY | ACCOUNT_NAME_MASK_TAG_STRING   | MASKING_POLICY | FINANCE           | ACCOUNTING      | NAME_NUMBER     | TABLE             | ACCOUNT_NAME    | NULL                 | GOVERNANCE   | TAGS       | ACCOUNTING_COL_STRING | ACTIVE        |
     GOVERNANCE | MASKING_POLICY | ACCOUNT_NUMBER_MASK_TAG_STRING | MASKING_POLICY | FINANCE           | ACCOUNTING      | NAME_NUMBER     | TABLE             | ACCOUNT_NUMBER  | NULL                 | GOVERNANCE   | TAGS       | ACCOUNTING_COL_STRING | ACTIVE        |
    ------------+----------------+--------------------------------+----------------+-------------------+-----------------+-----------------+-------------------+-----------------+----------------------+--------------+------------+-----------------------+---------------+
    
  6. Snowflake가 ACCOUNT_NUMBER 열의 값만 마스킹해야 하는 올바른 쿼리 결과를 반환하도록 테이블 열을 쿼리합니다.

    use role accounting_admin;
    select * from finance.accounting.name_number;
    

    반환 결과:

    ---------------+----------------+
      ACCOUNT_NAME | ACCOUNT_NUMBER |
    ---------------+----------------+
      ACME         | -1             |
    ---------------+----------------+
    

예 3: 테이블 태그 문자열 값을 기반으로 테이블 보호하기

이 예에서는 테이블에 할당된 태그 문자열 값을 기반으로 테이블을 보호하는 행 액세스 정책과 테이블의 열을 보호하는 태그 기반 마스킹 정책을 사용합니다. 단순화를 위해, 이 예에서는 태그를 한 개 사용하며 그 태그에 마스킹 정책을 할당한 후 테이블에 태그를 할당합니다. 이 테이블의 열에는 태그 계보 때문에 자동으로 동일한 태그와 해당 태그의 문자열 값을 갖게 됩니다.

행 액세스 정책은 행 액세스 정책 조건에서 SYSTEM$GET_TAG_ON_CURRENT_TABLE 함수를 호출하여 테이블에 할당된 태그의 태그 문자열 값을 동적으로 평가합니다. 이전의 예와 마찬가지로, 마스킹 정책 조건은 SYSTEM$GET_TAG_ON_CURRENT_COLUMN 함수를 호출하여 테이블 열의 태그 문자열 값을 평가합니다.

중요

이 태그에는 행 액세스 정책을 할당할 수 없습니다.

그 대신, ALTER TABLE 명령을 사용하여 테이블에 행 액세스 정책을 직접 할당하십시오.

테이블 finance.accounting.name_number 에는 다음과 같이 데이터 타입이 STRING과 NUMBER인 두 개의 열이 있습니다.

---------------+----------------+
  ACCOUNT_NAME | ACCOUNT_NUMBER |
---------------+----------------+
  ACME         | 1000           |
---------------+----------------+

다음과 같이 행 액세스 정책과 태그 기반 마스킹 정책으로 테이블과 테이블의 열을 보호합니다.

  1. 정책 조건에서 SYSTEM$GET_TAG_ON_CURRENT_TABLE 함수를 호출하는 행 액세스 정책을 만듭니다.

    use role row_access_admin;
    use schema governance.row_access_policies;
    
    create row access policy rap_tag_value as (account_number number)
    returns boolean ->
    system$get_tag_on_current_table('tags.accounting_row_string') = 'visible'
    AND
    'accounting_admin' = current_role();
    

    이 정책에서는 'visible' 이라는 문자열 값을 가진 테이블에 accounting_row_string 태그가 할당되고 테이블이나 테이블의 열에 대한 쿼리를 실행하는 역할이 accounting_admin 사용자 지정 역할일 때만 Snowflake가 쿼리 결과의 행을 반환하도록 지정합니다.

    다음 중 하나라도 해당되는 사항이 있으면 Snowflake에서는 쿼리 결과에 행을 반환하지 않습니다.

    • accounting_row_string 태그가 테이블에 설정되어 있지 않습니다.

    • accounting_row_string 태그가 테이블에 설정되지만 다른 문자열 값으로 설정됩니다.

    • 테이블 또는 테이블의 열에 대한 쿼리를 실행하는 역할이 accounting_admin 사용자 지정 역할이 아닙니다.

  2. 테이블에 행 액세스 정책을 할당합니다.

    alter table finance.accounting.name_number
      add row access policy rap_tag_value on (account_number);
    

    절차 진행 중 이 시점에서는 accounting_row_string 태그가 테이블에 할당되지 않으므로 테이블에 대한 쿼리에서 Snowflake의 어떤 역할에 대한 쿼리 결과에 어떤 행도 반환해서는 안 됩니다. 따라서 테이블에 대한 쿼리의 예상 결과는 다음과 같습니다.

    use role accounting_admin;
    select * from finance.accounting.name_number;
    

    반환 결과:

    ---------------+----------------+
      ACCOUNT_NAME | ACCOUNT_NUMBER |
    ---------------+----------------+
                   |                |
    ---------------+----------------+
    

    테이블에 태그 기반 마스킹 정책을 할당하기 전에 테이블에 행 액세스 정책을 할당하도록 선택하면 테이블 데이터가 전부 최대한 일찍 보호됩니다.

  3. governance.tags 라는 스키마에 accounting_row_string 이라는 태그를 만듭니다.

    use role tag_admin;
    use schema governance.tags;
    create tag accounting_row_string;
    
  4. ACCOUNT_NAME 및 ACCOUNT_NUMBER 열을 보호하는 다른 마스킹 정책을 만듭니다. 이러한 각각의 정책에서 열의 현재 태그 문자열 값이 'visible' 로 설정된 경우에만 원시 데이터가 표시됩니다.

    계좌명 정책:

    use role masking_admin;
    use schema governance.masking_policies;
    
    create masking policy account_name_mask as (val string) returns string ->
      case
        when system$get_tag_on_current_column('tags.accounting_row_string') = 'visible' then val
        else '***MASKED***'
      end;
    

    계좌 번호 정책:

    create masking policy account_number_mask as (val number) returns number ->
      case
        when system$get_tag_on_current_column('tags.accounting_row_string') = 'visible' then val
        else -1
      end;
    
  5. 두 마스킹 정책을 모두 accounting_row_string 태그에 할당합니다. 두 정책 모두 단일 문으로 태그에 할당할 수 있습니다.

    alter tag governance.tags.accounting_row_string set
      masking policy account_name_mask,
      masking policy account_number_mask;
    
  6. 태그 문자열 값이 'visible' 인 테이블에 accounting_row_string 태그를 할당합니다.

    alter table finance.accounting.name_number set tag governance.tags.accounting_row_string = 'visible';
    

    이제 문자열 값이 visible 인 테이블에 태그가 할당되었으므로 accounting_admin 사용자 지정 역할만 테이블 데이터를 볼 수 있고, 다른 역할을 가진 사용자가 수행한 쿼리에서는 이 예의 앞부분에 표시된 것처럼 반환되는 행이 없어야 합니다. 다시 말해, 행 액세스 정책의 조건이 이제는 true로 평가됩니다.

    마찬가지로, 열이 태그 계보를 통해 태그와 태그의 문자열 값을 상속하므로 테이블 열에도 visible 태그의 태그 문자열 값이 있습니다. 그 결과, 다음과 같이 accounting_admin 사용자 지정 역할을 가진 사용자가 테이블을 쿼리할 때 Snowflake는 마스킹되지 않은 데이터를 반환합니다.

    use role accounting_admin;
    select * from finance.accounting.name_number;
    

    반환 결과:

    ---------------+----------------+
      ACCOUNT_NAME | ACCOUNT_NUMBER |
    ---------------+----------------+
      ACME         | 1000           |
    ---------------+----------------+
    
  7. 어느 한 열의 데이터를 마스킹하려면 그 열의 태그 문자열 값을 직접 업데이트하십시오. 예를 들어, ACCOUNT_NUMBER 열의 데이터를 마스킹하는 방법은 다음과 같습니다.

    alter table finance.accounting.name_number modify column
      account_number set tag governance.tags.accounting_row_string = 'protect';
    

    이제 accounting_admin 사용자 지정 역할을 가진 사용자가 테이블이나 ACCOUNT_NUMBER 열을 쿼리할 때 다음과 같이 Snowflake는 마스킹된 데이터를 반환합니다.

    use role accounting_admin;
    select * from finance.accounting.name_number;
    

    반환 결과:

    ---------------+----------------+
      ACCOUNT_NAME | ACCOUNT_NUMBER |
    ---------------+----------------+
      ACME         | -1             |
    ---------------+----------------+
    

태그 기반 마스킹 정책 문제 해결

다음 표에는 태그 기반 마스킹 정책을 사용할 때 Snowflake에서 반환할 수 있는 몇 가지 오류 메시지가 나와 있습니다.

동작

오류 메시지

문제 해결 조치

열을 쿼리할 수 없음: 정책이 너무 많음.

SQL execution error: Column <col_name> is mapped to multiple masking policies by tags.Please contact your local administrator to fix the issue.

주어진 열은 한 가지 마스킹 정책으로만 보호할 수 있습니다.

POLICY_REFERENCES 함수를 호출하여 열에 설정된 마스킹 정책을 식별합니다. 열이 한 가지 정책만으로 보호되도록 태그에서 마스킹 정책을 설정 해제하여 태그를 수정합니다.

열을 쿼리할 수 없음: 조건 열이 없음.

SQL execution error: Column <col_name> is mapped to a masking policy where the table doesnt have acolumn for a secondary argument name of the policy.Please contact your local administrator to fix the issue.

조건 인자 를 사용하는 마스킹 정책에는 같은 테이블 또는 뷰에 지정된 열이 전부 있어야 합니다. 다음 중 하나를 수행하여 열 데이터를 보호합니다.

  • 열에 다른 정책을 직접 할당합니다.

  • 태그에 다른 마스킹 정책을 할당 하여 태그를 수정합니다.

열과 정책의 데이터 타입이 일치하지 않아 열 데이터가 마스킹되지 않습니다.

SQL execution error: Column <col_name> is mapped to a masking policy where the table has a column with different data-type for a secondary argument name.Please contact your local administrator to fix the issue.

열 데이터를 마스킹하려면 열의 데이터 타입과 마스킹 정책 서명의 데이터 타입이 일치해야 합니다. 다음 중 하나를 수행하여 열 데이터를 보호합니다.

  • 열에 다른 정책을 직접 할당합니다.

  • 마스킹 정책의 데이터 타입과 열의 데이터 타입이 일치하도록 태그에 마스킹 정책을 할당 합니다.

맨 위로 이동