PII 마스킹 정책

GenD 는 두 가지 마스킹 트랙으로 PII 를 보호합니다. 데이터의 형태와 위치가 다르기 때문에 적용되는 정책·전략도 분리되어 있습니다.
| 트랙 | 대상 | 시점 | 엔진 | 모듈 |
|---|---|---|---|---|
| 컬럼 레벨 마스킹 | Trino 카탈로그(Iceberg/Hive/RDB 등)의 컬럼 값 | 쿼리 실행 시 (read-time) | Trino CASE WHEN + 내장 함수 | /admin/pii (PII 관리) |
| 콘텐츠 마스킹 | 텍스트·이미지·오디오·파일 본문 | 비동기 처리 시 (write-time) | Presidio Analyzer + Anonymizer | /admin/pii/policies (마스킹 정책) |
이 문서는 두 트랙의 정책·적용 기준을 함께 정리합니다. PII 컬럼 자동 탐지는 PII 자동 탐지 문서를 참고하세요.
컬럼 레벨 마스킹
/admin/pii 에서 등록·확인(confirm)된 PII 컬럼은 GenD 가 생성하는 마스킹 뷰 SQL 을 통해 쿼리 시점에 자동 마스킹됩니다.
마스킹 함수 (Masking Coverage)
| 전략 | Trino 함수 | 예시 ('010-1234-5678') | 권장 PII 유형 |
|---|---|---|---|
redact | CAST('***' AS VARCHAR) | *** | 이름·주소·이메일 등 부분 노출도 불허해야 하는 값 |
partial | CONCAT('XXX-****-', SUBSTR(col, -4)) | XXX-****-5678 | 카드 번호·전화번호 등 끝 4 자리 식별이 필요한 운영성 데이터 |
hash | TO_HEX(SHA256(CAST(col AS VARBINARY))) | 7b8c… (결정적) | 동일 값 매칭(join)·집계가 필요하지만 원본 노출은 불가한 키 |
encrypt | CAST('***ENCRYPTED***' AS VARCHAR) (Phase 3: Vault Transit UDF) | enc:xyz | 권한자 복호화가 가능해야 하는 가역 마스킹. 현재는 placeholder, Vault Transit 연동 후 활성화 |
관리자 예외 (Admin Bypass)
마스킹 뷰는 current_user 가 관리자 role(admin) 에 속하면 원본을, 그렇지 않으면 마스킹된 값을 반환합니다.
CASE
WHEN current_user IN ('admin')
THEN "card_number"
ELSE CONCAT('XXX-****-', SUBSTR("card_number", -4))
END AS "card_number"
- 관리자 role 은 기본적으로
admin하나만 허용됩니다. 추가 role 화이트리스트는 향후 정책 테이블로 확장 예정입니다. - ABAC Row Filter / Column Mask 와 함께 적용될 경우, column_mask → row_filter 순서로 평가되어 마스킹이 우선합니다 (
feedback_abac_column_mask_order).
민감도(Sensitivity)와 전략 매핑 가이드
민감도는 마스킹 강제 여부 자체가 아니라 운영 가이드 라벨입니다. 다음 매핑을 기본 정책으로 권장합니다.
| 민감도 | 권장 전략 | 예시 |
|---|---|---|
high | redact | 주민등록번호, 의료기록 식별자, 토큰 |
high | hash | 이메일 (join 용도가 있을 때) |
medium | partial | 카드번호, 전화번호 |
low | partial | 우편번호, 생년월 일부 |
민감도 라벨은 정렬·필터링·감사 기준으로 사용되며, 마스킹 함수 자체는
mask_function컬럼이 결정합니다. 두 값을 분리한 이유는 같은 민감도라도 도메인(영업 vs. 분석)에 따라 다른 전략을 적용하기 위해서입니다.
라이프사이클
- 탐지 — Presidio 기반 PII 스캔이 카탈로그를 훑어
pii_column_registry에 후보를 등록 (detected_by='presidio'). 스캔 트리거 이벤트가 활동 로그 에 기록됨 - 확인 — 관리자가
/admin/pii에서 후보를 검토하고 확인(confirm) 클릭 →confirmed=true+confirmed_by/confirmed_at자동 기록. 활동 로그에confirm이벤트 추가 - 마스킹 뷰 SQL 발급 — 컬럼별 SQL 버튼 클릭 시
GET /api/v1/pii/view-sql/{catalog}/{schema}/{table}가 마스킹된 SELECT 문 반환 - 운영 적용 — 발급된 뷰 SQL 을 ABAC Column Mask 정책 또는 별도 Iceberg View 로 등록
- 감사 추적 —
/admin/pii/history에서 register / confirm / delete / scan_trigger 4 종 이벤트의 시간순 이력 + 행위자/대상 필터 조회. 컬럼 삭제 후에도 이력 보존
콘텐츠 마스킹 (Presidio 기반)
/admin/pii/policies 에서 정책을 정의하고, 비동기 API 로 텍스트·이미지·오디오·파일에서 PII 를 마스킹합니다.
지원 전략
| 전략 | 설명 | 예시 |
|---|---|---|
replace | 고정 문자열로 교체 | 홍길동 → <NAME> |
hash | SHA-256 해시 | 홍길동 → a1b2c3… |
encrypt | 가역 암호화 (Phase 3: Vault Transit) | 홍길동 → enc:xyz |
redact | 값 제거 | 홍길동 → |
사용 방법
- ⚙ 관리 콘솔 → 접근 제어 & 보안 → PII 관리의 마스킹 정책 탭에서 정책을 생성합니다.
- PII 유형(이름·이메일·전화번호 등)별로 마스킹 전략을 설정합니다.
- 대상 데이터에 정책을 적용합니다 (텍스트는 동기, 파일·이미지·오디오는 비동기).
- 비동기 처리 결과는
task_id로 조회합니다.
API 엔드포인트
| Method | Path | Description |
|---|---|---|
| POST | /api/v1/pii-masking/text | 텍스트 마스킹 (동기) |
| POST | /api/v1/pii-masking/image | 이미지 마스킹 (비동기, 얼굴·문자 블러) |
| POST | /api/v1/pii-masking/audio | 오디오 마스킹 (비동기, 비프 처리) |
| POST | /api/v1/pii-masking/file | 파일 마스킹 (비동기, 포맷 자동 감지) |
| GET | /api/v1/pii-masking/result/{task_id} | 마스킹 결과 조회 |
| GET | /api/v1/pii-masking/policies | 마스킹 정책 목록 |
| POST | /api/v1/pii-masking/policies | 마스킹 정책 생성 |
| PUT | /api/v1/pii-masking/policies/{policy_id} | 마스킹 정책 수정 |