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

来源:https://www.cnblogs.com/DTinsight/archive/2023/05/17/17408117.html
-Advertisement-
Play Games

在企業級應用中,數據的安全性和隱私保護是極其重要的。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 語法解析、新增數據源等等。

file

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

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 優化器上,可能會被執行多次增加,這樣就會增加一些不必要的鑒權。期待大家對數棧的持續關註。

《數棧產品白皮書》: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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文時間 2023-05-14 作者:sugerqube漆瓷 為什麼是Centos7 centos8已經停止維護,centos7將在2024-06-30停止維護(所以暫時選7) 未來替代品參考: AlmaLinux https://almalinux.org/ CloudLinux公司搞得RHEL下 ...
  • 本文首發於公眾號:Hunter後端 原文鏈接:Redis數據結構三之壓縮列表 本篇筆記介紹壓縮列表。 在 Redis 3.2 版本之前,壓縮列表是列表對象、哈希對象、有序集合對象的的底層實現之一。 因為壓縮列表本身結構上的一些缺陷,壓縮列表這個結構被替換了,但是壓縮列表結構本身有一些可取之處,並且替 ...
  • 第一章 外鍵 在實際開發項目中,一個健壯的數據表一定有很好的參照完整性,為保證數據的完整性,需將兩表建立關係。這時可通過外鍵約束來實現 1.1、介紹 什麼是外鍵約束? 在另一張表中引用另一張表的主鍵約束或唯一約束。 例如:如下操作創建表 create table grade( id int prim ...
  • 1.Greenplum資料庫中segment故障檢測 1.1概述 Greenplum資料庫伺服器(Postgres)有一個子進程,該子進程為ftsprobe,主要作用是處理故障檢測。 ftsprobe 監視Greenplum資料庫陣列,它以可以配置的間隔連接並掃描所有segment和資料庫進程。 如 ...
  • DQL語句 1、格式 select 列名*N from 表名 where 查詢條件1 and/or 查詢條件2 group by 列 Having 分組條件 Order by 排序 2、規則 sql在書寫時除了查詢條件外,大小寫都可以 select * from user where uname=' ...
  • [MySQL事務一文搞懂] 1、什麼是事務? 事務(Transaction),顧名思義就是要做的或所做的事情,資料庫事務指的則是作為單個邏輯工作單元執行的一系列操作(SQL語句)。這些操作要麼全部執行,要麼全部不執行。 2、為什麼需要事務 把一系列sql放入一個事務中有兩個目的: 為資料庫操作提供了 ...
  • 摘要:5月16日,“數智深耕 讓美好發生 2023華為雲城市峰會廣州站”成功舉行。 5月16日,“數智深耕 讓美好發生 2023華為雲城市峰會廣州站”成功舉行。大會聚集了眾多城市管理者、產業領袖、企業家和媒體,共同探討工業數字化發展新趨勢,共謀工業數字化發展之路。華為公司副總裁、華為雲中國區總裁張修 ...
  • 前言 從今天開始本系列文章就帶各位小伙伴學習資料庫技術。資料庫技術是Java開發中必不可少的一部分知識內容。也是非常重要的技術。本系列教程由淺入深, 全面講解資料庫體系。 非常適合零基礎的小伙伴來學習。 全文大約 【1297】字,不說廢話,只講可以讓你學到技術、明白原理的純乾貨!本文帶有豐富案例及配 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...