Fabric Spark 整合 OneLake 安全,因此當使用者從 Spark 筆記本和 Spark 工作定義中讀取湖屋 Delta 資料表時,OneLake 中定義的列級安全(RLS)與欄位級安全(CLS)政策會持續被一致執行。 使用者持續撰寫標準的 Spark SQL 或 DataFrame 查詢;Spark 會透明地過濾結果,讓每位使用者只看到他們被授權存取的列和欄。
本文說明 Spark 如何 與 OneLake 安全性合作,包括執行架構、資料準備流程、使用者體驗,以及支援的情境與限制。
Note
關於政策撰寫與跨引擎模型,請參見 OneLake 中的列級安全性 與 OneLake 的欄級安全性。
概念一覽
- 唯一的真相來源。 RLS 規則與 CLS 欄位列表透過 OneLake 安全角色在湖屋中定義一次。 Spark 不會儲存或複製該政策。
- 引擎無關的高效存取。 OneLake 會回傳請求使用者預先計算的 有效存取 權,包括允許的欄位與 RLS 列濾波元資料。 Spark 在查詢時會消耗這些有效存取權限。
- 僅有 Delta 過濾。 OneLake 與 Fabric 平台層僅對 Delta Parquet 表格套用 RLS 與 CLS。 非 Delta 物件且套用規則時會被平台封鎖,而非被 Spark 過濾。
- 特權角色會被繞過。 由於 OneLake 和 Fabric 平台的行為,工作區Admin、Member,以及 Contributor 角色不受 RLS 或 CLS 限制。 過濾適用於 檢視 器及透過 OneLake 安全角色授權存取的使用者。
Spark 如何執行 OneLake 的安全措施
當使用者提交涉及安全湖屋資料表的查詢時,Spark 會準備一個執行計畫,將使用者的查詢與該使用者的 OneLake 安全有效存取權結合起來。 強制執行是在程序執行階段進行,而非在使用者程式碼中作為過濾步驟。因此無法被替代 API 或基於路徑的讀取方式繞過。
雙上下文執行模型
Fabric Spark 使用兩種執行情境,將政策評估與使用者程式碼隔離:
- 使用者背景。 以使用者的身份執行使用者的筆記本或 Spark 工作定義。 這個上下文會規劃查詢並使用已過濾的輸出,但從未直接、未經過濾地存取受保護的資料表。
- 系統(安全)背景。 一個由 Microsoft 管理的特權上下文,能解析使用者對 OneLake 的有效存取權,讀取底層的 Delta 檔案,套用 RLS 列篩選與 CLS 投影,並只回傳使用者被允許看到的列與欄。
系統上下文會以工作形式顯示在 監控中心 ,與 SparkSecurityControl 使用者的筆記本會話並行執行。 職缺名稱和監控經驗是 Fabric 平台行為。 這些作業是預料之中的,顯示 OneLake 的安全措施仍在積極執行中。
安全資料表的查詢流程
- 使用者會在 Spark 筆記本中執行查詢,例如
SELECT * FROM lakehouse.sales。 - Spark 透過 lakehouse 目錄解析該資料表,並偵測 OneLake 安全性是否啟用。
- Spark 向 OneLake 請求現有使用者的 有效存取權 。 回應包含允許的欄位列表(CLS)及 RLS 列過濾器元資料。
- 系統安全情境會讀取 Delta 檔案,僅投影允許的欄位,並在執行時使用點陣圖式或刪除向量式的列篩選來套用 RLS。
- 過濾後的結果會交還給使用者上下文,使用者上下文會完成使用者在已過濾資料上的其餘查詢(加入、聚合、寫入非安全目標等)。
每種保單類型的情況
| 原則 | Spark 的輸出 | 備註 |
|---|---|---|
| 僅限RLS | 所有欄位,但僅限於 RLS 規則允許的列。 | 在安全情境中,列過濾透過點陣圖式或刪除向量式過濾來強制執行;使用者無法觀察過濾邏輯。 |
| 僅限CLS | 僅允許的欄;所有列。 |
SELECT * 當至少允許一個欄位時,成功並回傳允許的欄位。 若不允許欄位,Spark 將失敗查詢。 |
| RLS + CLS 擔任相同角色 | 允許的列投影到允許的欄位。 | 只要兩條規則屬於同一角色,即可支援。 |
| 角色 A 是 RLS,角色 B 是 CLS(同一使用者) | 查詢失敗。 | OneLake 和 Fabric 平台層不支援使用者同時屬於兩個角色,一個定義 RLS,另一個定義 CLS。 參見 列層級安全性 與 欄級安全性。 |
| 非 Delta 物件 | 存取被封鎖。 | 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.read.table("lakehouse.table") Spark SQL)存取安全資料表,才能讓 Spark 解析並套用有效存取權限。
用戶體驗
- 透明過濾。 不需要重新撰寫查詢或特殊語法。 同一筆筆記本適用於不同角色的使用者,並回傳特定角色的資料。
- 各引擎的表現都很穩定。 Spark 中套用的 RLS 規則與 CLS 投影,也同樣應用於 SQL 分析端點、基於 Direct Lake 的語意模型,以及授權的第三方引擎。 請參閱 OneLake 安全整合概覽。
- 特權角色什麼都看得見。 由於 OneLake 及 Fabric 平台的行為,工作區Admin、Member,以及 Contributor 使用者持續看到未過濾的資料,這對於管線開發、資料表維護(
OPTIMIZE、VACUUM)及故障排除都很有幫助。 - 監測。 在監控樞紐中顯示的
SparkSecurityControl工作對應於執行政策強制的系統上下文。 工作名稱與監控樞紐條目是 Fabric 平台運作的一部分。
效能考量
- RLS 列過濾。 RLS 在靠近 Delta 掃描階段時,會透過位圖樣式或刪除向量樣式過濾,並在支持的情況下使用本地執行引擎。 此設計減少了在使用者情境中出現的列數。
- 柱子修剪。 CLS 欄位列表會與使用者的投影合併。 只有交集會從 Delta 儲存中讀取。
- 有效的快取存取。 Spark 會為每個查詢暫存策略和有效存取的元資料,並在查詢執行停止時清理。
- 分割與統計使用。 標準的 Delta 分割剪枝與資料跳過仍適用於 RLS 列篩選,因此對分割資料表的查詢仍保持高效。
支援的案例
- 在 Spark 筆記本介面中讀取 Lakehouse Delta 表格,以及透過 Lakehouse 目錄
<lakehouse>.<table>。 - 使用 Spark SQL 和 PySpark/Scala DataFrame API 來處理受保護的資料表。
- 在安全資料表上進行連接、聚合及下游轉換。
- 將資料從安全來源寫入至非安全的輸出端。 寫入於安全湖屋外的輸出表僅包含寫入使用者被允許讀取的過濾後資料。
- 透過捷徑跨工作空間的湖屋存取,且源湖屋啟用了 OneLake 安全性。
啟用 OneLake Spark Catalog
若要在 Spark 中強制執行 RLS 與 CLS,必須啟用 OneLake Spark 目錄以供 Spark 工作階段使用。 這是由作業服務根據為 Spark 工作階段設定的預設 lakehouse 來完成的。 OneLake Spark Catalog 將在以下情況下啟用:
- Spark 工作階段的預設 Lakehouse 已啟用結構描述,或
- 未為 Spark 工作階段設定預設的 Lakehouse。
在這些情況下,當預設湖屋必須啟用非結構模式時,可以透過環境中的 Spark 屬性啟用 OneLake Spark 目錄。 將 Spark 屬性 spark.sql.fabric.catalog.enable-schemaless-lakehouses 設為 , true 並在執行 Spark 工作或筆記本時選擇該環境。
Limitations
Spark 中的 OneLake 安全 RLS 與 CLS 繼承了 整體 OneLake 的安全限制。 顯著的行為與限制包括:
- Spark RLS/CLS 實作不支援服務主體;僅評估使用者身份以執行列與欄級的安全政策。 執行具有工作空間身份的筆記本不會對工作空間身份本身強制執行 RLS/CLS,只有在筆記本上下文中執行查詢的個別使用者才會受到強制執行。
- OneLake 及 Fabric 平台層僅對 Delta parquet 表格套用 RLS 與 CLS。 被授予安全角色的非 Delta 物件會被封鎖。
- OneLake 及 Fabric 平台層會阻擋非特權使用者對安全資料表的直接路徑讀取(
abfss://、DeltaTable.forPath)。 - OneLake 和 Fabric 平台層不支援使用者同時屬於兩個角色,其中一個角色定義受影響資料表的 RLS,另一個角色則定義 CLS。
- 由於 OneLake 和 Fabric 平台的特定行為,工作區Admin、Member 和 Contributor 角色將繞過 RLS 和 CLS。
- 從安全來源寫入非安全輸出,也支援並操作已過濾過的資料。 對受 RLS 或 CLS 限制的使用者,可能不支援對安全目標的寫入(INSERT/UPDATE/DELETE/MERGE);使用特權身份來將 ETL 寫入安全資料表。