在企業級應用中,數據的安全性和隱私保護是極其重要的。Spark 作為數棧底層計算引擎之一,必須確保數據只能被授權的人員訪問,避免出現數據泄露和濫用的情況。為了實現Spark SQL 對數據的精細化管理及提高數據的安全性和可控性,數棧基於 Apache Ranger 實現了 Spark SQL 對數據 ...
在企業級應用中,數據的安全性和隱私保護是極其重要的。Spark 作為數棧底層計算引擎之一,必須確保數據只能被授權的人員訪問,避免出現數據泄露和濫用的情況。為了實現Spark SQL 對數據的精細化管理及提高數據的安全性和可控性,數棧基於 Apache Ranger 實現了 Spark SQL 對數據處理的許可權控制。
本文基於 Apahce Spark 2.4.8 和 Apache Ranger 2.2 進行原理講解,和大家聊聊「袋鼠雲一站式大數據基礎軟體數棧」基於 Ranger 在 Spark SQL 許可權控制上的實踐探索之路。
基於Ranger實現Spark SQL許可權控制
Apache Ranger 是一個開源的許可權管理框架,可以提供對 Hadoop 生態系統的安全訪問控制。Ranger 為開發者提供了一種可擴展的框架,可以進行統一的數據安全管理,內置包括對 Hadoop、Hive、HBase、Kafka 等多個組件的訪問控制。
Ranger 內置並沒有提供 Spark 的許可權控制插件,需要開發者自己實現,基於 Ranger 數棧實現了 Spark SQL 對庫、表、列和 UDF 的訪問許可權控制、行級別許可權控制和數據脫敏三方面的許可權管理與控制。接下來我們分兩部分對其實現原理進行講解,分別是自定義 Ranger 插件和 Spark SQL Extensions 機制。
自定義 Ranger 插件
在 Ranger 中添加一個新服務的許可權校驗可分為兩部分:第一部分是為 Ranger 增加新服務模塊;第二部分是在新服務中增加 Ranger 許可權校驗插件。
● Ranger 增加新服務模塊
Ranger 增加新服務模塊是在 Ranger Admin Web UI 界面增加對應服務模塊,用來為對應服務添加對應資源的授權策略。新服務模塊增加可以分為以下三個步驟:
• 為新服務定義描述文件,文件名為 ranger-servicedef-< serviceName>.json,在描述文件中定義了服務的名字、在 ranger admin web 界面中顯示的名稱、新服務訪問類定義、需要用來進行許可權校驗的資源列表和需要進行校驗的訪問類型列表等。
ranger-servicedef-< serviceName>.json 內容主要部分參數解析如下:
{
"id":"服務id,需要保證唯一",
"name":"服務名",
"displayName":"在Ranger Admin Web UI上顯示的服務名",
"implClass":"在Ranger Admin內部用於訪問新服務的實現類",
// 定義新服務用於許可權校驗的資源列表,如Hive中的database、table
"resources":[
{
"itemId": "資源id, 從1開始遞增",
"name": "資源名",
"type": "資源類型,通常為string和path",
"level": "資源層級,同一層級的會在一個下拉框展示",
"mandatory": "是否為必選",
"lookupSupported": "是否支持檢索",
"recursiveSupported": false,
"excludesSupported": true,
"matcher": "org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
"validationRegEx":"",
"validationMessage": "",
"uiHint":"提示信息",
"label": "Hive Database",
"description": "資源描述信息"
}
],
// 定義資源需要進行校驗的訪問類型列表,如select、create
"accessTypes":[
{
"itemId": "訪問類型id, 從1開始遞增",
"name": "訪問類型名稱",
"label": "訪問類型在Web界面上的顯示名稱"
}
],
"configs":[
{
"itemId": "配置參數id, 從1開始遞增",
"name": "配置參數名稱",
"type": "參數類型",
"mandatory": "是否必填",
"validationRegEx":"",
"validationMessage": "",
"uiHint":"提示信息",
"label": "在Web界面上的顯示名稱"
}
]
}
• 開發 Ranger 中新服務模塊對應的實現類,並將該類名填寫到 ranger-servicedef-< serviceName>.json 中 implClass 欄位上。新服務模塊的實現類需要繼承抽象類 RangerBaseService,RangerBaseService 是 Ranger 中所有服務的基類,它定義了一組公共方法和屬性,以便所有服務都可以共用和繼承。RangerBaseService 提供了基本功能,如訪問控制,資源管理和審計跟蹤等。
開發新服務模塊的實現類是比較容易的,通過繼承 RangerBaseService 並實現 validateConfig 和 lookupResource 兩個方法即可,validateConfig 方法是用來驗證服務的配置是否正確,lookupResource 方法定義了載入資源的方法。
• 第一步和第二部完成後分別將配置文件 ranger-servicedef-< serviceName>.json 和新服務模塊對應的實現類 jar 包放到 Ranger Admin 的 CLASSPATH 中,並使用 Ranger Admin 提供的 REST API 向 Ranger 註冊定義的服務類型,這樣就能在 Ranger Admin UI 界面看到新服務的模塊並能通過界面配置對應許可權控制。
● 新服務中增加 Ranger 許可權校驗插件
新服務中要實現 Ranger 的許可權校驗需要開發對應的許可權控制插件並註冊到新服務中,該插件實現的時候需要在服務中找到一個切入點來攔截資源的訪問請求並調用 Ranger API 來授權訪問。接下來介紹一下 Ranger 許可權校驗插件開發中比較重要的4個類:
• RangerBasePlugin:Ranger 許可權校驗的核心類,主要負責拉取策略、策略緩存更新及完成資源訪問的許可權校驗
• RangerAccessResourceImpl:對鑒權資源進行封裝的實現類,調用鑒權介面時需要構造這麼一個類
• RangerAccessRequestImpl:請求資源訪問的實現類,包含鑒權資源的封裝對象、用戶、用戶組、訪問類型等信息,調用鑒權介面 isAccessAllowed 時需要將 RangerAccessRequestImpl 作為參數傳入
• RangerDefaultAuditHandler:審計日誌的處理類
實現 Ranger 許可權校驗插件分為以下步驟:
• 編寫目標類繼承 RangerBasePlugin,通常只需要在目標類實現的構造方法中調用父類的構造函數並填入對應的服務類型名稱和重寫 RangerBasePlugin 的 init 方法併在重寫的 init 方法中調用父類的 init 方法。
RangerBasePlugin 的 init 方法中實現了策略的拉取並會啟動一個後臺線程定時更新本地緩存的策略。
• 編寫承上啟下的類,用於配置在目標服務中能夠攔截目標服務所有的資源請求並能調用 RangerBasePlugin 的 isAccessAllowed 方法進行資源請求鑒權。對於 Spark SQL 實現 Ranger 的許可權校驗來說我們基於 Spark SQL 的 Extensions 機制(後文會進行講解),通過自定義一個 Spark Extensions 註冊到 Spark 中來在 SQL 語法解析階段通過遍歷生成的抽象語法樹完成資源訪問的許可權校驗。
Spark SQL Extensions 機制
Spark SQL Extensions 是在 SPARK-18127 中被引入,提供了一種靈活的機制,使得 Spark 用戶可以在 SQL 解析的 Parser、Analyzer、Optimizer 以及 Planner 等階段進行自定義擴展,包括自定義 SQL 語法解析、新增數據源等等。
SparkSessionExtensions 為 Spark SQL Extensions 機制的核心類,SparkSessionExtensions 保存了用戶自定義的擴展規則,包含以下方法:
• buildResolutionRules:構建擴展規則添加到 Analyzer 的 resolution 階段
• injectResolutionRule:向 Analyzer 的 resolution 階段註冊擴展規則生成器
• buildPostHocResolutionRules:構建擴展規則添加到 Analyzer 的 post-hoc resolution 階段
• injectPostHocResolutionRule:向 Analyzer 的 post-hoc resolution 階段註冊擴展規則生成器
• buildCheckRules:構建擴展檢查規則,該規則將會在 analysis 階段之後運行,用於檢查 LogicalPlan 是否存在問題
• injectCheckRule:註冊擴展檢查規則生成器
• buildOptimizerRules:構建擴展優化規則,將在 optimizer 階段被調用執行
• injectOptimizerRule:註冊擴展優化規則生成器
• buildPlannerStrategies:構建擴展物理執行計劃策略,用於將 LogicalPlan 轉換為可執行文件
• injectPlannerStrategy:註冊擴展物理執行計劃策略生成器
• buildParser:構建擴展解析規則
• injectParser:註冊擴展解析規則生成器
基於 Spark SQL Extensions 機制實現自定義規則會很容易,首先編寫類實現 Function1[SparkSessionExtensions, Unit] ,SparkSessionExtensions 作為函數入參,調用 SparkSessionExtensions 對應方法將自定義的解析規則註冊到對應的 SQL 解析階段執行,然後將編寫的類通過參數 spark.sql.extensions 指定註冊到 Spark 中。
Spark SQL許可權控制在數棧中的實踐
Spark 在數棧中主要應用於離線數倉的場景,對離線數據進行批處理。大多數場景下數據大多都是存在業務庫中的如 MySQL、Oracle 等,在數棧上會先使用 ChunJun 進行數據採集將數據從業務庫同步到 Hive 庫的 ODS 層,然後通過 Hive 或者 Spark 引擎進行數據的批處理計算,最後再通過 ChunJun 將結果數據同步到對應業務庫中。
對應的業務庫大多都是關係型資料庫,每個關係型資料庫也都已經具有非常完善的許可權管理機制,在早期的數棧中是缺少對 Hive 上數據的安全管控的,這也就導致 Hive 上的數據可以被每個用戶獲取查看,缺少了數據隱私保護。
為瞭解決 Hive 數據安全的問題,我們選擇了使用 Ranger 來對 Hive 進行許可權控制。
Ranger 是一個非常全面的數據安全管理框架,它提供了 Web UI 供用戶進行許可權策略設置,使得 Ranger 更加易用。Ranger 安全相關的功能也十分豐富,管控力度更細,支持資料庫表級別許可權管理,也支持行級別過濾和數據脫敏等非常實用的功能。對 Ranger 進行擴展也比較靈活,在 Ranger 上能夠很輕鬆實現一個新服務的許可權管控。
在數棧上 Spark 用來處理 Hive 中的數據,Hive 使用 Ranger 進行了數據的許可權管控,所以為了保證數據安全數棧基於 Ranger 自研了 Spark SQL 的許可權管控插件。
上文我們提到為一個新服務自定義 Ranger 許可權管控插件分為兩部分來完成,第一部分是在 Ranger Admin Web UI 界面增加對應的服務模塊,考慮到 Spark 只用來處理 Hive 中的數據所以在許可權策略這個地方應該要和 Hive 保持一致,所以在 Spark SQL 基於 Ranger 實現許可權控制插件時沒有重覆造輪子而是直接復用 HADOOP SQL 服務模塊,和 Hive 共同使用同一套策略,所以我們只需要在 Spark 端開發 Ranger 的許可權管理插件。
基於 Spark SQL Extensions 機制,我們編寫了類 RangerSparkSQLExtension,併在該類中將實現好的鑒權 Rule、行級過濾 Rule 和數據脫敏 Rule 通過調用 SparkSessionExtensions.injectOptimizerRule 方法註冊將到 SQL 解析的 Optimizer 階段。
以數據脫敏 Rule 為例,當匹配到數據脫敏的 Rule 後,該 Rule 會為 Logical Plan 增加一個 Project 節點並增加 masking_function 函數調用的邏輯。通過下圖展示匹配數據脫敏 Rule 前後的變化,以 select name from t1 where id = 1 為例:
總結
數棧一直致力於數據的安全和隱私保護,實現 Spark SQL 基於 Ranger 的許可權控制是數棧在數據安全探索的其中一點。本文講述了基於 Ranger 實現 Spark SQL 許可權校驗的原理,基於 Ranger 賦予了 Spark SQL 在許可權管控方面,更強的管控力度、更豐富的能力。
未來在保證安全的前提下數棧將對性能進行進一步的優化,比如將許可權校驗 Rule 註冊到 SQL 優化器上,可能會被執行多次增加,這樣就會增加一些不必要的鑒權。期待大家對數棧的持續關註。
《數棧產品白皮書》:https://www.dtstack.com/resources/1004?src=szsm
《數據治理行業實踐白皮書》下載地址:https://www.dtstack.com/resources/1001?src=szsm
想瞭解或咨詢更多有關袋鼠雲大數據產品、行業解決方案、客戶案例的朋友,瀏覽袋鼠雲官網:https://www.dtstack.com/?src=szbky
同時,歡迎對大數據開源項目有興趣的同學加入「袋鼠雲開源框架釘釘技術qun」,交流最新開源技術信息,qun號碼:30537511,項目地址:https://github.com/DTStack