提高資料的安全性和可控性,數棧基於 Ranger 實現的 Spark SQL 許可權控制實踐之路

數棧DTinsight發表於2023-05-17

在企業級應用中,資料的安全性和隱私保護是極其重要的。 作為 之一,必須確保資料只能被授權的人員訪問,避免出現資料洩露和濫用的情況。為了實現Spark SQL 對資料的精細化管理及提高資料的安全性和可控性,數棧基於 實現了 Spark SQL 對資料處理的 。

本文基於 Apahce Spark 2.4.8 和 Apache Ranger 2.2 進行原理講解,和大家聊聊「 」基於 Ranger 在 Spark SQL 許可權控制上的實踐探索之路。

基於Ranger實現Spark SQL許可權控制

Apache Ranger 是一個開源的許可權管理框架,可以提供對 的安全訪問控制。Ranger 為開發者提供了一種可擴充套件的框架,可以進行統一的 ,內建包括對 Hadoop、Hive、HBase、Kafka 等多個元件的訪問控制。

Ranger 內建並沒有提供 Spark 的許可權控制外掛,需要開發者自己實現,基於 Ranger 數棧實現了 Spark SQL 對庫、表、列和 UDF 的訪問許可權控制、行級別許可權控制和資料脫敏三方面的許可權管理與控制。接下來我們分兩部分對其實現原理進行講解,分別是自定義 Ranger 外掛和 。

自定義 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 中,並使用 提供的 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 中來在 SQL 語法解析階段透過遍歷生成的抽象語法樹完成資源訪問的許可權校驗。

Spark SQL Extensions 機制

Spark SQL Extensions 是在 SPARK-18127 中被引入,提供了一種靈活的機制,使得 Spark 使用者可以在 SQL 解析的 Parser、Analyzer、Optimizer 以及 Planner 等階段進行自定義擴充套件,包括自定義 SQL 語法解析、新增資料來源等等。

file

為 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 將結果資料同步到對應業務庫中。

file

對應的業務庫大多都是關係型資料庫,每個關係型資料庫也都已經具有非常完善的許可權管理機制,在早期的數棧中是缺少對 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 的許可權管理外掛。

file

基於 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 為例:

file

總結

數棧一直致力於資料的安全和隱私保護,實現 Spark SQL 基於 Ranger 的許可權控制是數棧在資料安全探索的其中一點。本文講述了基於 Ranger 實現 Spark SQL 許可權校驗的原理,基於 Ranger 賦予了 Spark SQL 在許可權管控方面,更強的管控力度、更豐富的能力。

未來在保證安全的前提下數棧將對效能進行進一步的最佳化,比如將許可權校驗 Rule 註冊到 SQL 最佳化器上,可能會被執行多次增加,這樣就會增加一些不必要的鑑權。期待大家對數棧的持續關注。

《資料治理行業實踐白皮書》下載地址:


《數棧V6.0產品白皮書》下載地址:


想了解更多有關袋鼠雲大資料產品、行業解決方案、客戶案例的朋友,瀏覽袋鼠雲官網:https://www.dtstack.com/?src=szitpub


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69995740/viewspace-2952718/,如需轉載,請註明出處,否則將追究法律責任。

相關文章