首页 > 编程语言 >0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析

0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析

时间:2022-10-04 12:02:45浏览次数:92  
标签:krb5 凭证 Kerberos Java 0579 lifetime ticket login

作者:辉少


1

文档编写目的


在Kerberos环境中,我们的应用程序通过Java代码来提交任务需要先进行Kerberos凭证的初始化然后进行应用程序的提交,本文档主要讲述Java应用程序中读取krb5.conf 中配置ticket_lifetime 参数不生效的异常分析。


  • 测试环境

1.CM和CDH版本为5.15.1

2.操作系统版本为RedHat7.2

3.集群已启用Kerberos

4.JDK 1.8.131


2

问题描述


首先我们先在Linux 上Kerberos 客户端机器上修改ticket_lifetime和renew_lifetime 验证该参数的有效性,将ticket_lifetime 设置为20s,为了避免超时自动续期将renew_lifetime也设置为20S


ticket_lifetime = 20s (默认值24h)
renew_lifetime = 20s (默认值7d)


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_java


然后执行HDFS文件查看命令去查看,可以看到第一次成功,而第二次显示没有找到Kerberos凭证,说明已经过期,而我们在上图中可以看到过期时间为17:24:52,第二次命令执行的时间为17:24:59 ,表明在Linux的客户端机器上正常执行


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_客户端_02


然后看在Java代码中的表现,首先修改krb5.conf的配置


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_java_03


代码如下:


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_jar_04


然后执行,这里在获取凭证后延时了30S,再执行创建文件命令


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_jar_05


发现依旧创建成功,没有任何异常,并且打印的凭证过期时间为1天后的时间,说明在krb5.conf 中设置的ticket_lifetime 是无效的


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_java_06

0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_jar_07

0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_jar_08


3

问题分析


基于上述在Java代码中修改ticket_lifetime不生效的问题,起初认为是Windows客户端的问题,于是将代码和依赖包一起打jar包上传到Linux 系统的Kerberos客户端机器上执行,并且修改/etc/krb5.conf 的ticket_lifetime 和renew_lifetime 设置为20S


java -jar hdfs-demo-1.0-SNAPSHOT-jar-with-dependencies.jar


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_客户端_09


发现凭证的有效期仍然是1天,并且文件夹创建成功,无任何异常。


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_客户端_10


这说明并不是客户端机器的问题,而是Java程序的问题,于是便DEBUG代码进行分析

发现在UGI类中,执行完UGI. loginUserFromKeytab()函数中执行login.login() 函数后,在对象 subject 中发现凭证信息,并且有效期显示1天


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_jar_11


DEBUG到KerberosUtils类查看,发现获取Realm 和 获取服务凭证相关的函数,也没有任何关于凭证效期的函数,继续往下看


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_客户端_12


一直下一步看下去,找到一个Krb5LoginModule类,于是查看一下,该类中也没有任何有关ticket_lifetime 的属性或者函数


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_jar_13


在前面的一步我们已经知道凭证的有效期是在login.login() 函数后就能在subject对象中看到的,而login.login()实际上调用的是LoginContext 类中的invokePriv()函数,而invokePriv()函数实际调用的是invoke() 函数。


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_客户端_14


invokePriv() 函数如下:


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_jar_15


在下图中我们可以看到invoke() 函数还没执行完成,凭证的信息包括有效期止的日期已经出来,但是没有具体时间,凭证的startTime为null ,但是endTime 已经显示为1天后。说明执行login.login()的时候就已经指定了凭证的有效期日期为1天,也就是程序并没有读取ticket_lifetime 和renew_lifetime 参数。所以不论你krb5.conf 中是否有ticket_lifetime 和renew_lifetime 参数并不会改变凭证的有效时间。invoke() 函数如下:


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_客户端_16


为了验证程序并没有读取ticket_lifetime 和renew_lifetime 参数,我们使用设置系统参数的方式来验证,注释掉krb5.conf 文件然后执行。


System.setProperty("java.security.krb5.kdc","cdh4.macro.com:21732");
System.setProperty("java.security.krb5.realm","MACRO.COM");


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_java_17


发现代码仍然正常运行,并且凭证有效期依旧是1天


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_java_18


那么有System.setProperty("java.security.krb5.ticket_lifetime","20s"); 这样的参数吗,结果是即使添加了该属性,结果仍是一样,代码中并没有读取该值。


4

结论


经过对代码的分析得出结果,目前在java 8中hadoop-client ,hadoop-common 包并不支持设置Kerberos凭证的有效期。在Java bug 记录中显示在Java 9中显示已支持该参数功能,但是目前Hadoop 不支持Java 9就无法验证该问题了。


0579-5.15.1-Java 应用程序中修改Kerberos ticket_lifetime参数无效异常分析_客户端_19


参考文档:

​https://stackoverflow.com/questions/38555244/how-do-you-set-the-kerberos-ticket-lifetime-from-java​

​https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8044500​


标签:krb5,凭证,Kerberos,Java,0579,lifetime,ticket,login
From: https://blog.51cto.com/u_14049791/5731175

相关文章

  • 0578-5.15.1-Kerberos环境下Java应用程序认证超时异常分析
    作者:谢敏灵/辉少1文档编写目的在Kerberos环境中,我们的应用程序通过Java代码来提交任务需要先进行Kerberos凭证的初始化然后进行应用程序的提交,本文档主要讲述Java应用程序长......
  • 几个常见的javascript手写题,你能写出来几道
    实现new过程:要点:函数第一个参数是构造函数实例的__proto__指向构造函数的原型属性prototype函数剩余参数要挂载到一个实例对象上构造函数有返回值时,就返回这个返回......
  • JAVA-DDD项目结构
    通过一套合理的代码结构、框架和约束,来降低DDD的实践门槛,提升代码质量、可测试性、安全性、健壮性。废话少说,直接上最终架构图:项目架构DDD的架构能够有效的解决传统......
  • 0469-如何使用DBeaver访问Kerberos环境下的Impala
    温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。Fayson的github:​​https://github.com/fayson/cdhproject​​提示:代码块部分可......
  • 0468-如何使用DBeaver访问Kerberos环境下的Hive
    温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。Fayson的github:​​https://github.com/fayson/cdhproject​​提示:代码块部分可......
  • 0887-7.1.4-如何在CDP中为Kafka启用Kerberos认证及使用
    1.文档编写目的在CDP集群中启用了Kerberos认证,那么Kafka集群能否与Kerberos认证服务集成呢?本文主要讲述如何通过ClouderaManager为Kafka集群启用Kerberos认证及客户端配置......
  • Java并发编程 | 从进程、线程到并发问题实例解决
    计划写几篇文章讲述下Java并发编程,帮助一些初学者成体系的理解并发编程并实际使用,而不只是碎片化的了解一些Synchronized、ReentrantLock等技术点。在讲述的过程中,也想融入......
  • Java SE 宋红康 days04-高级篇-反射
    1.需要掌握的点:①理解Class类并获取Class实例;②创建运行时类的对象;③调用运行时类的指定结构;2.反射(Reflection)正常方式:引入需要的“包类”......
  • 构建Java高并发高性能分布式框架,高可维护性Java应用系统
    构建Java高并发高性能分布式框架,高可维护性Java应用系统微服务架构模式(MicroserviceArchitectPattern)。近两年在服务的疯狂增长与云计算技术的进步,让微服务架构受到重......
  • 桥接模式【Java设计模式】
    桥接模式【Java设计模式】​​前言​​​​推荐​​​​桥接模式​​​​介绍​​​​实现​​​​最后​​前言2022/9/2313:34路漫漫其修远兮,吾将上下而求索本文是根据袁......