Apache Ranger插件的美丽简洁

如果您在这里,您已经知道什么是Apache Ranger 。 它是管理Hadoop框架中安全性的最流行(即使不是唯一)的方法。 它与Active Directory,Kerberos和其他各种身份验证集成在一起,但是我认为最有趣的功能是其授权支持。 作为Hadoop生态系统的一部分,人们会对它对Hadoop生态系统中的大多数框架(Hive,HBase,HDFS等)具有内建的支持(通过插件)感到惊讶,但是,我发现旋转它实际上非常容易自己的游侠自定义插件。

这篇文章将重点介绍Ranger插件中设计的简单性,并展示为自己构建一个插件有多么容易。 作为示例,我们将构建一个Ranger插件,用于管理对使用Akka HTTP编写的简单HTTP服务的访问。

Note : You are not required to know about Akka HTTP to follow this post. All you needed to know is that Akka HTTP is just a way (albeit, a great way) to build HTTP services

这篇文章后面的代码分为两个存储库:

  1. Ranger HTTP插件
  2. 护林员托管的Akka HTTP服务

写一个插件

为了重申我们在这里试图做的事情,我们将编写一个REST服务,并让Ranger管理它的授权。

编写Ranger插件实际上是两部分的问题–编写服务器端组件应用程序端组件

  1. 服务器端组件是驻留在Ranger端的代码/配置。
  2. 应用程序端组件是驻留在我们的REST服务中的代码,该代码调用Ranger服务并检查应用程序的最终用户是否有权访问他所请求的资源。

我们将详细研究这两件事。 让我们尝试首先编写服务器端组件。

1.服务器端组件:

作为启发,如果我们打开Ranger代码库 ,我们可以看到一些内置插件。

Apache Ranger插件

如图所示,在Ranger代码库中,我们有许多插件,我们想添加自己的插件。

Apache Ranger插件

放大上图,插件上的服务器端组件将意味着编写一个

  1. servicedef配置
  2. 继承RangerBaseService的类

因此,实际上需要在服务器端实现“一个”配置和“一个”类。

Apache Ranger插件

1. SERVICEDEF配置

让我们看一下Hive的servicedef配置:

Apache Ranger插件

我认为,我们在这里谈论三件事:

A.资源:

在Hive示例中,对于Kafka,我们要保护的“资源”是数据库 ,对于HDFS,我们要保护的“资源”是Kafka 主题 ,它将是文件路径 。 对于我们的HTTP服务,我们试图保护的资源是REST slug 。 我们称之为“路径”。

"resources": [{"itemId": 1,"name": "path","type": "path","level": 10,"parent": "","mandatory": true,"lookupSupported": true,"recursiveSupported": true,"excludesSupported": true,"matcher": "org.apache.ranger.plugin.resourcematcher.RangerPathResourceMatcher","matcherOptions": {"wildCard": true,"ignoreCase": true},"validationRegEx": "","validationMessage": "","uiHint": "","label": "HTTP Path","description": "HTTP Path"}
访问类型:

访问类型只是意味着用户需要的访问类型–例如,对于Hive来说, selectcreatedelete就是示例。 对于HDFS, readwriteexecute是示例。 对于Kafka, 发布使用 。 对于我们的HTTP服务,访问类型将为HTTP方法– GETPOSTDELETE

"accessTypes": [{"itemId": 1,"name": "get","label": "get"},{"itemId": 2,"name": "post","label": "post"},{"itemId": 3,"name": "delete","label": "delete"}]
C.配置:

我们知道Ranger可以管理多个Kakfa主题,HDFS和HBase群集的安全性。 每个服务都将在不同的主机中运行,并且对每个服务进行身份验证的方式将有所不同。 捕获此信息的地方将是此configs部分。 为了简化本示例,我们不关心HTTP服务的身份验证。 因此,我们只是捕获了可以ping通的URL,以确保我们的服务已启动并正在运行。

"configs": [{"itemId": 1,"name": "services_list_url","type": "string","subType": "","mandatory": true,"validationRegEx": "","validationMessage": "","uiHint": "","label": "HTTP URL for the services list eg. http://localhost:8080/services"}]

2.继承RANGERBASESERVICE的类

RangerBaseService插件实现服务器端组件的第二部分和最后一部分是编写一个继承RangerBaseService的类。

Apache Ranger插件

该类希望重写两个函数:

  1. validateConfig :请记住servicedef的configs部分。 显然,我们将接受这些参数的值,对吗? 现在,这个validateConfig是我们验证传递的值的地方。 对于我们的HTTP服务,我们在配置中接受的只是services_list_url 。 现在,该功能的实现将是使用一个简单的HTTP客户端ping并检查服务是否已启动并正在运行。
class RangerServiceHTTP extends RangerBaseService {override def validateConfig(): util.Map[String, AnyRef] = {if (configs.containsKey("services_list_url")) {val serviceUp = HttpServiceClient.isServiceUp(configs.get("services_list_url"))if (serviceUp) retSuccessMap() else returnFailureMap()}else {returnFailureMap()}}
  1. lookupResource :这是一个有趣的功能。 考虑以下屏幕截图。
Apache Ranger插件

稍后,当我们配置访问策略时,我们将在其中配置资源 。 现在,此功能用于查找和自动填充这些资源。 假设,如果我们要输入HDFS资源或Hive表,那么选项的数量就很多,而且很容易打错字。 对于Hive,此功能将连接到metastore并为我们填充表和数据库。

对于HTTP服务,请记住service_list_url ? 该URL将仅返回逗号分隔的REST资源列表。 为了实现此功能,我只是再次调用服务并标记响应。

override def lookupResource(resourceLookupContext: ResourceLookupContext): util.List[String] = {val serviceUrl = configs.get("services_list_url")HttpServiceClient.getServicePaths(serviceUrl).asJava}

现在,作为代码的最后一步,我们需要将RangerServiceHTTP这个类和servicedef配置联系在一起。 我们这样做的方法是通过在implClass属性中配置类。 还要注意,我们正在将该Ranger插件的名称配置为httpservice

{"name": "httpservice","label": "HTTP Service","description": "Rudimentary Ranger plugin to enforce security on top of a HTTP Service","guid": "b8290b7f-6f69-44a9-89cc-06b6975ea676","implClass": "com.arunma.ranger.http.RangerServiceHTTP",
* *   "version": 1,"isEnabled": 1,"resources": [{"itemId": 1,"name": "path",......

完整的配置如下所示 。

还有两个较小的管理步骤:

  1. 为了确保我们的类在Ranger类路径上可用,我们将其捆绑到一个jar中,并将其放在<RANGER_HOME>/ews/webapp/WEB-INF/classes/ranger-plugins/httpservice 。 文件夹httpservice的名称与servicedef配置中声明的名称相对应。
Apache Ranger插件
  1. 将我们的配置上传到Ranger中,以便我们的服务在Ranger UI中可见。
curl -u admin:admin -X POST -H "Accept: application/json" -H "Content-Type: application/json" --data @http-ranger.json http://localhost:6080/service/plugins/definitions

重新启动Ranger服务器。

耶! 现在,我们在Ranger UI上看到HTTPSERVICE

Apache Ranger插件

2.应用程序侧组件:

在应用程序方面,事情再简单不过了。 为了使用Ranger中使用的策略,应用程序需要做的就是调用Ranger并检查用户是否有权访问资源。 该函数从字面上称为isAccessAllowed

Apache Ranger插件

以下代码几乎是需要在应用程序端编写的所有代码:

package com.arunma.rangerimport org.apache.ranger.plugin.audit.RangerDefaultAuditHandler
import org.apache.ranger.plugin.policyengine.{RangerAccessRequestImpl, RangerAccessResourceImpl}
import org.apache.ranger.plugin.service.RangerBasePluginimport scala.collection.JavaConverters._object RangerAuthorizer {lazy val plugin = {val plg = new RangerBasePlugin("httpservice", "httpservice")plg.setResultProcessor(new RangerDefaultAuditHandler)plg.init()plg}def authorize(path: String, accessType: String, userName: String, userGroups: Set[String] = Set("public")): Boolean = {val resource = new RangerAccessResourceImpl()resource.setValue("path", path)val request = new RangerAccessRequestImpl(resource, accessType, userName, userGroups.asJava)val result = plugin.isAccessAllowed(request)result != null && result.getIsAllowed}
}

RangerBasePlugin("httpservice", "httpservice")init()函数用作我们进入Ranger服务的入口。 注意RangerBasePluginhttpservice参数。 该名称必须与servicedef配置中提供的名称匹配。

authorize函数是拦截器在客户端被授予对REST资源的访问权之前调用的函数。 该函数只是构造一个AccessRequest – RangerAccessRequestImpl并调用插件的isAccessAllowed函数,该函数返回Boolean

拦截器指令 authorize调用isRangerAuthorized函数,然后在RangerAuthorizer中调用authorize函数。

def isRangerAuthorized(path: String, httpMethod: String, userName: String): Boolean = RangerAuthorizer.authorize(path, httpMethod.toLowerCase, userName)  lazy val userRoutes: Route =headerValueByName("username") { userName =>extractMethod { method =>pathPrefix("users") {extractMatchedPath { matchedPath =>authorize(isRangerAuthorized(matchedPath.toString(), method.name(), userName)) {concat(pathEnd {concat(get {val users: Future[Users] =(userRegistryActor ? GetUsers).mapTo[Users]complete(users)

我们需要做的最后一件事是将auditsecurity xml复制到我们的类路径中。 这些就像Ranger的站点xmls 。 对于本练习,我们将xmls放置在resources目录中。

audit xml和security xml可以从游侠代码库复制。 如果您正在运行本地管理员,则审核XML可以保持原样,但是需要为我们的服务更改security xml。 实现此目的的最简单方法是从护林员代码库中复制示例xml,然后开始将服务替换为httpservice如下所示:

Apache Ranger插件

还有一个属性,需要特别注意。 这就是名为ranger.plugin.httpservice.service.name的属性。 此属性的值必须与您在Ranger UI中使用的服务名称相同。

<property><name>ranger.plugin.httpservice.service.name</name><value>MyService</value><description>Name of the Ranger service containing policies for this httpservice instance</description>
</property>
Apache Ranger插件

试乘

这将涉及两个步骤

  1. 配置Ranger策略
  2. 验证您的HTTP服务

1.配置范围政策

Apache Ranger插件

2.验证您的HTTP服务

让我们通过启动HTTP服务来验证策略-启动com.arunma.RangerManagedHttpServer

策略配置的用户

curl -X GET -H 'username:arunma' http://localhost:8080/users
Apache Ranger插件

无效的用户

curl -X GET -H 'username:nobody' http://localhost:8080/users
Apache Ranger插件

摘要

Ranger插件有两个部分–服务器端组件和客户端组件。 对于服务器端组件,我们创建了一个servicedeef json和一个继承了RangerBaseService的类。 对于客户端组件,我们只调用了pluginisAccessAllowed函数。

您现在可以使用Ranger授权的HTTP服务。

谢谢阅读。 快乐黑客!

翻译自: https://www.javacodegeeks.com/2019/05/beautiful-simplicity-apache-ranger-plugin.html

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

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

相关文章

交换机出现电源故障怎么解决?

现如今&#xff0c;随着信息化的飞速发展&#xff0c;工业交换机作为信息流通的承载者&#xff0c;可以说是应用最为广泛的网络设备之一&#xff0c;其作用不言而喻&#xff0c;因此工业交换机的选择是十分重要的。但是工业交换机在长期运行过程中&#xff0c;难免会出现一些故…

MCGS用户程序云端授权系统设计

MCGS用户程序云端授权系统设计 基于HTTP请求通过外接串口服务器实现MCGS组态屏&#xff08;TPC7062Ti&#xff09;云端授权系统搭建&#xff0c;重点讲解如何实现系统对时&#xff08;基于UDP协议的NTP对时协议&#xff09;、加密算法的选择、加密算法的设计与实现。 算法实现…

「技术」室内定位—AOA测距算法,定位精度可达1m

什么是AOA测距&#xff1f; 到达角度测距(Angle-of-Arrival&#xff1a;AOA)&#xff1a;基于信号到达角度的定位算法是典型的、基于测距的定位算法&#xff0c;在无线传感网络应用中&#xff0c;AOA&#xff08;到达角度测距&#xff09;作为网络节点自定位一种常见的定位算法…

飞畅科技-交换机的三种交换方式详解

交换机是一种用于电&#xff08;光&#xff09;信号转发的网络设备&#xff0c;它可以为接入交换机的任意两个网络节点提供独享的电信号通路。交换机拥有一条高带宽的背部总线和内部交换矩阵&#xff0c;在同一时刻可进行多个端口对之间的数据传输&#xff0c;交换机的传输模式…

MCGS组态屏通过E90-DTU数传电台实现PLC远程控制

一&#xff0e;案例简介 通过使用成都亿佰特电子科技有限公司开发的E90-DTU(230SL30-ETH)_V2.0结合E90-DTU(230SL30)实现串口屏远程控制PLC。 二&#xff0e;硬件准备 昆仑通态&#xff08;MCGS&#xff09;-TPC7062(TX)串口控制屏&#xff1b; 施耐德TM221系列PLC&#xf…

交换机的作用是什么?交换机功能及工作原理详解!

交换机有多个端口&#xff0c;每个端口都具有桥接功能&#xff0c;可以连接一个局域网或一台高性能服务器或工作站。实际上&#xff0c;交换机有时被称为多端口网桥。那么&#xff0c;交换机的作用是什么&#xff1f;交换机的功能及工作原理是什么&#xff1f;接下来我们就一起…

数传电台实现PLC远程控制中MCGS参数配置与查询

1、施耐德PLC 施耐德IPv4参数查询以及是否能使Modbus Server&#xff0c;通过查询TM221手册可获取端口为502&#xff0c;不同的PLC端口可能不同&#xff0c;一般公司都将502作为Modbus Serve默认端口。 2.串口屏&#xff08;MCGS组态屏&#xff09; 打开MCGS嵌入版软件&#…

使用Apache JMeter负载测试Web应用程序

Apache JMeter是模拟网络应用程序上的用户负载以测试性能的出色工具。 您可以通过指定用户数量和请求之间的时间间隔轻松地构建测试计划&#xff0c;然后JMeter将为每个用户生成一个线程并访问您的Web应用程序。 在测试结束时&#xff0c;您将获得一份性能摘要报告&#xff0c;…

IoT物联网无线通信模块该如何选择?

目前大多数物联网&#xff08;IoT&#xff09;的节点都是使用ZigBee技术来进行组网的&#xff0c;然后通过gateway&#xff08;网关&#xff09;来连接网络。但是ZigBee模块的优势并不明显&#xff0c;也有很多公司正在开发新的无线模块来代替它&#xff0c;例如lora模块、蓝牙…

交换机端口故障问题解决方法

工业交换机可以说是工业安防工程中很重要的一款设备&#xff0c;在网名使用工业交换机的过程中&#xff0c;难免会遇到一些故障问题&#xff0c;在这其中工业交换机的端口故障可以说是是最常见的硬件故障&#xff0c;无论是光纤端口还是双绞线的RJ-45端口&#xff0c;在插拔接头…

[渝粤教育] 温州医科大学 医用高等数学 参考 资料

教育 -医用高等数学-章节资料考试资料-温州医科大学【】 函数的概念和性质随堂测验 1、【单选题】函数的定义域是&#xff08; &#xff09; A、 B、 C、 D、 参考资料【 】 2、【单选题】设f(x)是定义在R上的一个函数&#xff0c;则函数F(x)f(x)-f(-x)在R上一定是&#xff08;…

如何正确使用工业级交换机?

工业交换机具有电信级性能特征&#xff0c;可耐受严苛的工作环境&#xff0c;产品系列丰富&#xff0c;端口配置灵活&#xff0c;可满足各种工业领域的使用需求。那么&#xff0c;我们在使用工业级交换机的过程中该如何正确使用呢&#xff1f;接下来就跟随飞畅科技的小编一起来…

[渝粤教育] 盐城工学院 无机及分析化学C 参考 资料

教育 -无机及分析化学C-章节资料考试资料-盐城工学院【】 第一章 线上单元作业 第一章 单元测验 1、【单选题】下列数据中有效数字为四位的是 A、0.017 B、0.5810 C、0.202 D、pH11.21 参考资料【 】 2、【单选题】以下测量数据明确为4位有效数字的是 A、pKb 5.652 B、5010 C、…

什么是工业光纤环网交换机?

环网交换机就是可以组建环形网络的交换机&#xff0c;与其他类型交换机相比&#xff0c;具有稳定、自愈时间段等优点。每个环网交换机上有两个用于组环的端口&#xff0c;交换机之间通过手拉手形式构成了环形的网络拓扑。此外&#xff0c;环网交换机采用了某些特殊技术&#xf…

[渝粤教育] 苏州大学文正学院 网络互联技术与实践 参考 资料

教育 -网络互联技术与实践-章节资料考试资料-苏州大学文正学院【】 计算机网络互联设备随堂测验 1、【单选题】网桥处理的是 A、脉冲信号 B、MAC 帧 C、IP 包 D、ATM 包 参考资料【 】 2、【单选题】交换机工作在 OSI 七层的哪一层 A、一层 B、二层 C、三层 D、三层以上 参考资…

什么是工业级交换机?工业交换机作用有哪些?

最近有很多朋友来问我&#xff0c;什么是工业级交换机&#xff0c;跟商用交换机有什么区别。今天&#xff0c;咱们在这里具体来介绍下什么是工业交换机。工业交换机&#xff0c;即应用于工业控制领域的以太网交换机设备&#xff0c;无论是在性能还是作用方面都与普通交换机有很…

[渝粤教育] 西北大学 数据结构 参考 资料

教育 -数据结构-章节资料考试资料-西北大学【】 数据结构的基础概念随堂测验 1、【单选题】一个抽象类型包括数据对象、 和一组处理数据的操作。 A、数据对象中各元素间的结构关系 B、数据元素集 C、接口 D、数据对象集 参考资料【 】 2、【填空题】抽象数据类型具有 、信息隐蔽…

visualvm远程jvm_如何使用VisualVM监视服务器上的多个JVM

visualvm远程jvm在上一篇文章中&#xff0c;我向您展示了如何使用单个管理员服务器和多个托管服务器启动WebLogic Server。 这些启动之后&#xff0c;您如何检查它们的健康状况&#xff1f; 您可以使用管理员的/ console网络应用。 但是&#xff0c;所有默认Oracle / Open JDK …

[渝粤教育] 西南石油大学 岩体力学 参考 资料

教育 -岩体力学-章节资料考试资料-西南石油大学【】 第一章测试 1、【单选题】大部分岩体属于&#xff08; &#xff09;。 A、均质连续材料 B、非均质材料 C、非连续材料 D、非均质、非连续、各向异性材料 参考资料【 】 2、【单选题】岩石的弹性模量一般指&#xff08; &…

如何区别标准POE交换机和非标POE交换机

通俗的说&#xff0c;POE交换机就是支持网线供电的交换机&#xff0c;其不但可以实现普通交换机的数据传输功能还能同时对网络终端进行供电。那么&#xff0c;我们该如何来区别如何区别标准POE交换机和非标POE交换机呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细看看…