1. 개요
Column에 대한 접근을 허용하면서 그 안의 데이터를 노출시키면 안되는 경우 Data Masking 기능을 사용하면 유용합니다. Data Masking을 사용하면 Column 데이터를 실제값(평문) 대신 null, default 또는 hashed content 등과 같은 마스킹된 데이터로 대체하여 민감 데이터를 보호할 수 있습니다. Data Masking은 Policy Tag와 같은 Column-Level Access Control 위에서 구현가능하기에 해당 기능에 대해서도 숙지해야 합니다.
본 글에서는 Data Masking 설정부터 데이터 조회 결과 확인까지의 과정을 설명드리겠습니다.

[그림 1]
2. Data Masking 장점
- 더 쉽게 데이터를 공유할 수 있습니다. 민감한 열을 마스킹하여 대규모 그룹과 테이블을 공유할 수 있습니다.
- Policy Tag와 같은 Column-Level Access Control의 경우 사용자가 액세스할 수 없는 열은 제외하고 쿼리해야하지만, Data Masking의 경우 마스킹이 적용된 열을 제외할 필요가 없습니다. 데이터 마스킹이 구성될 때 사용자에게 부여된 역할에 따라 열 데이터를 자동으로 마스킹합니다.
- 데이터 액세스 정책을 대규모로 쉽게 적용할 수 있습니다. 데이터 정책을 한 번만 작성하여 정책 태그와 연결하고 정책 태그를 원하는 수의 열에 적용할 수 있습니다.
- 속성 기반 액세스 제어를 사용 설정합니다. 열에 연결된 정책 태그는 데이터 정책 및 해당 정책 태그와 연결된 주 구성원에 의해 결정되는 컨텍스트 데이터 액세스를 제공합니다.
3. Data Masking 설정
Data Masking은 Policy Tag같은 Column-Level Access Control 위에서 구현 가능하기에 먼저 Policy Tag를 생성해주고 그 위에 Data Masking을 설정해줘야 합니다.
1) Policy tag 생성
“Dataplex > Manage Catalog > Policy tags” 메뉴로 이동합니다.
아래 그림과 같이 taxonomy 생성 후 Policy tag를 hierarchy하게 구성해줍니다.

[그림 2]
2) Masking Rule 설정
Masking 적용할 tag를 선택 후, “MANAGE DATA POLICIES” 버튼을 클릭합니다.

[그림 3]
생성된 팝업에서 Masking Rule을 선택하고, 적용할 User Group을 지정해 줍니다.
※ 아래는 security_pii 그룹에 속한 모든 Member(사용자)는 Postcode Tag가 붙은 칼럼 데이터를 조회시 Hash값으로 보이게하는 설정 예시입니다. (단, 해당 tag에 security_pii 그룹이 Find-Grained Reader 권한을 가지고 있지 않은 경우 限)

[그림 4]
Masking Rule에는 다양한 방식의 마스킹 규칙이 지원됩니다.
(1) Hash (SHA-256)
SHA-256 hash 함수 실행 결과 값을 보여줍니다. 평문은 아니어도 hash된 결과값은 볼 수 있기에 쿼리 JOIN 작업시 해당 Column을 사용할 수 있습니다. 단, Data Type이 STRING 또는 BYTES 인 경우만 사용가능하며, hash된 결과값의 Data Type은 원래 Column의 Data Type과 동일하게 설정됩니다.
(2) Email mask
이메일 주소가 유효한 값이면 사용자 이름을 XXXXX로 바꾼 후 결과값을 반환합니다.
유효한 이메일 주소가 아닌 경우 SHA-256 해시 함수의 실행 결과값이 반환됩니다.
단, Column Data Type이 STRING Type인 경우에만 사용 가능합니다.

[그림 5]
(3) Last four characters
열 값의 마지막 4자를 반환하고 나머지 문자열을 XXXXX로 바꿉니다. 만약, 길이가 4자 이하면 SHA-256 해시 함수 실행 결과값이 반환됩니다. 단, Column Data Type이 TRING Type인 경우에만 사용 가능합니다.
(4) First four characters
열 값의 처음 4자를 반환하고 나머지 문자열을 XXXXX로 바꿉니다. 만약, 길이가 4자 이하면 SHA-256 해시 함수 실행 결과값이 반환됩니다. 단, Column Data Type이 STRING Type인 경우에만 사용 가능합니다.
(5) Date year mask
해당 연도의 시작 날짜를 반환합니다. 단, Column Data Type이 DATE, DATETIME, TIMESTAMP Type인 경우에만 사용 가능합니다.

[그림 6]
(6) Default masking value
열의 데이터 유형에 따라 열의 기본 마스킹 값을 반환합니다. 열의 값을 숨기고 데이터 유형을 표시하려면 이 옵션을 사용합니다.

[그림 7]
(7) Nullify
NULL을 반환합니다. 열의 값과 데이터 유형을 모두 숨기려는 경우에 사용합니다.
3) Data Masking 설정 확인
아래와 같이 설정 여부 확인 가능합니다. 이번 예시에서는 PII tag에 속한 5개의 하위 tag에 대해 모두 Hash(SHA256) Masking Rule을 적용하였습니다.

[그림 8]
4. Fine-Grained Reader 권한 설정
Data Masking 의 장점은 민감 데이터를 사용자 그룹에 따라 접근 못하게도 할 수 있고, 마스킹된 값을 보여줄 수도 있고, 실제값(평문)이 보이게도 할 수 있다는 점 입니다. 앞 단계에서 security_pii 그룹에 대해 마스킹된 Hash 결과값이 보이도록 설정하였으니, 이번에는 security_pii_plain 그룹에 대해 실제값(평문)이 보이도록 설정해보겠습니다.
1) 권한 설정

[그림 9]
2) 결과 확인
※ 본 예시에서는 Data Masking 설정된 PII 하위 5개 tag에 대해 모두 security_pii_plain 그룹에게 Fine-Grained Reader 권한을 부여하였습니다.

[그림 10]
5. Table Column Schema와 Policy Tag 맵핑
Policy Tag와 Data Masking 설정을 완료했으면, 마스킹 설정 적용할 Table Column에 tag를 맵핑해줘야 합니다. 이 단계까지 완료되면 앞서 설명드린대로 사용자 그룹에 따라 Column에 접근 못하게도 할 수 있고, 마스킹 값을 보여줄 수도 있고, 실제값(평문)을 보여줄 수도 있습니다.
1) Policy Tag 맵핑
※ 아래는 “user_name” Column과 “Name” Policy Tag를 맵핑한 예시입니다.
Table SCHEMA 화면 “EDIT SCHEMA”를 통해 Column과 Policy Tag를 맵핑합니다.

[그림 11]
2) 결과 확인

[그림 12]
6. 데이터 조회 결과
1) security_pii 그룹 Member
security_pii 그룹은 Masking Rule이 적용된 5개의 Policy Tag에 대해 Fine-Grained Reader 권한이 없고, Masked Reader 권한만 가지고 있습니다. 따라서 security_pii 그룹의 Member는 아래와 같이 Masking Rule이 적용된 칼럼의 경우 마스킹된 Hash 결과값이 보이게 됩니다.

[그림 13]
2) security_pii_plain 그룹 Member
security_pii_plain 그룹은 Masking Rule이 적용된 5개의 Policy Tag에 대해 Fine-Grained Reader 권한이 있습니다. 이런 경우 Masked Reader 권한 유무에 상관없이 실제값(평문)이 보이게 됩니다. 따라서 security_pii_plain 그룹의 Member는 아래와 같이 Masking Rule이 적용된 칼럼의 데이터도 실제값(평문)이 보이게 됩니다.

[그림 14]
3) security_pii, security_pii_plain 어느 그룹에도 속하지 않은 사용자
Column-Level Access Control에 의해 칼럼 접근시 아래와 같은 에러가 발생됩니다.
아래는 user_name 칼럼에 접근했을 때의 에러 예시입니다.

[그림 15]
4) 기타 Case
- 동일한 Policy Tag에 Masked Reader와 Fine-Grained Reader 권한 모두 가진 경우 Fine-Grained Reader 권한이 우선되어 실제값(평문)이 보입니다.
- 상위 Tag에는 Fine-Grained Reader, 하위 Tag에는 Masked Reader 권한 가진 경우 권한 체크시 가장 하위 Tag의 권한을 먼저 체크합니다. 하위 Tag에 Masked Reader 권한을 가지고 있기 때문에, 상위 Tag의 권한 여부에 상관없이 Masked Reader 권한 설정에 따라 마스킹된 데이터가 보여집니다.