- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 jTDS 连接到 SQLServer。 jTDS 在内部使用 GSS 获取 kerberos 的服务票证并建立安全上下文。由于我的应用程序生命周期很长并且我的连接一直保持 Activity 状态我需要 kerberos 的服务票证是可更新的,以允许 SQL 服务器自行更新它们(kdc 策略设置为在 12 小时后过期所有票证).
jTDS 为获取 kerberos token 所做的(或多或少)如下:
GSSManager manager = GSSManager.getInstance();
// Oids for Kerberos5
Oid mech = new Oid("1.2.840.113554.1.2.2");
Oid nameType = new Oid("1.2.840.113554.1.2.2.1");
// Canonicalize hostname to create SPN like MIT Kerberos does
GSSName serverName = manager.createName("MSSQLSvc/" + host + ":" + port, nameType);
GSSContext gssContext = manager.createContext(serverName, mech, null, GSSContext.DEFAULT_LIFETIME);
gssContext.requestMutualAuth(false);
gssContext.requestCredDeleg(true);
byte[] ticket = gssContext.initSecContext(new byte[0], 0, 0);
我怀疑我获得的机票不可更新。我正在通过执行以下操作来检查:
ExtendedGSSContext extendedContext = (ExtendedGSSContext) gssContext;
boolean[] flags = (boolean[]) extendedContext.inquireSecContext(InquireType.KRB5_GET_TKT_FLAGS);
System.out.println("Renewable = " + flags[8]);
在我们的特定配置中,GSS 从 JAAS 登录模块获取 kerberos TGT。我们将以下变量设置为 false -Djavax.security.auth.useSubjectCredsOnly=false
并且在 login.cfg 文件中我们配置了以下登录模块:
com.sun.security.jgss.krb5.initiate {
com.sun.security.auth.module.Krb5LoginModule required
useKeytTab=true
keyTab="/home/batman/.batman.ktab"
principal="batman@GOTHAMCITY.INT"
storeKey=true
doNotPrompt=true
debug=false
};
我注意到的另一件事是 GSSContext
的 getLifetime()
方法似乎不起作用。它总是返回 2147483647 (max int) 无论票的实际生命周期是多少。
我觉得分支 jTDS 驱动程序很舒服,所以我可以根据需要修改它建立 GSS 上下文的方式。
我尝试了什么:
使用 GSS api 的 native 实现:
这在获取可更新票证方面对我来说很好,但它带来了另一组问题(在确保正确设置票证缓存和正确更新其中的票证方面)。如果我能绕过这个选项就好了。我在这里观察到的一件事是 getLifetime()
方法实际上返回了票证的真实生命周期(以秒为单位)。
重新实现 KerberosLoginModule:
基于对这个问题的回答Jaas - Requesting Renewable Kerberos Tickets在请求 TGT 之前,我重新实现了 LoginModule 以在 KrbAsReqBuilder
中设置 RENEW KDCOption
。从我获得可更新 TGT 的意义上来说,这很好用,但 GSS 从该 TGT 获得的票证仍然不可更新。如果我在 KDCOption 对象的构造函数中设置一个断点并在每个请求上手动设置 RENEW 标志(即使是 GSS 完成的 KrbTgsReq
)它也可以工作但是要使该更改有效需要对 GSS 进行重大重写我觉得不舒服。
最佳答案
对于管理员来说,Kerberos 票证具有生命周期这一事实是一项重要的安全功能。用户知道密码,所以他/她可以随时得到一张新票。但对于入侵者来说这是一个问题——票过期后,它就不能用来闯入系统了。管理员希望此生命周期尽可能短,但不能太短(例如 1 小时),因为用户会生成比现在多 10 倍的登录请求,而且 ActiveDirectory 很难处理。
当我们需要使用 Kerberos 进行身份验证时,我们应该使用连接池(和数据源)。要在 jTDS 中使用此功能,您需要添加 ConnectionPoolImplementation(推荐:DBCP 或 c3p0,参见:http://jtds.sourceforge.net/features.html)。
如果您想使用较旧的连接数据库的方式编写您的应用程序(没有数据源,即创建连接并保持连接,因为创建它的成本很高......)那么下一个障碍将是“更新生命周期”。在 ActiveDirectory 中,Kerberos 票据默认可以在 7 天内更新。 AD 中有一个全局设置,允许将其设置为 0(无限期更新生命周期),但您需要说服域管理员降低整个域的安全性,因为如果没有它,一项服务将无法运行。
关于java - 如何使用java GSS+JAAS获取可更新的kerberos票据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29611871/
我正在尝试在 Tomcat 7 上实现一个具有领域配置的简单 JAAS 模块。我正在尝试基于以下链接实现它: http://www.byteslounge.com/tutorials/jaas-aut
我想一个使用 NTLoginModule 进行身份验证的 jaas.conf 文件示例会有所帮助。 最佳答案 我不确定那是不是你的意思,但我想你可以: SomeName { com.sun.se
我正在使用这个 Helm chart :https://github.com/helm/charts/tree/master/incubator/kafka 以及 values.yaml 中的这些覆盖
我试图弄清楚登录模块标志在 JAAS 中是如何工作的(使用 JBoss 5.1 EAP),我遇到了一个令人费解的情况,我希望有人能为我澄清一下。 对于背景,我的 login-config.xml 如下
我实现了一个通过 Web 服务访问的自定义 loginModule,并在 JPA 访问的 DB 前面检查用户名和密码。 我在 jboss 7.1 上运行它,它运行良好,但是在将它移动到 Wildfly
我想知道使用 对数据库表上的应用程序用户进行身份验证的最简单方法贾斯 . 由于带有用户名/散列密码的数据库表可能是最常见的解决方案,是否有“提供”的 LoginModule 用于这种身份验证? 最佳答
我有以下代码来运行 Java (SE) 应用程序(不在服务器上),其中应该使用运行 JAAS 身份验证的现有 JBoss 服务器(我绑定(bind)到 4.2.3)来完成登录。我从一个简单的控制台应用
我刚刚完成了本教程: http://java.sun.com/docs/books/tutorial/security/tour2/index.html 并且对 JAAS 的基本概念感到好奇...如果
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我正在尝试设计一个 JAAS 微服务来处理多个 J2EE 应用程序的用户身份验证。目前我们有多个应用程序根据我们的 LDAP 进行身份验证并具有单独的角色系统。现在我一直在设计应用程序和身份验证后端之
我有一个带有 JAAS 的应用程序,我需要从遗留系统进行外部登录,所以我用下面的代码编写了一个 servlet,它工作正常,但是当我再次提交时,JAAS 尝试再次进行身份验证并失败,并且用户被重定向到
我正在学习 Java 安全 JCE/JAAS。我无法获得我们需要在实际 Web 应用程序中实现 JAAS 登录模块的示例。 任何人都可以指导我在我的 Web 应用程序中实现 JAAS 的位置吗?据我所
我关注了this tutorial学习JAAS。这个例子对我有用,所以我创建了自己的版本(我使用的是 Tomcat 6 和 Java 6),但我无法让它工作(帖子底部的异常)。 (由于代理,我无法将
我们有一个新编写的 JAAS 模块,想知道将 DataSource 对象的数据库连接设置放在哪里。 通常在 Tomcat 网络应用程序中,这将在“web.xml”文件中引用以指向位于“$catalin
嗨,我正在使用这个 link对于基于 Java JAAS 表单的身份验证, JAAS 登录模块的实现使用数据库(postgresql)验证用户输入的用户名和密码 在 JAAS 中,我们应该创建“jas
在 WildFly 9 服务器上运行的 Java EE 应用程序中,我有一个自定义登录模块: public class MyLoginModule extends AbstractServerLogi
我正在尝试编写我的 Costum LoginModule,以便在具有基本授权的 REST 服务中使用。为此我做了以下工作: 我编写了自己的 LoginModule,称为 QuarkLoginModul
我想知道如何结合这两个身份验证步骤: 检查 LDAP 中的用户/密码 将在数据库中找到的主体(角色)添加到主题。 LDAP 用户存储库不知道应用程序特定的角色,我不想管理应用程序数据库中的密码。所以我
我在 jboss 上有一个自定义登录模块。 ear 的 META-INF 有一个指向 login-service.xml 的 jboss-app.xml,后者包含一个指向定义自定义登录模块的 logi
我很难理解 JAAS。这一切似乎都比应有的复杂(尤其是 Sun 教程)。我需要一个简单的教程或示例,说明如何在基于 Struts + Spring + Hibernate 和自定义用户存储库的 jav
我是一名优秀的程序员,十分优秀!