背景:我司为解决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请求到服务端。

具体方案如下:

  1. System Access Control权限认证采用ranger方案。
  2. 基于Password Authenticator接口开发ranger账号密码认证逻辑。
  3. 部署nginx做请求转发。

下面分别介绍下各步骤的具体实现:

1.配置权限认证

第一步配置属性文件:

android xmpp监听消息发送状态是否成功 permission监听_presto

 

第二步在Presto中安装Presto Plugin,这个网上有很多教程这里就不详细介绍了。很多同学公司原来只有hive集群,现在搭建了presto集群想和原有的hive库表权限共用。

我们发现阿里是自己实现了逻辑让presto和hive一起去读取presto中的hive权限,这个方案也不错。我们的方案是同步一份ranger中历史的hive权限到presto空间中,

然后在权限系统中开发统一申请接口,为新用户同时开通两份相同的权限到ranger的两个空间中。好处是特殊情况下我们可以给同一个用户对hive和presto开通不同的访问权限。

2.账号密码认证

android xmpp监听消息发送状态是否成功 permission监听_hive_02

 

这里需要自己开发插件并注册到presto中。

首先需要在pom文件中引入presto-spi依赖

android xmpp监听消息发送状态是否成功 permission监听_大数据_03

 

每个插件标识一个入口点:Plugin接口的一个实现 。这个类名通过标准 Java ServiceLoader接口提供给 Presto :类路径包含在 META-INF/services目录下的以io.prestosql.spi.Plugin命名的资源文件。该文件的内容是一行列出插件类的名称:com.example.authenticator.RangerPasswordAuthenticatorPlugin。

需要实现一个plugin接口:

android xmpp监听消息发送状态是否成功 permission监听_hive_04

工厂类实现PasswordAuthenticatorFactory接口:

android xmpp监听消息发送状态是否成功 permission监听_大数据_05

核心认证类实现PasswordAuthenticator接口:

android xmpp监听消息发送状态是否成功 permission监听_事件监听器_06

最终返回一个带用户名的Principal:new BasicPrincipal(username),该用户名用于第一步中的权限认证。

插件开发完需要注册到presto中:

<1>添加配置文件:

android xmpp监听消息发送状态是否成功 permission监听_presto_07

<2>在plugin目录下创建名为ranger-password-authenticator的目录,并把相关依赖包放入。这里有个注意点就是presto打包时需要使用assembly把相关依赖都打到包里。

android xmpp监听消息发送状态是否成功 permission监听_大数据_08

3.nginx请求转发

nginx conf文件内容如下:

android xmpp监听消息发送状态是否成功 permission监听_ci_09

我们是把证书安装到了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数据源配置

android xmpp监听消息发送状态是否成功 permission监听_presto_10

 

android xmpp监听消息发送状态是否成功 permission监听_hive_11

开启模拟用户,并配置连接协议为https。

2.单独处理superset请求

这块还是在上面的presto-password-authenticator插件中的createAuthenticatedPrincipal方法里实现就好了。

android xmpp监听消息发送状态是否成功 permission监听_ci_12

3.System Access Control

因为上面经过模拟用户presto server已经能拿到登录superset的用户了,而且经过自己的逻辑已成功的把登录用户信息转发给了System Access Control模块,所以权限验证模块逻辑不需要做任何改动。

三、SQL审计

经调研,presto支持自定义的事件监听器的开发。基于该接口我们可以开发自定义日志记录、调试以及性能分析插件。我们借助该功能可以实现多事件下查询作业的指标收集、格式化、持久化工作,持久化的目的地为MySQL。

android xmpp监听消息发送状态是否成功 permission监听_presto_13

事件监听器的开发和上面的密码验证器的插件开发相似,这里有些环节就简单说一下吧。

同样需要在services里注册插件实现类,事件监听器工厂类中的getName方法返回的名字和配置文件中要一致。

事件监听器类需要实现事件监听器接口,并根据需求重写queryCreated,queryCompleted,splitCompleted等方法。

android xmpp监听消息发送状态是否成功 permission监听_presto_14

 

Presto 支持为以下事件调用的自定义事件侦听器:

  • queryCreated 查询创建
  • queryCompleted 查询完成(成功或失败)
  • splitCompleted 拆分完成(成功或失败)

此功能支持开发自定义日志记录、调试和性能分析插件。

我们这里是做sql的一个审计所以只实现了queryCompleted方法,核心逻辑如下。

android xmpp监听消息发送状态是否成功 permission监听_presto_15

插件写完注册方法和上面的密码验证器也是一样的。

android xmpp监听消息发送状态是否成功 permission监听_ci_16

经过上面两个presto插件的开发我们就完成了密码登录验证及SQL审计等功能,presto是插件化架构所以开发部署还是相对简单的,

有些复杂的是完整一套的权限账号及审计方案的制定,希望本文能给当前正在基于presto搭建公司离线加速分析系统的同学提供一定帮助。

禁止转载。