[Snowflake] 데이터 보안 정리 (Column & Row Level Security)

차지예·2026년 6월 6일

Snowflake

목록 보기
26/49
post-thumbnail

1. Column-level Security (컬럼 단위 보안)

컬럼에 Masking Policy를 적용하는 기능. 두 가지 하위 기능 포함:

  • Dynamic Data Masking (동적 데이터 마스킹)
  • External Tokenization (외부 토큰화)

2. Dynamic Data Masking (DDM)

핵심 개념

  • plain text(평문) 데이터를 Snowflake에 로드 → 쿼리 시점(query runtime)에 동적으로 마스킹
  • 원본 데이터는 그대로 유지(at rest 변경 X), 전송 중(in transit)에만 마스킹
  • 권한 없는 사용자/역할만 마스킹된 데이터를 봄

동작 흐름 (강의 슬라이드)

Authorized 사용자 → SELECT → Table/View(+Policy) → Unmasked 결과


3. Masking Policy 작성

기본 구조

CREATE MASKING POLICY EMAIL_MASK AS (VAL STRING) RETURNS STRING ->
  CASE
    WHEN CURRENT_ROLE() IN ('SUPPORT') THEN VAL          -- Unmasked
    ELSE '*******'                                       -- Fully Masked
  END;

⚠️ RETURNS 데이터 타입 = 첫 입력 컬럼 데이터 타입과 반드시 일치해야 함

마스킹 유형별 예시

유형표현식 예시
Unmasked (원본)THEN VAL
Partially Masked (부분 마스킹)REGEXP_REPLACE(VAL, '.+\@', '*****@')
System Functions (시스템 함수)SHA2(VAL)
User Defined Functions (UDF)MASK_UDF(VAL)
Semi-structured (반정형)OBJECT_INSERT(VAL, 'USER_EMAIL', '*', TRUE)
Fully Masked (완전 마스킹)'*******'

정책 적용

ALTER TABLE IF EXISTS EMP_INFO 
  MODIFY COLUMN USER_EMAIL SET MASKING POLICY EMAIL_MASK;

4. Masking Policy 핵심 특징 ⭐

  1. Schema-level object (테이블·뷰처럼 스키마 레벨 객체)
  2. 객체 소유자와 독립적으로 생성·적용 가능 (보안/개인정보 담당자가 결정 → Segregation of Duties)
  3. Nesting(중첩) 가능: 해당 테이블을 참조하는 뷰에도 적용
  4. SQL문에서 컬럼이 어디서 참조되든 항상 적용됨 (query runtime, 모든 위치)
  5. 객체 생성 시점 또는 생성 이후 모두 적용 가능
  6. "정책 한 번 작성 → 수천 개 컬럼에 적용" 가능 (공식 문서 benefit)

5. External Tokenization (외부 토큰화)

핵심 개념

  • 토큰화된(tokenized) 데이터를 Snowflake에 로드
  • 쿼리 시점에 권한 있는 사용자에게 detokenize(역토큰화)
  • External Function을 호출하는 Masking Policy 사용 → 외부 토큰화 서비스(REST API) 연동

동작 흐름 (강의 슬라이드 Image 5)

Table/View(+Policy) → External Function
→ (Tokenized) → External Tokenization Service (REST API)
→ (Detokenized) → 권한 사용자 결과

DDM과의 차이점 ⭐

  • 토큰화는 데이터 로드 에 수행 (DDM은 평문 로드)
  • Masking Policy 구조는 동일하나 External Function 필수 (공식 문서 확인)

6. Row Access Policies (행 접근 정책)

핵심 개념

  • 보안팀이 쿼리 결과에 반환되는 행(row)을 제한
  • Authorized → 모든 행 반환(Rows unfiltered)
  • Unauthorized → 행 필터링됨(Rows filtered)

정책 작성

CREATE OR REPLACE ROW ACCESS POLICY RAP_ID AS (ACC_ID VARCHAR) RETURNS BOOLEAN ->
  CASE
    WHEN 'ADMIN' = CURRENT_ROLE() THEN TRUE
    ELSE FALSE
  END;

RETURNS BOOLEAN (TRUE인 행만 반환)

정책 적용

ALTER TABLE ACCOUNTS ADD ROW ACCESS POLICY RAP_IT ON (ACC_ID);

7. Row Access vs Masking Policy ⭐⭐

공통점 (Similarities) — 강의 슬라이드

  • Schema level object (스키마 레벨 객체)
  • Segregation of duties (직무 분리)
  • Creation and applying workflow (생성·적용 워크플로우)
  • Nesting policies (정책 중첩)

⚠️ 핵심 규칙

  1. Row Access Policy가 Masking Policy보다 먼저 평가됨 (evaluated before)
  2. 같은 컬럼은 row access policy signature와 masking policy signature 양쪽에 동시 지정 불가
  3. 컬럼이 row access policy에서 참조되면, 그 컬럼에 masking policy 추가 시 실패

🎯 핵심 포인트

항목핵심
Masking Policy 레벨Schema-level object
DDM 마스킹 시점Query runtime (원본 변경 없음)
External Tokenization로드 토큰화 + External Function
Row Access Policy 반환타입BOOLEAN
평가 순서Row Access → Masking
같은 컬럼 중복 지정불가

0개의 댓글