ES Xpack Kerberos认证流程优化

2024-06-17 03:48

本文主要是介绍ES Xpack Kerberos认证流程优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

小序

ES官方Xpack在服务端已经实现了Kerberos认证,会玩的小伙伴配置成功后,可以使用curl命令成功的发起认证请求;然而,由于RestClient客户端并没有默认集成Kerberos认证的能力,如果要使用Kerberos认证功能,必然要自己实现客户端传递认证token到服务端的逻辑,也可以把这段逻辑固化到RestClient.java或者RestClientBuilder.java中(笔者之前的文章中关于这块有大概的介绍)。

然而,还有一个问题,经过系统的测试,笔者发现Kerberos开启之后的性能几乎只有非安全模式的20%-50%(实测,如果测试用例不一样,可能结果和我这个也不一致),其实这个问题原因很简单,经过验证,发现每一次请求在ES的服务端都会验证Kerberos token的有效性,这样做固然安全,但是也就是这么个几乎不到ms级别的逻辑,导致了压测数据令人非常不满意。虽然我拥有了安全,但是性能也太低了吧,好吧,怪不得很多做过Kerberos认证的小伙伴那么讨厌它。

其实这个可以优化,其中一个优化逻辑就是使用Cookie机制,这也不是什么新玩意儿,如果有人接触过HW或者其他厂家的大数据平台,假如你使用过安全模式,又恰好注意到他们的请求Header的话,也许都会发现Cookie的蛛丝马迹。

说白了就是:既然你Kerberos认证慢,那我用Cookie打辅助,Kerberos认证通过的客户端可以不再验证Kerberos token,而是使用Cookie来简单的验证即可。

思路

  • 客户端
  1. 客户端向服务端发送请求,假如是第一次认证(没有收到过服务端Response),那么采用Kerberos认证的方式发送Kerberos ticket到服务端去认证
  2. 假如不是第一次认证(服务端Response消息中有不能伪造的Set-Cookie),那么解析并判断Cookie的有效性,判断是否过期,是否符合格式等,如果一切正常,那么将Set-Cookie的信息转化为Cookie发送给服务端
  • 服务端
  1. 判断请求中是否有Authorization的Header,是的话路由给Kerberos realm处理,再判断是否有Cookie,有的话走Cookie判断流程(仿伪验证),验证通过直接处理请求
  2. 假如没有Cookie,验证Kerberos token的有效性,如果验证成功,生成Set-Cookie的Header,并返回给客户端
  • 注意:
  1. 为了防止伪造Cookie,服务端需要利用一定的方式对Cookie验证,最大可能降低非安全性(其实如果对业务逻辑完全了解,笔者认为也许Cookie就像一张白纸一样透明。。。)
  2. Cookie中最好必须携带认证通过的user信息,认证域信息,以及timestamp信息
  3. 设计良好的验证算法,保证Cookie验证的速度

实践

笔者阅读了源码后尝试的抛砖引玉的方案,注意,Kerberos不是ES官方的免费特性,小伙伴们在使用的时候注意不要引起不必要误会哦~~

  1. AuthenticationService类是ES官方所有认证域的入口类,在这个类中RestRequest以及ThreadContent会师,方便我们把请求中的Cookie信息传递给ThreadContent,即如果Header中存在Cookie Header,我们就put到ThreadContent的后续Header中,如果是Kerberos的请求,就会路由到KerberosRealm类去处理
  2. KerberosRealm类是Kerberos认证的入口类,关键的Kerberos认证逻辑都在这个类里面进行,必要的功能会分解到其他辅助类,在token方法中,负责解析ThreadContent,这个时候如果收到携带Cookie Header的请求,那么解析Cookie Header的内容作为认证Token,否则仍然解析Kerberos ticket作为认证的token;另外,authenticate方法负责在Kerberos认证成功的前提下生成Set-Cookie,假如不是第一次认证,每次都转发Set-Cookie给Response消息
  3. KerberosAuthenticationToken类负责真正的解析token,把token的本质面目揭示出来,发送给KerberosTicketValidator去验证
  4. KerberosTicketValidator类验证token是不是cookie格式的请求以及正确性,是的话直接认证,否则继续走Kerberos ticket的认证
  5. RestClient以及RestClientBuilder负责处理客户端Cookie响应逻辑,并且在Cookie即将超时、Kerberos subject即将超时、或者意外导致Cookie清空的情况下,刷新认证信息

经过笔者尝试,新的认证逻辑仍然比非安全模式(开箱即用的ES)性能上慢了10%左右,毕竟有所进步吧,记录以留念。

这篇关于ES Xpack Kerberos认证流程优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068399

相关文章

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指