동적 데이터 마스킹은 쿼리 시간에 테이블 및 뷰 열에 있는 일반 텍스트 데이터를 선별적으로 마스킹하는 마스킹 정책을 사용하는 열 수준 보안 기능입니다.
External Tokenization을 사용하면 계정은 데이터를 토큰화한 후 Snowflake에 로드하고 쿼리 런타임 시에 데이터의 토큰화를 해제할 수 있습니다. 토큰화는 민감한 데이터의 암호를 해독할 수 없는 토큰으로 대체하여 해당 데이터를 제거하는 프로세스입니다. External Tokenization은 외부 함수 와 함께 마스킹 정책을 사용합니다.
Snowflake는 스키마 수준 오브젝트로 마스킹 정책을 지원하여 권한이 부여된 사용자가 쿼리 런타임 시에 민감한 데이터에 액세스하는 것을 허용하는 동시에 민감한 데이터를 무단 액세스로부터 보호합니다. 즉, Snowflake에서 민감한 데이터는 기존 테이블에서 수정되지 않습니다(즉, 정적 마스킹 없음). 대신, 사용자가 마스킹 정책이 적용되는 쿼리를 실행할 때 마스킹 정책 조건에 따라 권한이 없는 사용자가 마스킹된 데이터, 부분적으로 마스킹된 데이터, 난독화된 데이터 또는 토큰화된 데이터를 볼 수 있는지 여부가 결정됩니다. 마스킹 정책이 스키마 수준 오브젝트로 제공되므로 중앙 집중식, 분산형 또는 하이브리드 관리 방식을 유연하게 선택할 수 있습니다. 자세한 내용은 이 항목의 Column-level Security 관리하기 섹션을 참조하십시오.
마스킹 정책에는 이러한 조건이 충족될 때 쿼리 런타임 시에 데이터를 변환하는 조건 및 함수가 포함될 수 있습니다. 정책 기반 방식은 보안 팀이 민감한 데이터의 노출을 제한할 수 있는 정책을 정의할 수 있는 업무 분리를 지원하며, 일반적으로 기본 데이터에 대한 전체 액세스 권한이 있는 오브젝트 소유자(즉, 테이블 또는 뷰와 같은 오브젝트에 대한 OWNERSHIP 권한이 있는 역할)도 이러한 기능을 이용하는 것이 가능합니다.
예를 들어, 마스킹 정책 관리자는 분석가(즉, 사용자 지정 ANALYST 역할이 있는 사용자)가 전화번호의 마지막 4자리만 볼 수 있고 소셜 시큐리티 번호는 볼 수 없지만, 고객 지원 담당자(예: 사용자 지정 SUPPORT 역할이 있는 사용자)는 고객 확인 사용 사례에 대한 전체 전화번호 및 소셜 시큐리티 번호를 볼 수 있도록 마스킹 정책을 구현할 수 있습니다.
마스킹 정책은 단일 데이터 타입, 1개 이상의 조건, 1개 이상의 마스킹 함수로 구성됩니다.
사용자는 데이터 타입이 일치하는 1개 이상의 테이블/뷰 열에 마스킹 정책을 적용할 수 있습니다. 예를 들어, 이메일 주소에 대한 정책을 한 번 정의한 후 데이터베이스 및 스키마 전체에서 수천 개의 이메일 열에 적용하는 것이 가능합니다.
Snowflake는 보안 뷰 를 제공하여 민감한 데이터에 대한 액세스를 제한하지만, 보안 뷰에는 뷰의 수가 많고 각 뷰에서 파생된 비즈니스 인텔리전스(BI) 대시보드로 인해 관리 상의 문제가 있습니다. 마스킹 정책은 관리할 뷰와 대시보드가 폭발적으로 증가하는 것을 방지함으로써 이러한 관리 문제를 해결합니다.
마스킹 정책은 오브젝트 소유자와 정책 관리자의 역할을 분리하여 업무 분리(SoD)를 지원합니다. 보안 뷰는 SoD를 제공하지 않으므로 활용성이 매우 제한됩니다. 이러한 역할 분리로 인해 다음과 같은 기본 설정이 필요합니다.
오브젝트 소유자(즉, 오브젝트에 대한 OWNERSHIP 권한이 있는 역할)에는 마스킹 정책의 설정을 해제할 수 있는 권한이 없습니다.
Dynamic Data Masking 및 External Tokenization을 위한 마스킹 정책은 유의해야 할 한 가지 예외(External Tokenization을 위한 마스킹 정책의 경우 마스킹 정책 본문에 외부 함수 쓰기 를 사용해야 함)를 제외하고 구조와 형식이 동일합니다.
외부 토큰화의 경우 Snowflake에 데이터를 로드하기 전에 데이터를 토큰화하기 위해 서드 파티 토큰화 공급자가 필요하기 때문에 이러한 예외가 적용됩니다. 쿼리 런타임 시에 Snowflake는 외부 함수를 사용하여 토큰화 공급자를 대상으로 REST API 호출을 수행한 후, 토큰화 정책(Snowflake 외부에서 생성된)을 평가하여 마스킹 정책 조건에 따라 토큰화된 데이터 또는 토큰화가 해제된 데이터를 반환합니다. 지정된 쿼리에서 올바른 데이터가 반환될 수 있도록 하려면 Snowflake와 토큰화 공급자에서 역할이 매핑되어야 한다는 점에 유의하십시오.
그런 다음, ALTER MASKING POLICY 명령으로 마스킹 정책 정의를 업데이트할 수 있습니다. 마스킹 정책이 열에 설정된 경우 이 명령이 열에서 마스킹 정책을 설정 해제할 필요는 없습니다. 따라서 정책으로 보호되는 열은 정책 정의가 업데이트되는 동안 보호된 상태로 유지됩니다.
이 정책에서는 문자열 데이터가 포함된 열을 나타내는 단 하나의 인자 val 을 지정합니다. 이 정책은 한 번만 만들면 문자열 데이터가 포함된 모든 열에 적용할 수 있습니다. CURRENT_ROLE 이 PAYROLL 사용자 지정 역할인 사용자만 열 데이터를 볼 수 있습니다. 그렇지 않으면, Snowflake는 쿼리 결과에 고정된 마스킹된 값을 반환합니다.
이 정책에서는 두 개의 인자 email 및 visibility 를 지정하는데, 이들 인자는 열 이름입니다. 첫 번째 열은 항상 마스킹할 열을 지정합니다. 두 번째 열은 첫 번째 열을 마스킹할지 여부를 평가하는 조건부 열입니다. 여러 조건부 열을 지정할 수 있습니다. 이 정책에서는 CURRENT_ROLE 이 ADMIN 사용자 지정 역할인 사용자가 이메일 주소를 볼 수 있습니다. 이메일 주소에 가시성 열 값인 Public 도 있는 경우에는 이메일 주소가 쿼리 결과에 표시됩니다. 그렇지 않으면, Snowflake는 이메일 열에 대해 고정된 마스킹 값을 포함한 쿼리 결과를 반환합니다.
테이블 또는 뷰의 열 구조가 정책에 지정된 열과 일치하는 경우 이 정책을 여러 테이블과 뷰에 사용할 수 있습니다. 자세한 내용은 CREATE MASKING POLICY 섹션을 참조하십시오.
각각의 대표적인 예에 같은 오브젝트 타입이 사용되므로, 다음과 같은 것을 포함하여 정책의 전체 동작이 유사해야 합니다.
다음 예에서는 사용자 제출 쿼리 이후의 마스킹 정책(즉, sql_expression)이 비교의 한 쪽에만 적용(예: 이메일 열, 이메일 열과 비교되는 문자열 제외)되는 Snowflake 런타임 쿼리 재작성을 보여줍니다. 쿼리 결과는 사용자가 의도한 결과가 아닙니다. 비교의 한 쪽만 마스킹하는 것은 일반적인 안티 패턴입니다.
소스 열에 대한 마스킹 정책이 있는 소스 열의 값을 대상 열에 대한 마스킹 정책이 없는 대상 열로 삽입하는 경우에는 주의해야 합니다. 마스킹 정책은 소스 열에 설정되어 있으므로 마스킹되지 않은 열 데이터를 볼 수 있는 역할은 마스킹되지 않은 데이터를 다른 열에 삽입할 수 있습니다. 여기서, 테이블 또는 뷰에 대한 충분한 권한이 있는 역할은 값을 볼 수 있습니다.
소스 열에서 마스킹된 데이터를 보는 역할이 해당 값을 대상 열에 삽입하면, 삽입된 값은 마스킹된 상태를 유지됩니다. 마스킹 정책이 대상 열에 설정되지 않은 경우 테이블 또는 뷰에 대한 충분한 권한이 있는 사용자는 대상 열에서 마스킹된 값과 마스킹되지 않은 값의 조합을 볼 수 있습니다. 그러므로 가장 좋은 방법은 다음과 같습니다.
마스킹 정책을 열에 적용할 때 주의하십시오.
마스킹 정책이 있는 열을 사용하여 쿼리를 확인한 후 사용자가 테이블과 뷰를 사용할 수 있도록 설정하십시오.
정책 조건은 세션에서 사용자의 활성 기본 역할과 보조 역할을 직접 평가하거나, 매핑 테이블에서 활성 역할을 조회하거나, 정책 관리자가 정책을 작성하려는 방식에 따라 둘 다 수행할 수 있습니다. 정책에 매핑 테이블 조회가 포함된 경우 중앙 집중식 매핑 테이블을 생성하고 보호된 테이블과 동일한 데이터베이스에 매핑 테이블을 저장합니다. 이는 정책이 IS_DATABASE_ROLE_IN_SESSION 함수를 호출하는 경우 특히 중요합니다. 자세한 내용은 함수 사용법 노트 를 참조하십시오.
추가적으로 마스킹 정책 및 구체화된 뷰와 관련한 다음과 같은 두 가지 제한 사항이 있습니다.
기본 테이블에서 구체화된 뷰가 이미 생성된 경우에는 테이블 열에 마스킹 정책을 설정할 수 없습니다. 이러한 시도가 수행되는 경우 Snowflake는 다음 오류 메시지를 반환합니다.
SQL execution error: One or more materialized views exist on the table. number of mvs=<number>, table name=<table_name>.
Copy
마스킹 정책이 기본 테이블 열에 설정되고 구체화된 뷰가 해당 테이블에서 생성되는 경우, 구체화된 뷰에는 마스킹 정책으로 보호되지 않는 열만 포함됩니다. 마스킹 정책으로 보호되는 1개 이상의 열을 포함하는 시도가 발생하면 Snowflake는 다음 오류 메시지도 반환합니다.
Unsupported feature 'CREATE ON MASKING POLICY COLUMN'.
Copy
팁
기본 테이블의 열에 마스킹 정책을 설정하려면 기본 테이블에서 동적 테이블을 만드는 것이 좋습니다. 자세한 내용은 증분 새로 고침 관련 추가 제한 사항 섹션을 참조하십시오.
외부 테이블 VALUE 열은 기본적으로 자동으로 생성되므로 CREATE EXTERNAL TABLE 문으로 외부 테이블 생성 할 때 이 열에 마스킹 정책을 할당할 수 없습니다.
외부 테이블에서 ALTER TABLE … ALTER COLUMN 문을 실행하여 외부 테이블 VALUE 열에 마스킹 정책을 할당할 수 있습니다. VALUE 열을 보호하는 마스킹 정책의 데이터 타입은 VARIANT이어야 합니다.
ALTERTABLEt1MODIFYCOLUMNVALUESETMASKING POLICYp1;
Copy
다음과 같이 외부 테이블의 가상 열에 마스킹 정책을 할당할 수 있습니다.
외부 테이블의 VALUE 열을 보호하는 마스킹 정책에서 EXEMPT_OTHER_POLICIES 마스킹 정책 속성을 TRUE 로 설정합니다.
이 속성이 아직 설정되지 않은 경우 VALUE 열을 보호하는 마스킹 정책에 대해 CREATE OR REPLACE 문을 실행하고 EXEMPT_OTHER_POLICIES 속성을 지정하십시오. 가상 열은 VALUE 열을 보호하는 정책을 상속하며, 이 속성을 사용하면 가상 열에 대한 정책이 상속된 정책보다 우선할 수 있습니다. 자세한 내용은 CREATE MASKING POLICY 섹션을 참조하십시오.
ALTER TABLE 명령을 사용하여 가상 열에 다른 마스킹 정책을 할당합니다. 가상 열은 덜 민감하므로 이 정책은 VALUE 열의 정책보다 덜 엄격할 수 있습니다. 가상 열에는 VALUE 열보다 적은 양의 데이터가 포함되고 VALUE 열에는 외부 테이블의 각 행에 대한 모든 데이터가 포함됩니다.
가상 열을 보호하는 정책의 데이터 타입은 가상 열의 데이터 타입에 따라 다릅니다.
마스킹 정책의 조건부 열에 관해, 가상 열을 조건부 열 인자로 나열하여 첫 번째 열 인자를 마스킹하거나 토큰화해야 할지 여부를 결정할 수 있습니다. 하지만 가상 열을 마스킹하거나 토큰화할 첫 번째 열로 지정할 수 없습니다.
Snowflake는 마스킹 정책에서 외부 테이블을 조회 테이블(즉, 하위 쿼리)로 사용하는 기능을 지원하지 않습니다. 데이터베이스를 복제하는 동안 Snowflake는 마스킹 정책을 복제하지만 외부 테이블은 복제하지 않습니다. 그러므로 복제된 데이터베이스의 정책은 복제된 데이터베이스에 없는 테이블을 참조하게 됩니다.
외부 테이블의 데이터가 정책에 필요한 경우에는 마스킹 정책이 있는 데이터베이스 내의 전용 스키마로 외부 테이블 데이터를 이동한 후 복제 작업을 완료하는 것이 좋습니다. 마스킹 정책을 업데이트하여 정책이 복제된 데이터베이스의 테이블을 참조하도록 정규화된 테이블의 이름을 참조합니다.
CREATE TABLE … AS SELECT(CTAS) 문을 실행하면 문에 포함된 열에 마스킹 정책이 적용된 후에 새 테이블에 데이터가 채워집니다(즉, 해당 열 데이터가 새 테이블에서 마스킹됨). CTAS 문을 사용하여 생성된 테이블은 소스 오브젝트와 열 세트가 다를 수 있고 Snowflake는 새 테이블 열에 마스킹 정책을 암시적으로 적용할 수 없기 때문에 이러한 흐름이 준수됩니다.
마스킹되지 않은 데이터를 복사해야 하는 경우에는 보호된 데이터에 대한 권한이 있는 역할을 사용하여 CTAS 문을 실행합니다. 새 테이블을 생성한 후 새 테이블의 소유권을 다른 역할로 이전하고 마스킹 정책 관리자에게 새 테이블의 열에 마스킹 정책을 적용하도록 요청하십시오.
대표적인 사용 사례는 데이터 분석가가 실제 데이터를 볼 필요 없이 소셜 시큐리티 번호 열에 대한 COUNT 를 구하는 것입니다. 그러나 데이터 분석가가 SELECT 를 사용하여 마스킹된 테이블 열에 대한 쿼리를 실행하는 경우 쿼리는 고정 마스킹 값을 반환합니다. 현재 세션에서 PAYROLL 사용자 지정 역할이 있는 사용자는 마스킹되지 않은 데이터를 보고 다른 모든 사용자는 마스킹된 데이터를 봅니다.
테이블 또는 뷰 열의 데이터 타입 UDF와 마스킹 정책이 일치하도록 하는 것이 중요합니다. 데이터 타입이 VARIANT인 테이블 열과 UDF를 갖는 것과 같이 데이터 타입이 서로 다르고 마스킹 정책(정책 조건에 이 UDF가 있음)이 VARCHAR 데이터 타입을 반환하는 경우, Snowflake는 이 마스킹 정책이 테이블 열에 설정될 때 이 테이블 열에서 쿼리를 만들 경우 오류를 반환합니다.
테이블 열, UDF, 마스킹 정책의 데이터 타입을 일치시키는 대표적인 예는 CREATE MASKING POLICY 에서 JSON(베리언트)에서 JavaScript UDF 사용하기 예를 참조하십시오.
Dynamic Data Masking 및 External Tokenization 정책을 효과적으로 관리하기 위해서는, 열의 데이터를 마스킹하는 방식이 중앙 집중식 보안 방식, 분산형 방식 또는 이러한 각 두 방식의 하이브리드 방식을 따라야 하는지 고려하는 것이 좋습니다.
다음 테이블은 이러한 두 가지 방식 각각에 대한 몇 가지 고려 사항을 요약하여 제공합니다.
정책 동작
중앙 집중식 관리
하이브리드 관리
분산형 관리
정책 만들기
보안 담당자
보안 담당자
개별 팀
열에 정책 적용
보안 담당자
개별 팀
개별 팀
모범 사례로, Snowflake는 조직에서 모든 관련 이해 관계자를 소집하여 환경에서 Column-level Security를 구현하기 위한 최상의 관리 방식을 결정하는 것을 권장합니다.
마스킹 정책에 대한 모든 권한을 부여합니다. 마스킹 정책의 대부분 속성을 변경하려면 필요합니다. 특정 오브젝트에 대해 한 번에 단 하나의 역할만 이 권한을 보유할 수 있습니다.
참고
또한, 마스킹 정책 관련 작업을 수행하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한도 필요합니다.
다음 예에서는 권한 부여가 다른 관리 방식에 적용되는 방법을 보여줍니다. 역할에 APPLY 권한을 부여한 후 ALTER TABLE … ALTER COLUMN 문을 사용하여 테이블 열에 마스킹 정책을 설정하거나 ALTER VIEW 문을 사용하여 뷰 열에 설정할 수 있습니다(마스킹 정책에 대한 APPLY 권한이 있는 역할의 구성원이 이 작업을 수행).
중앙 집중식 관리
중앙 집중식 관리 방식에서는 보안 담당자 사용자 지정 역할(예: security_officer)만 마스킹 정책을 생성하고 테이블 또는 뷰의 열에 적용할 수 있습니다. 이 방식은 마스킹 정책 관리 및 민감한 데이터의 마스킹 측면에서 가장 우수한 일관성을 제공할 수 있습니다.
-- create a security_officer custom roleUSEROLEACCOUNTADMIN;CREATEROLEsecurity_officer;-- grant CREATE AND APPLY masking policy privileges to the SECURITY_OFFICER custom role.GRANTCREATEMASKING POLICYONSCHEMAmydb.myschTOROLEsecurity_officer;GRANTAPPLYMASKING POLICYONACCOUNTTOROLEsecurity_officer;
Copy
여기서:
schema_name
스키마에 대한 식별자를 지정하며, 이는 스키마가 생성된 데이터베이스에 대해 고유한 식별자여야 합니다.
또한, 식별자는 알파벳 문자로 시작해야 하며 전체 식별자 문자열을 큰따옴표(예: “My object”)로 묶지 않는 한 공백이나 특수 문자를 포함할 수 없습니다. 큰따옴표로 묶인 식별자도 대/소문자를 구분합니다.
하이브리드 관리 방식에서는 보안 담당자 사용자 지정 역할(예: security_officer)이 마스킹 정책을 생성하고 개별 팀(예: 재무, 급여, 인사)은 마스킹 정책을 팀이 소유한 테이블 또는 뷰의 열에 적용합니다. 이 방식을 사용하면 일관된 정책 생성 및 유지 관리를 활용할 수 있지만, 민감한 데이터를 마스킹하는 것과 관련한 개별 팀의 책임이 증가합니다.
SECURITY_OFFICER 사용자 지정 역할은 HUMAN_RESOURCES 사용자 지정 역할이 소유한 오브젝트의 열에서 소셜 시큐리티 번호(즉, 마스킹 정책: ssn_mask)를 마스킹할 수 있는 APPLY 권한을 인사 팀(즉, HUMAN_RESOURCES 사용자 지정 역할이 있는 사용자)에게 부여합니다.
분산형 관리 방식에서는 개별 팀이 마스킹 정책을 생성하고 테이블 또는 뷰의 열에 적용합니다. 이 방식은 개별 팀이 마스킹 정책 관리 및 민감한 데이터 마스킹에 대한 모든 책임을 지기 때문에, 민감한 데이터가 올바르게 마스킹되지 않고 일관적인 정책 관리가 수행되지 않을 수 있습니다.
이 대표적인 예에서는 지원 팀(사용자 지정 역할 SUPPORT가 있는 사용자) 및 재무 팀(사용자 지정 역할 FINANCE가 있는 사용자)가 마스킹 정책을 생성할 수 있습니다. 이러한 사용자 지정 역할에는 SECURITY_OFFICER 사용자 지정 역할이 포함되지 않을 수 있다는 점에 유의하십시오.
지원 팀은 HUMAN_RESOURCES 사용자 지정 역할이 소유한 오브젝트의 열에서 소셜 시큐리티 번호(즉, 마스킹 정책: ssn_mask)를 마스킹할 수 있는 APPLY 권한을 인사 팀(즉, HUMAN_RESOURCES 사용자 지정 역할이 있는 사용자)에게 부여합니다.
재무 팀은 AUDIT_INTERNAL 사용자 지정 역할이 소유한 오브젝트의 열에서 현금 흐름 데이터(즉, 마스킹 정책: cash_flow_mask)를 마스킹할 수 있는 APPLY 권한을 감사 팀(즉, AUDIT_INTERNAL 사용자 지정 역할이 있는 사용자)에게 부여합니다.
데이터 관리자는 이 테이블을 사용하여 Dashboard 의 적용 범위와 배포를 특정 테이블, 뷰 또는 열 목록에 빠르게 연결할 수 있습니다. 다음과 같이 테이블 결과를 수동으로 필터링할 수도 있습니다.
Tables 또는 Columns 를 선택합니다.
태그의 경우 태그를 사용하거나 사용하지 않거나 특정 태그를 기준으로 필터링할 수 있습니다.
정책의 경우 정책을 사용하거나 사용하지 않거나 특정 정책을 기준으로 필터링할 수 있습니다.
테이블에서 행을 선택하면 Data » Databases 에서 Table Details 또는 Columns 탭이 열립니다. 필요에 따라 태그 및 정책 할당을 편집할 수 있습니다.
팁
Snowsight 를 사용하여 마스킹 정책 할당 문제를 해결할 수 있습니다. Columns 탭에서 MASKING POLICY 열에는 해당 열에 대한 마스킹 정책 할당과 충돌이 발생할 때 Policy Error 가 표시됩니다. Policy Error 를 선택하면 자세한 내용을 확인할 수 있습니다.
또한 열에 대한 마스킹 정책 할당에 오류가 있을 때 Data Preview 탭에서는 데이터 미리 보기를 렌더링하지 않습니다. 대신 Data Preview 탭에는 SQL 오류 메시지가 반환됩니다. 이 메시지는 Account Usage POLICY_REFERENCES 뷰와 Information Schema POLICY_REFERENCES 테이블 함수의 POLICY_STATUS 열에 있는 오류 값 중 하나에 해당합니다.
오류를 수정하려면 SQL 오류 메시지와 Policy Error 메시지를 사용하여 태그 또는 정책 할당을 수정하십시오.