我使用以下代码获取 kerberos 票证:
String client = "com.sun.security.jgss.krb5.initiate";
LoginContext lc = new LoginContext(client, new CallbackHandler() {
@Override
public void handle(Callback[] arg0) throws IOException, UnsupportedCallbackException {
System.out.println("CB: " + arg0);
}
});
lc.login();
System.out.println("SUBJ: " + lc.getSubject());
这段代码工作正常,我得到一个显示我的用户 ID 的主题。我现在遇到的问题是我需要知道用户是否属于 AD 中的某个组。有办法从这里做到这一点吗?
我见过使用 LDAP 获取用户组的代码,但它需要使用用户/密码登录,我需要以 SSO 方式进行。
实际上,您无法使用登录时获得的票证来执行此操作。问题在于 Windows PAC(包含组成员身份信息)位于票证的加密部分中。只有域控制器知道如何解密该初始票证。
可以使用服务票来完成。
因此,您可以设置一个密钥表,使用 jgss 向自己进行身份验证,然后解密票证,找到 PAC,解码 PAC,然后处理 SID。我无法在 Java 中找到大部分代码,尽管它可以用 C 语言实现。请看一下this http://thejavamonkey.blogspot.com/2008/05/how-to-decrypt-kerberos-gss-ap-req.html了解如何解密票证。
现在,此时您正在讨论编写或查找 NDR 解码器、阅读有关 PAC 和 sids 如何组合在一起的所有规范,或者将 C 代码移植到 Java。
我的建议是采取不同的方法。
相反,请使用 Kerberos 登录 LDAP。查找支持 Java 的 LDAP 库SASL http://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/lab/part2.html并且您应该能够使用 Kerberos 票证登录。
如果您的应用程序想要了解用户所属的组以便填充菜单和类似内容,您只需以该用户身份登录即可。
但是,如果您要决定用户拥有哪些访问权限,请不要以该用户身份登录来获取 LDAP 访问权限。问题是,使用 Kerberos,攻击者可以与用户合作,模拟您的应用程序的整个基础设施,除非您确认您的票证来自基础设施。
也就是说,因为用户知道他们的密码,并且因为这是您的应用程序知道的唯一秘密,所以用户可以与某人合作假装是 LDAP 服务器并声称拥有他们想要的任何访问权限。
相反,您的应用程序应该有自己的帐户在访问 LDAP 时使用。如果这样做,您只需查找组列表即可。
我确实意识到这有点复杂。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)