写点什么

浅析 openLooKeng 安全认证机制

用户头像
openLooKeng
关注
发布于: 刚刚
浅析openLooKeng安全认证机制

前言

通过 openLooKeng 的官网https://openlookeng.io/zh-cn/docs/docs/overview.html我们可以知道其支持对外部用户的认证的,主要方式有 Kerberos 和 Password(LDAP)认证,本文主要讲解其认证原理。

认证机制

在了解认证之前不得不提一下 Servlet 中的 FilterChain 的 doFilter 方法的作用如下图示,在客户端和服务器端之间会有很多 filter,通常称为 filter 链。通过 FilterChain 我们可能进行很多的过虑操作。当然我们也可以通过 Filter 对用户时进行认证。其中 openLooKeng 的认证就是在 Filter 中的 doFilter 完成的。



在 openLooKeng 的代码中认证相关的 filter 会在 ServerSecurityModule 类中进行注册,AuthenticationFilter 和 PaswordAuthenticatorManager 就是跟认证相关的。



当然从该模块中我们还知道除了支持 Kerberos 和 Password 认证之外还支持 CERTIFICATE 和 JWT。


当请求来到时会先经过前面注册的 AuthenticationFilter,该类实现了 Filter 的 doFilter 方法,


在其中我们可以看到可以支持内部的认证、webUI 认证和外部认证,这里主要讲解外部内证,



这里会根据配置认证方式进行遍历,并调用对应的认证模式进行认证,认证通过后则进入下一下 Filter 进行处理,最后请求到达服务器端的 rest 接口内部,进行相应 服务处理。

支持的认证方式

前面讲解到会在 doFilter 方法进行认证,其中 Authenticator 是一个接口,看到其中有 4 种实现,下面主要以 Kerberos 和 Password 为例进行讲解。


Kerberos 认证

Kerberos 认证主要在 KerberosAuthenticator 类中完成的,在类初始化的时候会根据配置的信息如 krb5.conf、keytab 和 principal 等信息初始化好 loginContext。当有请求带来时,会从 request 中取出用户信息或是 token 进行认证,如下:



当成功认证后会返回 KerberosPrincipal 继续传递给下一个 Filter。具体的 Kerberos 认证原理可以查看 Kerberos 官网,这里不做详细描述。

Password 认证

除了上面说的支持 Kerberos 的认证外,还支持密码认证,默认支持的是基于 LDAP 的密码认证。密码的认证是主要在 PasswordAuthenticator 类中的 authenticate 完成的,同样的也是从 request 中取出用户名和密码交给 authenticatorManager 进行认证。



目前我们看到 PasswordAuthenticator 的接口只有 LDAP 的实现。



在 LdapAuthenticator 类中认证主要由 authenticate 方法完成的。里面会调用 LDAP 相关的 API 跟 LDAP 服务器进行交互完成认证。


Password 认证框架

其实 openLooKeng 密码认证是以 plugin 方式进加载的,可以解压编译好的包在 plugin 路径下可以看到 password 相关的 plugin。



从代码上看到 PasswordAuthenticatorPlugin 是实现了 Plugin 接口的,其中里面添加了 LdapAutehnticatorFactory。



而 LdapAutehnticatorFactory 类则是实现了 PasswordAuthenticatorFactory 接口,该接口主要提供了两个方法一个 getName 和 create,其中在 LdapAuthenticatorFactory 中 getName 返回的是 ldap,以区别其他密码认证模式,create 方法中则是通过 airlift 框架初始化 LdapAuthenticator 实例,保存在 PasswordAuthenticatorManager 类中,这样当进行密码认证的时候从该类中取出对应的 Authenticator 实例即可。


另外在系统启动的时候,会由 PasswordAuthenticatorManager 调用 addPasswordAuthenticatorFactory 接口加载多个 PasswordAuthenticatorFactory 实现类,如下:



当 plugin 加载完成后再由 PasswordAuthenticatorManager 类调用 loadPasswordAuthenticator 方法完成具体 PasswordAuthenticator 实现的创建:



这个便是 openLooKeng 整个密码认证框架的运行原理。

扩展认证

根据前面的介绍,我们可以看出如果实现自己的认证方式的话,笔者认为可以有两种主要方式:


第一种是基于 persto-main 模块的接口 Authenticator 直接实现自己认证和配置即可。


第二种如果是基于密码认证,那么可以这样实现:




    通过上面的步骤后那么 openLooKeng 启动时也会加载自己实现的 Factory。只要在配置文件中配置成自己实现的认证即可使用。




    本文作者:曾德永


    转载请联系 openLooKeng 小助手(微信:openLooKengoss)



    发布于: 刚刚阅读数: 2
    用户头像

    openLooKeng

    关注

    愿景:让大数据更简单 2021.04.14 加入

    openLooKeng是一款高效的数据虚拟化引擎,提供统一SQL接口,具备跨数据源/数据中心分析能力,致力于为用户提供极简的数据分析体验。社区官网:https://openlookeng.io

    评论

    发布
    暂无评论
    浅析openLooKeng安全认证机制