B站基于Apache Ranger的大数据权限服务的技术演进

                                                              01 背景

随着云计算、大数据技术的日趋成熟,复杂多元、规模庞大的数据所蕴含的经济价值和社会价值逐步凸显,数据安全也是企业面临的巨大挑战,B站一直致力于对用户隐私数据的保护。

                                                      02 Ranger概述

 2.1 用户认证

提到安全,就不得不提及用户认证,Hadoop默认是没有安全认证的,用户可以伪装成任意用户访问集群,存在巨大安全隐患。Hadoop 1.x 版本以后就已经加入了Kerberos认证机制,只有经过认证的用户才可以访问集群,目前我们数据平台的客户端及早期开放给用户的一些开发客户端已经全部接入了Kerberos。

 2.2 Ranger介绍

Kerberos只是控制集群的登录,相当于一把钥匙打开了进入集群操作的大门,并没有实现用户操作权限的管理,因此我们引入Ranger做权限管理。

Ranger提供一个集中式安全管理框架,它可以对Hadoop生态的组件如HDFS、Yarn、Hive、HBase等进行细粒度的数据访问控制,基本覆盖现有技术栈的组件。通过操作Ranger控制台和REST API,可以轻松的通过配置策略来控制用户访问权限。

我们使用的Ranger是基于1.2.0版本改造的,部署了2台写节点和2台读节点并接入公司的负载均衡系统来实现读写分离,用户在申请Hive表或者HDFS path,交接表或者交接任务时,会发送请求给Shielder(Shielder是工具侧的授权服务),授权时接入写节点的LB,shielder会通过LB调用Ranger Admin的REST API进行权限操作,Ranger Admin将相关policy持久化到DB,赋权完成后Shielder还会通过LB调用读节点的REST API进行权限预检,预检通过后用户申请权限的流程就结束了。

读节点的Ranger Admin会定时的从DB中全量load policy,plugins在poll policy时,Ranger Admin会将内存中的policy返回给嵌入在各个大数据组件的plugins。

                                                      03 HDFS Path鉴权

 3.1 授权接口的改造

原生的Ranger授权接口需要传入RangerPolicy,对于工具层需要给HDFS表路径或者非表路径授权比较繁琐,因此我们改造了授权接口,只需要传入四个参数,如下:

  • service : ranger service name,用于识别service

  • type:path或者table,用于识别是为表赋权还是为路径赋权

  • resources:具体的HDFS路径或者Hive表

  • access:具体的权限类型,read或者write

如果type是table,会根据resources中的table,通过Hive Metastore(HMS) client获取table location,再根据路径查找相关policy是否存在来决定是更新还是创建。

 3.2 Ranger Admin的改造

由于我们使用的Ranger版本需要全量load policy,原生的Ranger Admin load policy是从DB中串行的读取,数据读出来以后放在List中,通过ListIterator将各部分的数据拼接成Policy,拼接后如果检查到有的ListIterator还有next,说明在读数据是有policy发生了变化,需要重新读数据,这样load policy的时间就不可控了。为了降低Admin load policy的时间,我们将从DB中读数据的操作由串行改成并行,我们使用Map存放Policy数据,并取消了ListIterator对不齐时需要二次读数据的机制,这样虽然可能会导致在读数据的时候新增的access可能匹配不上item,但是在下一次读取的时候必然会匹配上,一次load policy的误差是在我们的接受范围内的。由于我们使用Map做policy拼接,读取item及access时的order by操作就可以取消了。

例如读access的query就由

select obj from XXPolicyItemAccess obj, XXPolicyItem item      where obj.policyItemId = item.id            and item.policyId in (select policy.id from XXPolicy policy where policy.service = :serviceId)      order by item.policyId, obj.policyItemId, obj.order

变成

select obj from XXPolicyItemAccess obj, XXPolicyItem item      where obj.policyItemId = item.id            and item.policyId in (select policy.id from XXPolicy policy where policy.service = :serviceId)

目前我们HDFS有约18万的policy,70万的policy item,200万的policy item access,去掉order by后load access可以节约4s左右的时间,整体load policy的时间在25s左右。

 3.3 灰度上线

为了鉴权可以优雅的上线,减少因权限问题导致的任务失败,我们在HDFS plugin端增加了鉴权模式,支持按group(一个部门对应一个group)灰度上线鉴权功能,鉴权模式分为ALWAYS_ALLOW,ALWAYS_DENY和BY_HADOOP_ACL,鉴权时在没有匹配到policy的情况下才会用上述鉴权模式进行检查,若模式为ALWAYS_ALLOW的情况下,会检查user的group是不是在strict group中,strict group可以通过配置文件配置,支持hadoop命令刷新,更新strict group配置后不用重启namenode就可以使其生效。在strict group中的user为严格鉴权,如果没有相关policy会拒绝访问HDFS,否则允许其访问,同时打印越权日志,可以根据越权日志决定为用户补权限。在所有的部门组灰度完成以后,鉴权模式切换到ALWAYS_DENY即可。

 3.4 权限预检

由于权限生效会有一定的延迟,工具侧在调用Ranger api赋权以后,没办法感知权限是否生效,往往会发生工单流程已经走完,用户还是没有的权限的情况。再者我们在排查user是否有一个路径权限时,可能会因为父路径权限的影响,排查起来会繁琐一些,因此我们在Admin端开发了权限预检查的接口,支持传入user,库表及相应的权限类型,返回权限检查是否成功。

根据传入的HDFS Path,User和Accesses的类型构建RangerAccessRequest,通过RangerPolicyRepository的getLikelyMatchPolicyEvaluators方法获取evaluators,遍历evaluators计算得到result。同时会启动一个 线程定时的从RangerServicePoliciesCache中获取ServicePolicies,用于更新RangerPolicyRepository,频率与plugin poll policy的频率相同。

                                                          04 Hive Table鉴权

 4.1 HDFS鉴权的痛点

HDFS鉴权在使用的过程中遇到了一些问题,比如table owner没有权限drop自己的表情况,对于管理表来说,drop表时会删除相应的表路径,对于HDFS来说删除路径需要父路径的write权限,但是该用户又没有库的写权限,导致drop表失败。还有比如view的HDFS路径与相应表的HDFS路径是同一个,如果只回收表的权限,相当于回收了HDFS路径的权限,用户即使还有view的权限,在访问HDFS的时候就会失败。而且HDFS鉴权也只能到path级别,无法进行更细粒度的鉴权和数据脱敏,因此我们引入了Hive Table鉴权。

 4.2 Hive授权接口

Ranger各个service之前的policy是相互独立的,HDFS plugin在鉴权的时候只关心HDFS的policy,因此我们在Hive的授权的同时会将Hive的权限类型转换成HDFS的权限为HDFS赋权。

 4.3 Hive Metastore远程鉴权及数据脱敏

Ranger所有的Plugin的load policy的机制都是相同的,需要请求Ranger Admin获取policy,将Policy缓存到内存并持久化到磁盘,这对于像HiveServer2,Spark Thrift Server和Kyuubi这样的长服务来说是可以接受的,但是对于像Hive Cli和Spark Sql这样的短任务,load policy会消耗大量的时间,内存和磁盘,也会增加Ranger Admin的负载。

因此,我们将鉴权和脱敏的功能放到Hive Metastore 中去做,实现了一个类似于Hive Plugin的Hive MetaStore Plugin,Hive Metastore新增了鉴权和脱敏两个接口。

鉴权

将鉴权的请求参数封装到CheckPrivilegesBag中,无论是Hive还是Spark只要构建好CheckPrivilegesBag请求HMS即可。

struct CheckPrivilegesBag {  1: HiveOperationObjectType hiveOperationObjectType, // 操作类型  2: list<HiveObjectPrivileges> inputPrivileges, // 输入表信息  3: list<HiveObjectPrivileges> outputPrivileges, // 输出表信息  4: HiveAuthzContextObject hiveAuthzContext,  5: string user,}

脱敏

row filter和column masking需要传入HiveAuthzContextObject,list<HiveObjectPrivileges>和user。

list<HiveObjectPrivileges> apply_row_filter_and_column_masking(1:HiveAuthzContextObject hiveAuthzContextObject,    2: list<HiveObjectPrivileges> objectPrivileges, 3: string user) throws(1:MetaException o1)

 4.4 Spark Ranger

Spark Ranger是通过inject Rule和Strategy解析plan来实现鉴权和脱敏的,改造成通过HMS鉴权,需要将SparkOperationType和SparkPrivilegeObject转换成对应的HiveOperationType和HivePrivilegeObject。

由于用来鉴权的RangerSparkAuthorizerExtension Rule可能会被执行多次,会做一些不必要的鉴权,带来额外的时间开销,查询表比较多的query在耗时上会更加明显。我们会将鉴权成功的输入表/字段和输出表/字段的相关信息缓存起来,下一次鉴权时首先剔除掉缓存中已通过鉴权的表/字段,如果剩余的不为空,再继续请求HMS鉴权

目前我们Spark和Hive已经全接入了HMS鉴权和数据脱敏,对于数据脱敏中的column masking,我们正在用的策略(部分)有:

另外,我们在使用spark ranger做column masking的时候也遇到了一些问题,比如对于sql:

select col_1, col_2 from tbl_1 union select col_3, col_4 from tbl_2

如果col_2和col_4的policy是不同的,终col_4的数据也会使用col_2的making policy,因为spark ranger的做法是在外层加一个Project,这样就会导致col_4的policy失效。

我们将Project推到Relation层,替换掉有making的column,在Project中将经过masking处理后的column cast成原始的column,执行计划就变成:

 4.5 Presto Ranger

鉴于Presto Coordinator为常驻服务,从Ranger Admin获取并加载policy所带来的消耗是可接受的,因此我们在Presto Ranger Plugin上进行改造。社区鉴权逻辑为:首先定期请求Ranger Admin获取Presto相关的policy并将其拉取到本地,其次在Presto每次进行语义分析的时候,对当前表及字段的权限进行校验。对上述鉴权逻辑进行分析,我们不难发现社区的鉴权方式需要在Admin侧单独维护Presto相关的policy,而在我们的场景中大部分的权限需求还是在Hive中,为不同引擎各自维护一套policy无疑会增加运维成本,因此我们对其做了些改造,使其兼容Hive的policy。其实现方式并不复杂,一方面,将拉取Presto policy替换为拉取Hive policy;另一方面,将原先Presto plugin的3段式进行改造兼容Hive的格式。目前我们的Presto Ranger支持了表/字段、column masking和row filter的权限控制。

                                                       05 未来规划

 5.1 增量Load Policy

即使我们优化了load policy的逻辑,plugin权限生效的时间也要在25s以上,而且随着policy的增加,这个时间还将进一步增加,Ranger-2.0.0版本已经支持了增量Load Policy功能,下半年我们也会参考社区做增量化改造,降低权限生效时间,预估能到1s内。

 5.2 HDFS融合Hive Policy

Hive鉴权通过以后,任务访问HDFS还需要再经过HDFS的鉴权,这样就需要维护Hive和HDFS两份Policy,而且也不能解决前面提到的table owner无法删除自己的表的情况,下一步我们会将Hive Policy与HDFS Plugin融合起来,HDFS Plugin中维护一份table location数据,在检查路径权限时,首先检查路径对应的Hive Table是否有相应的权限,如果有就可以通过权限检查,如果没有匹配到table再检查HDFS Policy。

 5.3 HDFS鉴权前置到NNProxy

目前我们HDFS有20+组的NS,每一组NS都要连接Ranger Admin获取policy,无疑增加了Ranger Admin的压力,后面我们考虑将HDFS鉴权的操作前置到NNProxy中去做,同时也能降低NameNode的处理时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何取安全的密码?

写在前面&#xff1a;在数字信息时代&#xff0c;密码安全是网络安全的重要组成部分。一旦密码泄露&#xff0c;就可能导致个人敏感信息被非法获取&#xff0c;从而造成财产损失和隐私泄露。因此&#xff0c;选择一个安全的密码至关重要。 现在&#xff0c;我将为您分享一些创建…

小程序上拉触底节流处理

原理&#xff1a; 在onReachBottom中进行节流处理&#xff0c;如果当前正在请求下一页的数据&#xff0c;则把后续所有的请求都屏蔽掉&#xff0c;如果当前没有请求任何数据&#xff0c;才允许发起下一页数据的请求。 实现步骤&#xff1a; 在data中定义isloading节流阀 fal…

iMazing如何备份手机资料 iPhone的资料可以传到iPad里吗 iphone备份到mac 苹果导入备份

在当今信息化快速发展的时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。随着资料的积累&#xff0c;备份手机数据成了一个重要的问题。本文将介绍iMazing如何备份手机资料&#xff0c;并为大家解答“iPhone的资料可以传到iPad里吗”这一问题。这不仅可以帮助你有效管…

Android 软件盘的弹出和消失的监听

监听接口 OnKeyboardListener.java public interface OnKeyboardListener {void onKeyboardHidden();void onKeyboardShow(int keyboardHeight);} KeyBoardUtil.java public class KeyBoardUtil {private final static String TAG "KeyBoardUtil";public PopupWi…

2024-简单点-观察者模式

先看代码&#xff1a; # 导入未来模块以支持类型注解 from __future__ import annotations# 导入抽象基类模块和随机数生成器 from abc import ABC, abstractmethod from random import randrange# 导入列表类型注解 from typing import List# 定义观察者模式中的主体接口&…

出海企业如何从海外云手机中受益?

随着全球化的推进&#xff0c;越来越多的企业开始将目光投向海外市场。然而&#xff0c;不同国家和地区的网络环境、政策限制&#xff0c;以及语言文化的差异&#xff0c;给出海企业的市场拓展带来了诸多挑战。在这一背景下&#xff0c;海外云手机作为一种新兴解决方案&#xf…

npm ERR! code CERT_HAS_EXPIREDnpm ERR! errno CERT_HAS_EXPIRED

解决npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to 分析过后这个问题是证书过期的意思 考虑到其他的原因 这里给出三个解决方案 一&#xff1a; 清除npm缓存 npm cache clean --force 取消ssl验证&#xff1a; npm config set strict-…

Fastgpt配合chatglm+m3e或ollama+m3e搭建个人知识库

概述&#xff1a; 人工智能大语言模型是近年来人工智能领域的一项重要技术&#xff0c;它的出现标志着自然语言处理领域的重大突破。这些模型利用深度学习和大规模数据训练&#xff0c;能够理解和生成人类语言&#xff0c;为各种应用场景提供了强大的文本处理能力。AI大语言模…

ARL资产侦察灯塔系统

1、资产侦察灯塔系统搭建 1.1、系统要求 目前暂不支持 Windows&#xff0c;Linux 和 MAC 建议采用 Docker 运行&#xff0c;系统配置最低 2 核 4G。 由于自动资产发现过程中会有大量的的发包&#xff0c;建议采用云服务器可以带来更好的体验 实验环境&#xff1a; 系统&…

c++命令行解析开源库cxxopts上手教程

文章目录 cxxopts快速入门1. cmake环境配置2. 定义解析的规则3. 使用例子 cxxopts 简介 cxxopts是一个轻量级的C命令行解析库&#xff0c;它提供了易于使用的API来定义和解析命令行选项。它支持多种类型的选项&#xff0c;并且允许用户自定义选项的处理逻辑。 项目地址&#x…

【Django】使用captcha自动创建验证码

目录 1.安装 django-simple-captcha模块 2. 在INSTALLED_APPS设置中添加对其配置类的引用 3.迁移数据库 4.添加路由 5.在自定义的登录表单中添加验证码字段 6.在视图函数中验证验证码 7.在html模板中使用验证码 1.安装 django-simple-captcha模块 pip install django-si…

H82409S千兆网络变压器在网络防雷器中的应用

论文题目&#xff1a;H82409S千兆网络变压器在网络防雷器中的应用 摘要&#xff1a; 本论文探讨了H82409S千兆网络变压器在网络防雷器中的应用。随着网络技术的不断发展&#xff0c;网络设备的稳定性和安全性变得越来越重要。网络防雷器作为保护网络设备免受雷击和电磁干扰的重…

Vivado Design Suite中的Routing优化

Vivado Routing&#xff08;路由器&#xff09;可以在已布局的设计上进行布线(Routing)&#xff0c;并对已布线的设计进行优化&#xff0c;以解决保持时间违规问题。 一、路由器 Vivado路由器从已布局的设计开始&#xff0c;并尝试对所有网络进行布线。它可以从未布线、部分布…

Python教程:深入了解Python垃圾回收机制

1. 简介 在Python中&#xff0c;垃圾回收&#xff08;Garbage Collection&#xff09;是一种自动管理内存的机制&#xff0c;它可以自动识别和清理不再使用的对象&#xff0c;释放它们占用的内存空间&#xff0c;以提高内存利用率和程序性能。 2. 引用计数 引用计数是一种简单…

微信小程序(六)定位搜索

一、引言 作者上一章讲了微信小程序的地图实现微信小程序&#xff08;五&#xff09;地图-CSDN博客&#xff0c;但是还有一个功能是和地图紧密结合的&#xff0c;那就是位置搜索定位&#xff0c;这里作者讲讲实现和原理&#xff0c;包括城市筛选。 二、定位搜索实现 1、位置搜…

如何选择适用于Mac的文件恢复软件?适用于 Mac 的最佳数据恢复软件清单

有人会说&#xff0c;我们的数字生活正变得几乎和我们的物理生活一样重要。我们在线工作&#xff0c;将记忆保存在数码照片库中&#xff0c;在信使中交流&#xff0c;并保留各种文档的数字扫描。 每个人都知道备份是必不可少的。建议每天至少同步一个数字备份&#xff08;例如…

Lua语法(六)——面相对象编程

参考链接&#xff1a; 系列链接: Lua语法(一) 系列链接: Lua语法(二)——闭包/日期和时间 系列链接: Lua语法(三)——元表与元方法 系列链接: Lua语法(四)——协程 系列链接: Lua语法(五)——垃圾回收 系列链接: Lua语法(六)——面相对象编程 使用Lua表 进行类的模拟&#xff0…

10个经典Python设计模式解析

大家好&#xff01;今天咱们来聊聊Python编程中的那些“武林秘籍”——设计模式。它们就像编程界的暗号&#xff0c;让你的代码更加优雅、高效。让我们一起揭开这些模式的神秘面纱&#xff0c;看看它们在实际项目中的神奇作用吧&#xff01; 1. 工厂模式&#xff08;Factory P…

Day23_学点儿IDEA_单元测试@Test在新module项目中失效、Jackson核心对象 ObjectMapper识别不到

版本 IntelliJ IDEA 2023.2.4 目录结构 Study(Project) ├──JavaSE(Module) │ └──xxxx └──JavaWeb(Module)└──xxxx问题 1.1 在JavaSE项目中正常可以用的单元测试Test&#xff0c;到了JavaWeb项目中不起作用了 1.2 解决方法 如果是新创建的项目&#xff0c;先…

物联网全栈智能应用实训系统

物联网全栈智能应用实训系统是一款集硬件、软件、网络、数据分析与应用开发于一体的综合性实训平台。它旨在帮助学习者全面掌握物联网技术的各个环节&#xff0c;从硬件设备选型、通信协议理解、软件开发、数据分析到应用部署&#xff0c;都能得到充分的实践锻炼。 一、产品构…