使用Java中的kerberos票证获取AD组



我正在获取一个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(包含组成员信息)位于票证的加密部分。只有域控制器知道如何解密该初始票证。

使用服务票是可能的。因此,您可以设置一个keytab,使用jgss对自己进行身份验证,然后解密票证,找到PAC,解码PAC,然后处理SID。我在Java中找不到大部分代码,尽管它在C中可用。看看如何解密票证。现在,在这一点上,您谈论的是编写或找到NDR解码器,阅读关于PAC和sid如何组合在一起的所有规范,或者将C代码移植到Java。我的建议是采取不同的方法。相反,请使用Kerberos登录LDAP。找到一个支持Java SASL的LDAP库,您应该能够使用Kerberos票证登录。

如果您的应用程序想知道用户所属的组,以便填充菜单和诸如此类的内容,那么您只需以用户身份登录即可。但是,如果要决定用户的访问权限,请不要以用户身份登录以获得LDAP访问权限。问题是,使用Kerberos,攻击者可以与用户合作,将整个基础结构模拟为您的应用程序,除非您确认您的票证来自该基础结构。也就是说,因为用户知道他们的密码,而且这是应用程序唯一知道的秘密,所以用户可以与某人合作,假装是LDAP服务器,并声称拥有他们想要的任何访问权限。

相反,您的应用程序应该有自己的帐户,以便在访问LDAP时使用。如果你这样做了,你可以查一下群组列表。我确实意识到这有点复杂。

最新更新