提高数据的安全性和可控性,数栈基于 Ranger 实现的 Spark SQL 权限控制实践之路

这篇具有很好参考价值的文章主要介绍了提高数据的安全性和可控性,数栈基于 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 语法解析、新增数据源等等。

提高数据的安全性和可控性,数栈基于 Ranger 实现的 Spark 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 将结果数据同步到对应业务库中。

提高数据的安全性和可控性,数栈基于 Ranger 实现的 Spark SQL 权限控制实践之路

对应的业务库大多都是关系型数据库,每个关系型数据库也都已经具有非常完善的权限管理机制,在早期的数栈中是缺少对 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 的权限管理插件。

提高数据的安全性和可控性,数栈基于 Ranger 实现的 Spark SQL 权限控制实践之路

基于 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 为例:

提高数据的安全性和可控性,数栈基于 Ranger 实现的 Spark SQL 权限控制实践之路

总结

数栈一直致力于数据的安全和隐私保护,实现 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文章来源地址https://www.toymoban.com/news/detail-446812.html

到了这里,关于提高数据的安全性和可控性,数栈基于 Ranger 实现的 Spark SQL 权限控制实践之路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GPT 大模型的应用路线图:可控性是最强路标 | The Roadmap of Generative AI

        目录 生成式AI的应用路线图:可控性是最强路标 | The Roadmap of Generative AI 

    2024年02月09日
    浏览(20)
  • 航空航天大数据:如何提高飞行安全性

    航空航天领域的大数据技术应用已经成为提高飞行安全性的关键手段。随着航空航天技术的发展,飞行数据的规模和复杂性不断增加,这为航空航天领域的大数据分析提供了广阔的空间。在这篇文章中,我们将从以下几个方面进行阐述: 背景介绍 核心概念与联系 核心算法原

    2024年04月10日
    浏览(21)
  • 数据建模与区块链:利用区块链技术提高数据安全性

    作者:禅与计算机程序设计艺术 《13. \\\"数据建模与区块链:利用区块链技术提高数据安全性\\\"》 引言 1.1. 背景介绍 随着信息技术的迅速发展,数据规模日益增长,数据的重要性也日益凸显。数据建模是保证数据安全性和有效性的重要手段之一。传统的数据建模方法主要依赖于各

    2024年02月13日
    浏览(21)
  • [足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-4系统的可控性Controllability(LTI)线性时不变

    本文仅供学习使用 本文参考: B站:DR_CAN

    2024年01月25日
    浏览(21)
  • 如何提高Linux系统安全性

    Linux 是一种开源操作系统,被世界各地的个人、企业和政府广泛使用。然而,与任何其他操作系统一样(甚至是更),Linux 也容易受到安全威胁,因此采取措施提高系统的安全性非常重要。 提高 Linux 系统安全性的最简单、最有效的方法之一就是定期更新。更新通常包含解决

    2024年01月18日
    浏览(23)
  • 区块链如何提高支付安全性

    信任,但要核实”(Trust, but verify)是前美国总统罗纳德·里根在上世纪80年代讨论美苏关系时使用的标志性口号。有趣的是,这一口号是他从俄罗斯谚语“doveryai,no proveryai”改编而来的。如今,大约35年过去了,这一口号已被重新设计成了区块链社区的一张名片。 这句话看上去

    2024年02月05日
    浏览(25)
  • 如何提高Docker容器的安全性

    随着 Docker 的兴起,越来越多的项目采用 Docker 搭建生产环境,因为容器足够轻量化,可以快速启动并且迁移业务服务,不过在使用的过程中,我们很容易就忽略了项目的安全问题,容器虽然有隔离的作用,但是我们知道,他与虚拟机的架构差距还是比较大的。 虚拟机通过添

    2024年02月08日
    浏览(25)
  • 如何使用云计算来提高公司安全性

    作者:禅与计算机程序设计艺术 云计算是一种在线服务提供商,提供的服务包含虚拟机、存储、数据库等计算、存储、网络资源,可以在互联网上按需使用,可以按使用量付费或者按带宽收费。相对于传统的数据中心部署的方式,云计算最大的优点是灵活性和弹性成本低廉,

    2024年02月05日
    浏览(20)
  • 虚拟现实与虚拟模拟:如何提高安全性和效率

    虚拟现实(Virtual Reality, VR)和虚拟模拟(Virtual Prototyping, VP)是现代计算机技术的重要应用领域。它们在游戏、娱乐、教育、工业生产等多个领域具有广泛的应用前景。然而,随着技术的不断发展,VR和VP系统的安全性和效率也成为了关注的焦点。在本文中,我们将深入探讨VR和VP的

    2024年04月11日
    浏览(14)
  • VLAN——提高网络性能、安全性和灵活性的利器

    VLAN是Virtual Local Area Network的缩写,它是一种通过网络交换机虚拟划分局域网的技术。VLAN可以将一个物理局域网划分成多个逻辑上的虚拟局域网,各个虚拟局域网之间相互独立,彼此隔离,进而提高网络性能、灵活性和安全性。本文将为大家介绍VLAN的工作原理、优点及应用场

    2024年02月07日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包