본문으로 건너뛰기
김신건의 로그

[AWS] Lake Formation Data Filter: 행/셀 수준 보안

· 수정 · 📖 약 4분 · 1,367자/단어 #aws #cloud #lake-formation #security #data-lake #governance
Lake Formation Data Filter, Data Cells Filter, Lake Formation row-level security, Lake Formation cell-level security, 행 수준 보안, 셀 수준 보안, row-level security, cell-level security, CreateDataCellsFilter

정의

Lake Formation Data FilterLake Formation 이 관리하는 테이블에 대해 행 (row) / 셀 (cell) 수준의 접근 제어를 정의하는 리소스. IAM 정책이나 버킷 정책만으로는 표현 불가능한 “같은 테이블에 대해 사용자별로 다른 row / 다른 column 만 보이게” 하는 세밀한 제어를 SQL 없이 선언적으로 표현한다.

핵심 대비:

  • IAM: 리소스 (버킷/테이블) 단위 접근
  • Lake Formation 기본 권한: 데이터베이스 / 테이블 / 컬럼 단위
  • Data Filter: row + column 조합 (cell) 단위

3 단계 보안 계층

Lake Formation 의 데이터 필터링은 3 단계로 구성된다.

flowchart TB
    Query["SELECT * FROM sales.orders<br/>WHERE order_date > '2026-01-01'"]

    Query --> C["Column-level<br/>(허용된 컬럼만 반환)"]
    C --> R["Row-level<br/>(RowFilter 표현식으로 조건 필터)"]
    R --> Cell["Cell-level<br/>(Row + Column 조합)"]
    Cell --> Result["최종 결과<br/>(사용자에게 반환)"]

1. Column-level Security

특정 컬럼만 SELECT 가능하도록. 나머지는 반환에서 제외.

Table orders (order_id, user_id, amount, ssn, credit_card, region)

Analyst-Marketing 그룹 :
  SELECT 가능 컬럼: [order_id, user_id, amount, region]
  숨김: [ssn, credit_card]

SELECT * -> SELECT order_id, user_id, amount, region 로 자동 변환
SELECT ssn FROM orders -> permission denied

2. Row-level Security

WHERE 조건과 유사한 필터 표현식으로 특정 row 만 반환.

Data Filter "region-korea-only":
  Table: orders
  RowFilter: "region = 'KR'"

Analyst-Korea 그룹 :
  SELECT * FROM orders 실행 시
  실제 실행 = SELECT * FROM orders WHERE region = 'KR'

3. Cell-level Security

Row filter + Column filter 결합. 다른 row 에 대해 다른 컬럼도 숨김 가능.

Data Filter "hr-own-region":
  RowFilter: "region = 'KR'"
  ColumnWildcard: ExcludedColumnNames = ['salary']

Analyst-Korea 그룹 :
  KR row 는 salary 제외한 모든 컬럼
  다른 region row 는 아예 안 보임

Data Filter 정의 구조

CreateDataCellsFilter API 또는 콘솔로 정의.

JSON 스펙

{
  "TableData": {
    "TableCatalogId": "111122223333",
    "DatabaseName": "sales",
    "TableName": "orders",
    "Name": "restrict-korea-non-pii",

    "RowFilter": {
      "FilterExpression": "region = 'KR' AND status = 'completed'"
    },

    "ColumnWildcard": {
      "ExcludedColumnNames": ["ssn", "credit_card", "phone"]
    }
  }
}
  • Name: 필터 식별자 (테이블당 고유)
  • RowFilter.FilterExpression: PartiQL 스타일 WHERE 표현식
  • ColumnWildcard: 컬럼 포함/제외 방식
  • ColumnNames: 명시적 포함 목록 (없으면 wildcard 사용)

컬럼 지정 방식 (셋 중 하나 선택)

방식 1: 명시적 포함 (allowlist)

"ColumnNames": ["order_id", "amount", "order_date"]

지정한 컬럼만 보임.

방식 2: Wildcard + 제외 (denylist)

"ColumnWildcard": {
  "ExcludedColumnNames": ["ssn", "credit_card"]
}

지정 컬럼 제외 모두 보임.

방식 3: Wildcard 만 (모든 컬럼)

"ColumnWildcard": {}

모든 컬럼 보임 (row filter 만 적용).

IMPORTANT

Athena / Spectrum 는 명시적 포함 (ColumnNames) 만 지원. 제외 방식은 EMR Spark / Trino 에서만.

RowFilter 표현식

PartiQL 기반 WHERE 스타일 표현식.

지원 연산

카테고리
비교=, <>, <, >, <=, >=
논리AND, OR, NOT
집합IN (...), NOT IN (...)
NULLIS NULL, IS NOT NULL
패턴LIKE, NOT LIKE (일부 엔진)
BETWEENBETWEEN x AND y

예제

-- 단순
region = 'KR'

-- AND / OR
region = 'KR' AND order_amount > 100

-- IN
country IN ('KR', 'JP', 'US')

-- 복합
(department = 'HR' AND access_level >= 3)
OR (department = 'Finance' AND CURRENT_USER = 'auditor')

지원하지 않는 것

  • 서브쿼리 (다른 테이블 조회)
  • 집계 함수 (SUM, COUNT)
  • JOIN
  • User-defined function

행 자체의 값 만 참조 가능. 다른 테이블/사용자 정보와 조합은 안 됨.

Named Data Filter vs Inline

Named (재사용 가능, 표준)

콘솔 / API 로 생성 후, permission grant 시 참조.

1. CreateDataCellsFilter("restrict-korea", ...)
2. Grant SELECT ON DATA FILTER "restrict-korea" TO ROLE "Korea-Analyst"

장점:

  • 여러 사용자에게 재사용
  • 이름으로 감사 추적 쉬움
  • 변경 시 한 곳만 수정

Inline (Permission 안에 직접)

Permission 생성 시 필터를 직접 정의.

Grant SELECT ON TABLE orders
  WITH ROW FILTER "region = 'KR'"
  WITH COLUMN EXCLUDES ["ssn"]
  TO ROLE "Korea-Analyst"

단점: 재사용 불가, 변경 시 각각 수정.

권장: Named data filter 사용.

Grant / Revoke 구문

-- Athena / Lake Formation SQL 스타일 (콘솔에서 관리)
GRANT SELECT ON DATA FILTER "restrict-korea"
  TO PRINCIPAL "arn:aws:iam::111122223333:role/KoreaAnalyst";

REVOKE SELECT ON DATA FILTER "restrict-korea"
  FROM PRINCIPAL "arn:aws:iam::111122223333:role/KoreaAnalyst";

CLI:

aws lakeformation grant-permissions \
  --principal DataLakePrincipalIdentifier=arn:aws:iam::...:role/KoreaAnalyst \
  --resource '{
    "DataCellsFilter": {
      "TableCatalogId": "111122223333",
      "DatabaseName": "sales",
      "TableName": "orders",
      "Name": "restrict-korea"
    }
  }' \
  --permissions SELECT

Cross-Account Data Filter

Producer 계정의 테이블을 Consumer 계정에 필터 적용해 공유.

flowchart LR
    subgraph Producer["Producer 111122223333"]
        T[("orders 테이블")]
        F["Data Filter<br/>'restrict-korea'"]
    end

    subgraph Consumer["Consumer 555566667777"]
        RL["Resource Link<br/>-> orders"]
        Q["Athena 쿼리"]
    end

    F -.-> T
    T -->|"Grant + LF-Tag"| RL
    RL --> Q

    Note1["Producer 필터가<br/>Consumer 쿼리에도 적용"]
  • Producer 가 Grant → Consumer 가 AWS RAM 초대 수락 → Resource Link 생성
  • Consumer 가 쿼리하면 Producer 의 data filter 자동 적용

엔진별 지원

엔진Row FilterColumn 포함Column 제외Nested 컬럼
AthenaOOXO
Redshift SpectrumOOXO
EMR SparkOOOO
EMR TrinoOOOO
Glue ETL부분 (엔진에 따름)OO부분
QuickSightO (엔진 통해서)OX제한

IMPORTANT

Athena / Spectrum 은 컬럼 제외 방식 X. ExcludedColumnNames 를 쓰려면 EMR (Spark / Trino) 필요.

성능 영향

  • Predicate pushdown: 파티션 컬럼이 row filter 에 있으면 파티션 프루닝 유지 -> 성능 영향 미미
  • Non-partition 컬럼 필터: 전체 스캔 후 필터 적용 -> 원본 쿼리와 비슷한 비용
  • Column filter: 실제 read 컬럼 감소 -> 오히려 빠를 수 있음
  • Nested 컬럼: 필터 평가 오버헤드 발생 가능

최적화:

  • 파티션 컬럼을 row filter 에 자주 활용
  • 컬럼 수 감소로 read 최소화 유도

실전 예제

예 1: 지역별 데이터 격리

Filter "KR-Analysts":
  Table: sales.orders
  RowFilter: "country = 'KR'"
  ColumnWildcard: {}   // 모든 컬럼

Filter "JP-Analysts":
  Table: sales.orders
  RowFilter: "country = 'JP'"
  ColumnWildcard: {}

Grant SELECT ON "KR-Analysts" TO Group("korea-team")
Grant SELECT ON "JP-Analysts" TO Group("japan-team")

각 팀은 자기 지역 order 만 조회.

예 2: PII 컬럼 마스킹

Filter "customers-non-pii":
  Table: sales.customers
  RowFilter: ""   // 모든 row
  ColumnNames: [customer_id, country, signup_date, plan]
  // ssn, credit_card, phone, email 제외

일반 애널리스트는 PII 없는 뷰만 볼 수 있음.

예 3: 조건부 컬럼 접근 (권한 상승 감지)

Filter "hr-conditional-salary":
  Table: hr.employees
  RowFilter: "department IN ('engineering', 'sales')"
  ColumnWildcard:
    ExcludedColumnNames: ["salary", "bonus"]   // 일반 접근 시 급여 X

Filter "hr-full":
  RowFilter: ""
  ColumnWildcard: {}   // 모든 컬럼

Grant "hr-conditional-salary" TO Group("hr-analyst")
Grant "hr-full" TO Group("hr-manager")

감사 & 로깅

Data filter 적용 여부는 CloudTrail 이벤트로 기록:

  • GetTemporaryTableCredentials (엔진이 자격증명 요청)
  • GetDataAccess (실제 데이터 접근)

Athena / Spectrum 쿼리 로그와 결합해 누가 언제 어떤 필터로 접근했는지 감사 가능.

함정

WARNING

ExcludedColumnNames 는 Athena/Spectrum 미지원. 이 두 엔진 사용 시 필터를 ColumnNames (allowlist) 로 다시 작성해야 함.

CAUTION

RowFilter 는 서브쿼리 / JOIN 불가. 다른 테이블의 사용자 매핑 (WHERE user = current_user) 은 안 됨. 매핑 테이블을 dimension 으로 join 해서 필터링해야 하면 view 로 우회.

WARNING

파티션 컬럼 필터로 pushdown. 파티션 아닌 컬럼 필터는 전체 스캔 후 필터라 스캔 비용 그대로. 파티션 설계와 함께 고려.

IMPORTANT

테이블당 filter 이름 unique. 대량 관리 시 이름 규약 (e.g., {table}-{persona}) 필요.

CAUTION

IAM 정책이 SELECT 를 이미 거부 하면 Lake Formation 이 GRANT 해도 접근 불가. IAM 은 통과 + LF grant 둘 다 필요.

WARNING

Data filter 로 컬럼 숨겨도 S3 직접 접근은 우회 가능. S3 위치를 Lake Formation 에 등록해 임시 자격증명 vending 강제.

IMPORTANT

NULL vs empty. region = 'KR' 은 region 이 NULL 인 row 도 제외. region IS NULL OR region = 'KR' 로 명시.

CAUTION

Nested (STRUCT) 컬럼 접근 은 엔진별 지원 다름. Spark / Trino 는 nested 필드 필터 O, 일부는 X.

관련 위키

이 글의 용어 (9개)
[AWS] Athena: 서버리스 SQL on S3cloud
정의 Amazon Athena 는 S3 에 있는 데이터를 서버 없이 SQL 로 쿼리 하는 서비스. 클러스터 프로비저닝, 스키마 로딩, 인덱스 생성 없이 데이터 파일 (Parque…
[AWS] CloudTrail (API Activity Logging)cloud
정의 AWS CloudTrail 은 AWS 계정의 API 호출 및 사용자 활동을 기록 하는 감사 로깅 서비스입니다. "누가, 언제, 어디서, 어떤 API 를, 어떤 리소스에 대해…
[AWS] EMR: 관리형 빅데이터 클러스터cloud
정의 Amazon EMR (Elastic MapReduce) 은 Hadoop / Spark 등 오픈소스 빅데이터 프레임워크를 관리형 클러스터로 제공 하는 AWS 서비스. AWS …
[AWS] Glue: 서버리스 ETL + Data Catalogcloud
정의 AWS Glue 는 서버리스 ETL + 통합 메타데이터 카탈로그 플랫폼. Apache Spark 로 데이터 변환을 실행하고, Hive 호환 Data Catalog 로 스키마…
[AWS] IAM: User, Role, Policy, STScloud
정의 IAM (Identity and Access Management) = AWS 의 권한 관리 전부. User, Group, Role, Policy 로 구성. "누가 어떤 리소…
[AWS] Lake Formation: Data Lake 거버넌스cloud
정의 AWS Lake Formation (LF) 은 데이터 레이크 의 세분화된 접근 제어 + 거버넌스를 중앙에서 관리 하는 서비스. Glue Data Catalog 위에 얹혀 데…
[AWS] Redshift Spectrum: S3 데이터 직접 쿼리cloud
정의 Redshift Spectrum 은 Redshift 에서 S3 에 있는 데이터를 로드하지 않고 직접 SQL 로 쿼리 하는 기능. 별도 Spectrum 실행 계층 (Spect…
[AWS] S3: object storage, storage classes, lifecyclecloud
정의 S3 = AWS 의 object storage. bucket + key + object. 11 9's durability (99.999999999%), 무한 확장. 2026…
데이터 레이크data-engineering
정의 데이터 레이크 (Data Lake) 는 구조 여부와 무관하게 모든 종류의 데이터를 원본 형식 그대로 저장하는 중앙 저장소. 스키마를 미리 강제하지 않고 (schema-on-…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기