暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

项目经验分享:实现 Apache Pulsar 与 Apache Ranger 的功能集成

开源之夏 2021-08-01
830

点击上方蓝字关注我们



暑期2021项目研发正在火热进行中,开源之夏公众号面向广大社区及项目承担学生征稿,欢迎大家热情分享:

发送投稿文章至官方联络邮箱:

summer@iscas.ac.cn

添加公众号小编微信投稿:


本期分享来自 Apache Pulsar 社区的符鑫同学(实现 Apache Pulsar 与 Apache Ranger 的功能集成)的项目经验分享。


项目名称:

实现Apache Pulsar 与 Apache Ranger的功能集成


项目综述

Apache Pulsar主要是一个消息系统,Apache ranger是一个集中式的安全管理框架。项目要做的是基于Apache ranger为Apache pulsar实现一个新的授权框架。


项目步骤

  1. 明确项目问题,规划解决方案

  2. 搜集资料,寻找相似问题

  3. 分析问题,理解架构原理

  4. 制定方案,实施解决


项目实施:

• 明确项目问题,规划解决方案

Apache Pulsar主要是一个消息系统,Apache ranger是一个集中式的安全管理框架。我们要做的是通过Apache Ranger为Apache Pulsar实现一个新的授权框架。具体实现 

pulsar-broker-common/src/main/java/org/apache/pulsar/borker中的Authentication和Authorization

接口以及基于Apache Ranger实现Authentication和Authorization接口。

• 搜集资料,寻找相似问题

分析理解项目需求后,我们首先借助搜素引擎找到与之相似或相同的话题,通过了解Apache Pulsar、Apache Ranger-Hadoop、Apache Ranger-Hive、Apache Ranger-HBase、Apache Ranger-Kafka、Apache Ranger-YARN等这些问题的产生背景和架构原理可以找到我们项目需求的相似点

• 分析问题,理解架构原理

Apache Pulsar是一个用于服务器到服务器的消息系统,具有多租户、高性能等优势,最初由Yahoo开发,目前由Apache软件基金会管理



property/tenant:一个property代表一个租户,一个property可包含多个namesapce;假设部署了一个Pulsar集群来支持多个应用程序,在企业中每个property都可以代表一个团队,一个核心的功能或者一个产品线

namespace:是Plusar的基本管理单元,在namespace级别可可设置permission,备份fine-tune,跨集群管理消息,数据的地理复制geo-replocation、消息TTL等;一个namaspace里的所有topic都继承相同的设置

topic:一种通道,用作从produceer到consumer传输消息,持久(默认,硬盘)和非持久(仅内存)


  Aapche Pulsar消息订阅

Aapche Pulsar支持exclusive、shared、failover三种消息订阅模式,这三种模式示意图如下:



• Exclusive模式(独占模式)是pulsar默认的消息订阅模式,在这种模式下,只能有一个consumer消息消息,一个订阅关系中中只能有一台机器消费每个topic,如果有多于一个consumer消费此topic则会出错。

• Failover模式下,一个topic也只是只有单个消费消费一个订阅关系的消息,与Exclusive模式不同之处在于,Failover模式下,每个消费者会被排序,当前面的消费者无法连上broker后,消息会由下一个消费者消费。


Apache Ranger通过访问控制策略提供了一种标准的授权方法。作为标准,Apache Ranger提供了一种集中式的组件,用于审计用户访问行为和管理组件间的安全交互行为。

Apache Ranger架构

Apache Ranger是由三个部分组件:Ranger Admin、Ranger Plugin、User Sync

• Ranger Admin

Ranger Admin是Ranger的核心模块,它内置了一个Web管理页面,用户可以通过这个Web管理界面或者REST接口来制定安全策略。

• Agent Plugin

Agent Plugin是嵌入到Hadoop生态组件中的插件,它定期从Ranger Admin拉去策略并执行,同时记录操作记录以供审计。

• User Sync

User Sync将操作系统用户/属组(Users/Groups)的权限数据同步到Ranger的数据库中。

它们之间的关系如下图所示:


Apache Ranger优点


提供了细粒度级(hive列级别)
基于访问策略的权限模型
权限控制插件式,统一方便的策略管理
支持审计日志,可以记录各种操作的审计日志,提供统一的查询接口和界面
丰富的组件支持(HDFS、HBSAE、HIVE、YARN、KAFKA、STORM)
支持和kerberos的集成
提供了Rest接口供二次开发

• 制定解决方案


  编译器:Intellij IDEA 2019.3

JDK:1.8.0_211

Maven:3.8.1

Ranger:3.0.0

Pulsar:2.9.0

 

基于上述版本的环境,参考Apache Pulsar、Apache Ranger各官网文档分别实现如下接口功能:

AuthorizationProvider

AuthorizationService

MultiRolesTokenAuthorizationProvider

PulsarAuthorizationProvider

RangerPlusarAuthorization

RangerPlusarAuthorizationService

 项目进度:

• 首先开始安装配置Intellij IDEA 2019.3


依次安装配置JDK等,由于在mac下开发就必须使用这个非常好用的mac包管理器Homebrew,仅需执行相应的命令,就能下载安装需要的软件包,可以省掉自己去下载、解压、拖拽(安装)等繁琐的步骤。

Homebrew怎么安装?

方法一:brew官网的安装脚本


执行命令:/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

这时很可能出现一个问题就是下载极其龟速或者直接出现如下提示:

curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused

curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused

要问题是因为不稳定 http://raw.githubusercontent.com不稳定


方法二:brew镜像安装脚本

/usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install)"

亲测速度立刻快得飞起来,一下子就可以安装完成,最后出现Installation successful !或者Checking out files:100%(5392/5392),done. 说明安装成功。输入brew install maven 、brew install JDK1.8.0_211安装完成依赖,终端输入mvn -v


说明maven 3.8.1安装成功。

终端输入java --version

说明JDK1.8.0_211安装成功

 

• 其次就需要在Intellij IDEA下配置maven,目前常用的开发工具Intellij IDEA、Eclipse都自身集成了一个版本maven、JDK。但是通常我们使用自己已经配置好的maven、JDK。

Intellij IDEA下配置maven,可以看到下图已经使用红框勾选出了要配置具体操作

1:此处修改为自己解压maven目录

2、勾选Override,修改为自己目录下的settings.xml目录

3、修改为自己的本地仓库地址,一般会自动识别


此处勾选,当修改pom文件时,maven就可以自动帮我们导入依赖


这样配置结束会让开发过程非常的方便高效并且提高开发的乐趣。

• 接下来要开始正式编码实现AuthorizationProvider、AuthorizationService

MultiRolesTokenAuthorizationProvider、PulsarAuthorizationProvider

RangerPlusarAuthorization、RangerAuthorizationService的接口实现。

Ranger部分的实现我是主要参考hadoop、kafka那些接口去具体实现的,因为Ranger中发现访问权限模型是抽象成“用户-资源-权限”并且Ranger主要是根据这种抽象关系,伸展出自己的权限模型,三者关系如下:

Service = List<Policy>

Policy =  List<Resource> + AllowACL + DenyACL

AllowACL = List<AccessItem> allow + List<AccssItem> allowException

DenyACL = List<AccessItem> deny + List<AccssItem> denyException

AccessItem = List<User/Group> + List<AccessType>

 

关于权限这部分,为什么AllowACL和DenyACL需要分别对应两组AccessItem?这是因为由具体使用场景引出的设计:

以AllowACL为例,假定我们要将资源授权给一个用户组G1,但是用户组里某个用户G1除外,这时只要增加一条包含G1的AccessItem到AllowACL_allow,同时增加一条包含U1的AccessItem到AllowACL_allowException即可,类似原理可反推DenyACL.

 

既然Policy有(allow,allowException,deny,denyException)这四组AccessItem,那么判断用户最终权限的决策过程是怎样?

总体来说,四组AccessItem的作用优先级由高到低依次是:denyException > deny > allowException > allow

Pulsar里面的authorization是存储到了zookeeper里,也需要把这些换成ranger去实现。

因为Pulsar是Apache软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性,目前社区也是正在建设和发展过程中,很多源代码解释、架构原理等资料可以去Pulsar的公众:ApachePulsar去了解,在这里就不赘述过多了。

总之就这样项目代码的实现就开始了,目前只是完成Pulsar部分的代码实现,Ranger正在编写过程中。

AuthorizationProvider部分代码展示:


AuthorizationService部分代码展示:


MultiRolesTokenAuthorizationProvider部分代码展示:


PulsarAuthorizationProvider部分代码展示:


RangerPlusarAuthorization部分代码展示:


RangerAuthorizationService的接口正在实现中.........


项目总结


大家目前看到以上成果是7月19日开始推进至7月29日刚好10天,这10天中从刚开始非常既很懵又不懂的状态,记忆特别深刻的是凌晨叨扰Apapche Pulsar社区的张勇老师,同时问出了很多在现在看来是非常小白的问题。在开始项目前自身的认知只是停留在对于大数据框架业务层面应用水平,在这样从0 to 1的探索过程不知不觉发现对于Kafka、Pulsar、Ranger、Hadoop等Apache旗下开源框架项目的原理构造等更加深入了解其内涵联系。


很感谢Summer 2021开源之夏,让我结识了张勇导师以及一群小伙伴,深入了解开源、大数据、Plusar等等收获,更重要的是让自己的技术有很大提升,希望开源之夏越来越好。


欢迎大家持续关注ApacheCon组委会首次针对亚太地区将于2021年8月6-8日举办的ApacheCon在线会议。Apache Pulsar社区积极参与本次年度开源盛会,你在消息系统、大数据、流处理等专场都能看到Apache Pulsar社区成员的议题,内容丰富、欢迎关注!!


下面将相关技术议题列出,方便参考:

[1] ApacheCon Asia: 

https://apachecon.com/acasia2021/zh/
[2] 使用 Hashicorp Vault 建立一个认证和授权系统: 

https://apachecon.com/acasia2021/zh/sessions/1119.html
[3] 结构化的数据流: 

https://apachecon.com/acasia2021/zh/sessions/1023.html
[4] 使用 Pulsar Functions 处理实时机器学习: 

https://apachecon.com/acasia2021/zh/sessions/1028.html
[5] Apache BookKeeper (作为 Key-value 存储) 及其应用案例: 

https://apachecon.com/acasia2021/zh/sessions/1054.html
[6] BIGO 的 Apache Pulsar 最佳实践: 

https://apachecon.com/acasia2021/zh/sessions/1056.html

[7] 从 Apache Kafka 到 Apache Pulsar - 系统迁移生存指南: 

https://apachecon.com/acasia2021/zh/sessions/1057.html
[8] Apache Pulsar 在联邦学习的案例详解: 

https://apachecon.com/acasia2021/zh/sessions/1058.html
[9] Apache Pulsar 在日志场景的最佳实践:

https://apachecon.com/acasia2021/zh/sessions/1060.html
[10] Apache Pulsar —— 云原生消息队列在腾讯云的实践: 

https://apachecon.com/acasia2021/zh/sessions/1047.html
[11] Apache Pulsar 在腾讯百万级 Topic 下的应用与实践: 

https://apachecon.com/acasia2021/zh/sessions/1048.html
[12] Apache Pulsar 的 RBAC授权: 

https://apachecon.com/acasia2021/zh/sessions/1049.html
[13] Apache Pulsar 在华为云物联网平台之旅: 

https://apachecon.com/acasia2021/zh/sessions/1059.html


欢迎各位朋友积极报名观看线上演讲,了解更多的大数据、云原生等领域最新技术动态,深入了解Apache Pulsar,这里可以结识更多认同开源和技术的小伙伴,在日常交流中带来很大启发。


欢迎大家添加我微信:Kodaline_ki  大家可以互相学习交流、互相促进。欢迎志同道合的伙伴交个朋友。



文章转载自开源之夏,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论