Java 客户端和 Kerberos / SSO - Krb5LoginModule - 不重复使用票证



我正在运行JMeter,这取决于JDK 1.8Krb5LoginModule

在我看来,Krb5LoginModule无法跨多个请求维护 kerberos 会话。这会导致在每次请求之前HTTP 401并重新握手。

我正在尝试重现具有严重间歇性性能问题的生产环境,我想在我的测试中包含 Kerberos/SSO 身份验证,但我无法将其设置为像使用 REST 服务器的 Windows 客户端一样运行。

REST 服务器向数百个 Excel 加载项客户端提供数据,这些客户端设置为使用 Kerberos 进行身份验证。在访问日志中,我看到每个客户端最初触发 HTTP 状态 401 响应,然后是 200,在客户端活动期间再触发 200。

为了避免混淆,服务器正在处理 Kerberos 握手,并且没有使用 servlet 容器会话。

但是,当我的测试运行时,我看到每个请求都被来自服务器的 401 拒绝,Java 转到 Kerberos KDC 获取另一个票证,然后重新提交它。虽然这有效,但我的 KDC 服务器每秒无法处理超过几个请求,并且请求超时,因此我无法过多地增加负载测试。

那么,为什么 Krb5LoginModule 不像 Excel 那样保留从 KDC 获得的 kerberos 票证并预先验证每个调用呢?

这是我为配置尝试的:

JMeter {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true
ticketCache="FILE:krb.cache"
useKeyTab=true
keyTab="FILE:krb.keytab"
storeKey=true
principal="-tsk-thing-ldap-dev@DO.AD.DUM.COM"
debug=true;
};

我尝试过使用键表和没有键表,有票证缓存和没有。我希望我只是做错了配置,但我看不出如何。

这就是我的假设基础:Oracle:使用 Kerberos 的单点登录

和 API:Krb5LoginModule - Oracle JDK 1.8 API 文档

  1. 我认为您不需要在路径周围使用引号,并且也不需要FILE:位,例如:

    ticketCache=/path/to/your/krb.cache
    
  2. 为什么同时使用票证缓存和密钥表,一个应该就足够了(除非你需要测试回退场景)

  3. 您使用的是什么操作系统?

我记得用这样的东西解决问题:

com.sun.security.jgss.krb5.initiate {
com.sun.security.auth.module.Krb5LoginModule required
debug=true
doNotPrompt=true
useTicketCache=true        
};

并设置以下注册表项 (Windows 7)

HKEY_LOCAL_MACHINESystemCurrentControlSetControlLsaKerberosParameters
Value Name: allowtgtsessionkey
Value Type: REG_DWORD
Value: 0x01  ( default is 0 )

引用:

  • JSch 和 Kerberos 身份验证
  • JGSS 故障排除
  • Windows Authentication with Apache JMeter

Jaas 不会将票证持久化到缓存中,它只能获取已保存的票证。 我的问题/答案中的更多信息在这里

您需要使用kinit工具(与 Java 发行版或 Linux 工具捆绑在一起)才能将票证保存到缓存文件中,您也可以重写自己的Krb5LoginManger以执行此操作(困难的方式)。

但是我想 Adam 工作流程中有一些东西被破坏了,在我对 GSS 的轻描淡写中,对于同一个会话,服务器和客户端都必须始终引用他们在初始化期间创建的同一GSSContext对象。

您必须将问题分为两部分。

  1. 无限TGT。如果您使用本机 jaas,则此模块将忽略 Linux 或 Windows gss 库,并尝试使用 jaas.conf 中定义的密钥表重新启动。对于KDC来说,这意味着DDoS。如果在用户和目标服务之间使用网关等应用程序,则服务将成为中间启动器,并且需要为 TGS 重新启动自己的 TGT。这可以通过将useTicketCache添加到jaas.conf来解决。然而,它不能解决TGS DDoS问题 ->TGS数量可能远远超过TGT。

  2. 无限的TGS。Oracle 为自己的生态系统编写了原生库,他们对您的优化不感兴趣。如果您每天想要一张票 - 请支付 Oracle 开发独家库的费用。 然而,有一个经典的生活黑客打破了甲骨文天气的方式,在甲骨文文档网站上。它被称为外部MIT/MS Kerberos gss库上的本机JGSS。

您只需要在 java 命令后添加 2 -D 参数或使用JAVA_OPTS

https://docs.oracle.com/en/java/javase/15/security/jaas-authentication.html#GUID-EF86E769-AFAF-4341-B9B0-4E122A0BFCEC

最新更新