共计 5682 个字符,预计需要花费 15 分钟才能阅读完成。
在企业级利用中,数据的安全性和隐衷爱护是极其重要的。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=szsf
同时,欢送对大数据开源我的项目有趣味的同学退出「袋鼠云开源框架钉钉技术 qun」,交换最新开源技术信息,qun 号码:30537511,我的项目地址:https://github.com/DTStack