基于ranger的presto账号权限管理及事件监听方案
Posted Ivan-范
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于ranger的presto账号权限管理及事件监听方案相关的知识,希望对你有一定的参考价值。
背景:我司为解决hive数据分析慢问题,部署了presto 347版本集群。同时即席分析平台采用开源产品superset 1.0版本。
为满足公司业务场景,需开发以下功能解决认证及审计等问题。
- jdbc等连接方式(开发同学专用)需验证ranger账号密码并通过ranger进行库表权限验证。
- superset登录(数据分析同学使用)需验证公司sso账号,且superset端所有同学共用一个presto数据源连接,需单独设计权限认证方式。
- 开发事件监听器,用于用户SQL查询情况审计等。
一、账号密码认证
经调研presto支持Password Authenticator接口的开发,可以在createAuthenticatedPrincipal()方法中实现自己的认证逻辑,最终返回
Principal对象用于之后的 System Access Control权限验证。经调研presto 347版本已支持 ranger的权限验证,ranger最低版本为2.0.0。
还有一个问题就是通过 presto jdbc传输密码必须开启https认证。我们为规避繁琐的服务端证书认证环节采用nginx做转发的方案完成。
即客户端开启ssl认证,nginx安装证书接收https请求并转发http请求到服务端。
具体方案如下:
- System Access Control权限认证采用ranger方案。
- 基于Password Authenticator接口开发ranger账号密码认证逻辑。
- 部署nginx做请求转发。
下面分别介绍下各步骤的具体实现:
1.配置权限认证
第一步配置属性文件:
第二步在Presto中安装Presto Plugin,这个网上有很多教程这里就不详细介绍了。很多同学公司原来只有hive集群,现在搭建了presto集群想和原有的hive库表权限共用。
我们发现阿里是自己实现了逻辑让presto和hive一起去读取presto中的hive权限,这个方案也不错。我们的方案是同步一份ranger中历史的hive权限到presto空间中,
然后在权限系统中开发统一申请接口,为新用户同时开通两份相同的权限到ranger的两个空间中。好处是特殊情况下我们可以给同一个用户对hive和presto开通不同的访问权限。
2.账号密码认证
这里需要自己开发插件并注册到presto中。
首先需要在pom文件中引入presto-spi依赖
每个插件标识一个入口点:Plugin接口的一个实现 。这个类名通过标准 Java ServiceLoader接口提供给 Presto :类路径包含在 META-INF/services目录下的以io.prestosql.spi.Plugin命名的资源文件。该文件的内容是一行列出插件类的名称:com.example.authenticator.RangerPasswordAuthenticatorPlugin。
需要实现一个plugin接口:
工厂类实现PasswordAuthenticatorFactory接口:
核心认证类实现PasswordAuthenticator接口:
最终返回一个带用户名的Principal:new BasicPrincipal(username),该用户名用于第一步中的权限认证。
插件开发完需要注册到presto中:
<1>添加配置文件:
<2>在plugin目录下创建名为ranger-password-authenticator的目录,并把相关依赖包放入。这里有个注意点就是presto打包时需要使用assembly把相关依赖都打到包里。
3.nginx请求转发
nginx conf文件内容如下:
我们是把证书安装到了nginx服务器,通过nginx解析https请求并转发http请求到presto coordinator 上。
二、superset连接认证
为让公司同学更方便使用superset平台,我们需开发公司sso账号登录功能,这一步已完成了用户的身份认证。同样为方便同学们使用superset平台查询presto
离线数据,我们默认为用户建好了统一的数据源连接,但是该连接的账号及密码经过Password Authenticator认证后无法控制住用户库表权限,因为server端
无法识别具体的连接用户。经过我们调研,superset本身支持模拟presto用户,这样我们就可以在Password Authenticator中为superset用户预留一个口子,
通过连接中的唯一复杂密码作为token来识别superset的连接。
具体方案如下:
1.superset模拟用户连接并开启https连接。
2.Password Authenticator接口单独处理superset连接。
3.System Access Control权限认证还是走ranger方案就好了。
下面分别介绍下各步骤的具体实现:
1.superset数据源配置
开启模拟用户,并配置连接协议为https。
2.单独处理superset请求
这块还是在上面的presto-password-authenticator插件中的createAuthenticatedPrincipal方法里实现就好了。
3.System Access Control
因为上面经过模拟用户presto server已经能拿到登录superset的用户了,而且经过自己的逻辑已成功的把登录用户信息转发给了System Access Control模块,所以权限验证模块逻辑不需要做任何改动。
三、SQL审计
经调研,presto支持自定义的事件监听器的开发。基于该接口我们可以开发自定义日志记录、调试以及性能分析插件。我们借助该功能可以实现多事件下查询作业的指标收集、格式化、持久化工作,持久化的目的地为mysql。
事件监听器的开发和上面的密码验证器的插件开发相似,这里有些环节就简单说一下吧。
同样需要在services里注册插件实现类,事件监听器工厂类中的getName方法返回的名字和配置文件中要一致。
事件监听器类需要实现事件监听器接口,并根据需求重写queryCreated,queryCompleted,splitCompleted等方法。
Presto 支持为以下事件调用的自定义事件侦听器:
- queryCreated 查询创建
- queryCompleted 查询完成(成功或失败)
- splitCompleted 拆分完成(成功或失败)
此功能支持开发自定义日志记录、调试和性能分析插件。
我们这里是做sql的一个审计所以只实现了queryCompleted方法,核心逻辑如下。
插件写完注册方法和上面的密码验证器也是一样的。
经过上面两个presto插件的开发我们就完成了密码登录验证及SQL审计等功能,presto是插件化架构所以开发部署还是相对简单的,
有些复杂的是完整一套的权限账号及审计方案的制定,希望本文能给当前正在基于presto搭建公司离线加速分析系统的同学提供一定帮助。
禁止转载。
以上是关于基于ranger的presto账号权限管理及事件监听方案的主要内容,如果未能解决你的问题,请参考以下文章
提高数据的安全性和可控性,数栈基于 Ranger 实现的 Spark SQL 权限控制实践之路
HDFSYarnHive…MRS中使用Ranger实现权限管理全栈式实践