当前位置: 首页 > 知识库问答 >
问题:

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

冯亮
2023-03-14

我正在运行JMeter,它依赖于JDK 1.8的Krb5LoginMoules。

在我看来,Krb5LoginMoules不能跨多个请求维护kerberos会话。这将导致HTTP 401和每次请求前重新握手。

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

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

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

当我的测试运行时,我看到每个请求都被服务器的401拒绝,Java去KerberosKDC获取另一个票证,然后重新提交。在这种情况下,我的KDC服务器每秒钟不能处理超过几个请求,并且会超时,所以我不能很好地提高我的负载测试。

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

这是我为配置所做的尝试:

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文档

共有3个答案

羊舌迪
2023-03-14

你必须把你的问题分成两部分。

>

  • 无限TGT。如果使用本机jaas,则此模块忽略Linux或Windows gss库,并尝试使用jaas.conf.For KDC中定义的keytab重新启动,这意味着DDoS。如果您在用户和目标服务之间使用像网关这样的应用程序,那么您的服务将成为中间发起者,它需要为TGS重新发起自己的TGT。它可以通过添加useTicketCache来解决jaas.conf.但是它不能解决TGS DDoS-

    无限TGS。Oracle为自己的生态系统编写了本机库,他们对您的优化不感兴趣。如果你想要每天一张票,请向甲骨文支付开发独家图书馆的费用。然而,有一种经典的lifehack可以像Oracle doc网站上那样破坏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

  • 殷宾白
    2023-03-14

    Jaas不会将票据持久保存到缓存中,它只能获取已经保存的票据。更多信息请参见我的问题/答案

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

    但是我想在Adam的工作流程中,在我对GSS的低估中,对于同一个会话,服务器和客户端,必须始终引用他们在初始化期间创建的相同的GSSContext对象。

    阴鸿才
    2023-03-14

    >

  • 我认为路径周围不需要引号,这个文件:位也不是必需的,比如:

    ticketCache=/path/to/your/krb.cache
    

    为什么同时使用票证缓存和键表,一个就足够了(除非需要测试回退场景)

    我记得解决问题的方法是:

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

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

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters
    Value Name: allowtgtsessionkey
    Value Type: REG_DWORD
    Value: 0x01  ( default is 0 )
    

    参考资料:

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

  •  类似资料:
    • 我们已经实现了Kerberos java客户端,它运行良好。然而,当kerberos票证过期时,Java客户端应用程序会在控制台中请求用户名,这反过来会使应用程序挂起。在SoapUI等工具中,我们观察到当Kerberos票证过期时,系统抛出未经授权的错误。我们希望实现类似的行为,即如果Kerberos票证过期,则应抛出未经授权的错误,而不是等待用户输入凭据。请帮忙。 为Kerberos测试设置客户

    • 我已经编写了一个在Windows下运行的简单JavaHTTP客户端。客户端与需要通过SPNego进行Kerberos身份验证的Web服务器进行通信。 我遇到了两个问题: > 服务票证没有存储在我的凭据缓存中。执行请求后,我希望看到一个Kerberos服务票存储在我的凭据缓存下的

    • 我在W12服务器上运行了以下命令:- setspn-A HTTP/krbspn ktpass/princ HTTP/@/crypto ALL/ptype krb5\u nt\u principal/mapuser krbspn c:\ticket\krbspn。按键-kvno 0/pass Pa$$w0rd kinit-krbspn给出了正确的结果,但kinit-HTTP/返回:- KrbExce

    • 问题内容: Google的Chrome和IE等应用程序可以透明地处理Kerberos身份验证;但是我找不到适合这种透明度的“简单” Java解决方案。我发现的所有解决方案都需要存在一个krb5.conf文件和一个login.conf文件,以上应用似乎还需要这些文件。 用有效的Kerberos SSO功能构建Java应用程序的最佳方法是什么? [更新]:明确地说,我需要一个 CLIENT 端解决方案

    • 我们有一个内部开发的基于客户机/服务器的应用程序。客户端和服务器通过TCP/IP连接与特定于应用程序的协议进行通信。客户端在Windows上运行,服务器在Linux上运行。所有计算机都位于相同的Active Directory/Kerberos域/领域中。 目前,用户在启动应用程序时输入用户名和密码。服务器检查用户名和密码(身份验证)。服务器还根据用户名确定对资源的访问(授权)。 我们希望向应用程

    • 问题内容: 我正在使用spnego(http://spnego.sourceforge.net)在JBoss下进行kerberos身份验证。 我需要解密kerberos票证才能访问包含PAC数据的授权数据。需要PAC数据来决定要授予用户哪些角色。 如何访问和解密kerberos票?我在网上搜索了示例,但没有任何努力。 问题答案: 这些家伙具有完整的PAC解码实现: http://jaasloung