Fabric Spark는 OneLake 보안 통합되므로 사용자가 Spark Notebook 및 Spark 작업 정의에서 lakehouse Delta 테이블을 읽을 때 OneLake에서 한 번 정의된 RLS(행 수준 보안) 및 CLS(열 수준 보안) 정책이 일관되게 적용됩니다. 사용자는 표준 Spark SQL 또는 DataFrame 쿼리를 계속 작성합니다. Spark는 결과를 투명하게 필터링하므로 각 사용자는 액세스 권한이 부여된 행과 열만 볼 수 있습니다.
이 문서에서는 적용 아키텍처, 데이터 준비 흐름, 사용자 환경 및 지원되는 시나리오 및 제한을 포함하여 Spark가 OneLake 보안과 작동하는 방식을 설명합니다.
메모
정책 작성 및 엔진 간 모델은 OneLake의 행 수준 보안 및 OneLake의 열 수준 보안을 참조하세요.
개념 한눈에 보기
- 진실의 단일 소스. RLS 규칙 및 CLS 열 목록은 OneLake 보안 역할을 통해 레이크하우스에서 한 번 정의됩니다. Spark는 정책을 저장하거나 복제하지 않습니다.
- 엔진에 구애받지 않은 효과적인 액세스. OneLake는 허용되는 열 및 RLS 행 필터 메타데이터를 포함하여 요청 사용자에 대해 미리 계산된 유효 액세스를 반환합니다. Spark는 쿼리 시 해당 유효 액세스를 소모합니다.
- 델타 전용 필터링입니다. OneLake 및 Fabric 플랫폼 계층은 Delta Parquet 테이블에만 RLS 및 CLS를 적용합니다. 규칙이 적용된 델타가 아닌 개체는 Spark에 의해 필터링되지 않고 플랫폼에 의해 차단됩니다.
- 권한 있는 역할은 바이패스합니다. OneLake 및 Fabric 플랫폼 동작으로 작업 영역 Admin, Member 및 Contributor 역할은 RLS 또는 CLS에 의해 제한되지 않습니다. 필터링은 뷰어 및 OneLake 보안 역할을 통해 액세스 권한이 부여된 사용자에게 적용됩니다.
Spark에서 OneLake 보안을 적용하는 방법
사용자가 보안 레이크하우스 테이블에 닿는 쿼리를 제출하면 Spark는 사용자의 쿼리를 해당 사용자에 대한 OneLake 보안 유효 액세스와 결합하는 실행 계획을 준비합니다. 적용은 사용자 코드의 사후 필터 단계가 아니라 실행 중에 발생하므로 대체 API 또는 경로 기반 읽기에서 바이패스할 수 없습니다.
두 컨텍스트 실행 모델
Fabric Spark는 두 가지 실행 컨텍스트를 사용하여 정책 평가를 사용자 코드와 격리된 상태로 유지합니다.
- 사용자 컨텍스트입니다. 사용자의 ID를 사용하여 사용자의 Notebook 또는 Spark 작업 정의를 실행합니다. 이 컨텍스트는 쿼리를 계획하고 필터링된 출력을 사용하지만 보안 테이블에 대한 직접적이고 필터링되지 않은 액세스 권한이 없습니다.
- 시스템(보안) 컨텍스트입니다. OneLake에 대한 사용자의 유효 액세스를 확인하고, 기본 델타 파일을 읽고, RLS 행 필터링 및 CLS 프로젝션을 적용하고, 사용자가 볼 수 있는 행과 열만 반환하는 권한 있는 Microsoft 관리되는 컨텍스트입니다.
시스템 컨텍스트는 사용자의 Notebook 세션과 함께 실행되는 작업으로 SparkSecurityControl에 표시됩니다. 작업 이름 및 모니터링 환경은 Fabric 플랫폼 동작입니다. 이러한 작업이 예상되며 OneLake 보안 적용이 활성 상태임을 나타냅니다.
보안 테이블에 대한 쿼리 흐름
- 예를 들어
SELECT * FROM lakehouse.sales사용자는 Spark Notebook에서 쿼리를 실행합니다. - Spark는 Lakehouse 카탈로그를 통해 테이블을 확인하고 OneLake 보안이 사용하도록 설정되어 있음을 감지합니다.
- Spark는 OneLake에서 현재 사용자에 대한 유효 액세스를 요청합니다. 응답에는 허용되는 CLS(열 목록) 및 RLS 행 필터 메타데이터가 포함됩니다.
- 시스템 보안 컨텍스트는 델타 파일을 읽고, 허용된 열만 투영하고, 실행 중에 비트맵 스타일 또는 삭제-벡터 스타일 행 필터링을 사용하여 RLS를 적용합니다.
- 필터링된 결과는 사용자 컨텍스트로 다시 전달되며, 이미 필터링된 데이터에 대해 사용자의 나머지 쿼리(조인, 집계, 보안되지 않은 대상에 쓰기 등)를 완료합니다.
각 정책 유형에 대해 수행되는 동작
| Policy | Spark가 반환하는 내용 | Notes |
|---|---|---|
| RLS만 | RLS 규칙에서 허용하는 행만 제외한 모든 열입니다. | 행 필터링은 비트맵 스타일 또는 삭제-벡터 스타일 필터링을 사용하여 보안 컨텍스트에서 적용됩니다. 사용자는 필터 논리를 관찰할 수 없습니다. |
| CLS만 | 허용된 열만 표시; 모든 행 포함 |
SELECT * 는 하나 이상의 열이 허용되는 경우 허용된 열을 반환합니다. 열이 허용되지 않으면 Spark가 쿼리에 실패합니다. |
| 동일한 역할의 RLS + CLS | 허용된 행을 허용된 열로 투영했습니다. | 두 규칙이 동일한 역할에 속하는 한 지원됩니다. |
| 역할 A의 RLS, 역할 B의 CLS(동일한 사용자) | 쿼리가 실패합니다. | OneLake 및 Fabric 플랫폼 계층은 사용자가 RLS를 정의하고 다른 하나는 CLS를 정의하는 두 역할의 멤버가 되는 것을 지원하지 않습니다. 행 수준 보안 및 열 수준 보안을 참조하세요. |
| 델타가 아닌 개체 | 액세스가 차단되었습니다. | OneLake 및 Fabric 플랫폼 계층은 Delta Parquet 테이블에만 RLS 및 CLS를 적용합니다. 보안 역할에 포함된 다른 개체는 차단됩니다. |
정식 작성 규칙 및 RLS 식 구문은 행 수준 보안 및 열 수준 보안 문서를 참조하세요.
Spark에서 사용자를 위해 데이터를 준비하는 방법
OneLake 보안은 데이터 소비자에게 투명하게 설계되었습니다. 사용자는 이미 알고 있는 API를 계속 사용하고 Spark는 정책 확인 및 필터링을 대신 처리합니다.
Spark SQL
-- Returns only rows and columns the current user is authorized to see.
SELECT product_category, SUM(amount) AS total
FROM sales.transactions
GROUP BY product_category;
PySpark DataFrame
df = spark.read.table("sales.transactions")
df.filter("region = 'EMEA'").groupBy("product_category").sum("amount").show()
두 예제 transactions 에서 DataFrame에 로드된 테이블 데이터는 이미 OneLake 보안에 의해 필터링됩니다. 후속 변환은 필터링된 데이터에 대해서만 작동합니다.
직접 파일 액세스가 차단됨
직접 경로 액세스는 레이크하우스 카탈로그 정책 확인을 무시합니다. 테이블에서 OneLake 보안을 사용하도록 설정하면 OneLake 및 Fabric 플랫폼 계층은 권한이 없는 사용자에 대해 다음 패턴을 차단합니다.
spark.read.format("delta").load("abfss://...")DeltaTable.forPath(spark, "abfss://...")- OneLake REST/SDK는 보안 테이블의
Tables/<table>폴더를 읽습니다.
사용자는 Spark가 유효한 액세스를 확인하고 적용할 수 있도록 Lakehouse 테이블 이름(예: spark.read.table("lakehouse.table") Spark SQL)을 통해 보안 테이블에 액세스해야 합니다.
사용자 환경
- 투명 필터링. 쿼리 재작성 또는 특수 구문이 필요하지 않습니다. 동일한 Notebook은 역할이 다른 사용자에 대해 작동하며 역할별 데이터를 반환합니다.
- 엔진 전체에서 일관된 결과입니다. Spark에 적용되는 동일한 RLS 규칙 및 CLS 프로젝션은 SQL 분석 엔드포인트, Direct Lake에서 빌드된 의미 체계 모델 및 권한 있는 타사 엔진에도 적용됩니다. OneLake 보안 통합 개요를 참조하세요.
- 권한 있는 역할은 모든 것을 볼 수 있습니다. OneLake 및 Fabric 플랫폼 동작으로 작업 영역 AdminMember 및 Contributor 사용자는 파이프라인 개발, 테이블 유지 관리(
OPTIMIZE,VACUUM) 및 문제 해결에 유용한 필터링되지 않은 데이터를 계속 볼 수 있습니다. - 모니터링.
SparkSecurityControl모니터링 허브에 표시되는 작업은 정책 적용을 수행하는 시스템 컨텍스트에 해당합니다. 작업 이름 및 모니터링 허브 항목은 Fabric 플랫폼 작업의 일부입니다.
성능 고려 사항
- RLS 행 필터링. RLS는 비트맵 스타일 또는 삭제-벡터 스타일 필터링 및 지원되는 경우 네이티브 실행 엔진을 사용하여 델타 검사에 가깝게 적용됩니다. 이 디자인은 사용자 컨텍스트에서 구체화되는 행을 최소화합니다.
- 열 가지치기. CLS 열 목록은 사용자의 프로젝션과 결합됩니다. 교차점만 델타 스토리지에서 읽습니다.
- 효과적인 액세스 캐싱. Spark는 쿼리당 정책 및 유효 액세스 메타데이터를 캐시하고 쿼리 실행이 중지되면 정리합니다.
- 파티션 및 통계 사용. 표준 델타 파티션 정리 및 데이터 건너뛰기는 RLS 행 필터링에 계속 적용되므로 분할된 테이블에 대한 쿼리는 효율적으로 유지됩니다.
지원되는 시나리오
- Lakehouse 카탈로그(
<lakehouse>.<table>)를 통해 Spark Notebook 및 Spark 작업 정의에서 Lakehouse Delta 테이블을 읽습니다. - 보안 테이블에 대한 Spark SQL 및 PySpark/Scala DataFrame API입니다.
- 보안 테이블의 조인, 집계 및 다운스트림 변환
- 보안 소스에서 보안되지 않은 출력으로 데이터를 기록합니다. 보안 레이크하우스 외부에서 작성된 출력 테이블에는 쓰기 사용자가 읽을 수 있는 이미 필터링된 데이터만 포함됩니다.
- 원본 레이크하우스에서 OneLake 보안을 사용하도록 설정된 바로 가기를 통해 작업 영역 간 레이크하우스에 액세스합니다.
제한 사항
Spark의 OneLake 보안 RLS 및 CLS는 전체 OneLake 보안 제한을 상속합니다. 주목할 만한 동작 및 제한은 다음과 같습니다.
- Spark RLS/CLS 구현은 서비스 주체를 지원하지 않습니다. 사용자 ID만 행 및 열 수준 보안 정책에 대해 평가됩니다. 작업 영역 ID를 사용하여 Notebook을 실행하면 작업 영역 ID 자체에 대해 RLS/CLS가 적용되지 않으며 Notebook 컨텍스트 내에서 쿼리를 실행하는 개별 사용자에 대해서만 적용됩니다.
- OneLake 및 Fabric 플랫폼 계층은 Delta parquet 테이블에만 RLS 및 CLS를 적용합니다. 보안 역할의 델타가 아닌 개체는 차단됩니다.
- OneLake 및 Fabric 플랫폼 계층은 권한이 없는 사용자에 대한 보안 테이블에 대해 직접 경로 읽기(
abfss://,DeltaTable.forPath)를 차단합니다. - OneLake 및 Fabric 플랫폼 계층은 사용자가 RLS를 정의하고 다른 하나는 영향을 받는 테이블에 대한 CLS를 정의하는 두 역할의 멤버가 되는 것을 지원하지 않습니다.
- OneLake 및 Fabric 플랫폼 동작으로 작업 영역 Admin, Member 및 Contributor 역할은 RLS 및 CLS를 무시합니다.
- 보안 원본에서 보안되지 않은 출력에 대한 쓰기가 지원되며 이미 필터링된 데이터에서 작동합니다. 보안 대상에 대한 쓰기(INSERT/UPDATE/DELETE/MERGE)는 RLS 또는 CLS가 적용되는 사용자에게 지원되지 않을 수 있습니다. ETL 쓰기를 보안 테이블에 수행할 때는 권한이 있는 ID를 사용하십시오.