【问题标题】:Get AD Groups with kerberos ticket in Java在 Java 中使用 kerberos 票证获取 AD 组
【发布时间】:2013-12-07 18:06:48
【问题描述】:

我正在获取带有以下代码的 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 方式进行。

【问题讨论】:

    标签: java ldap single-sign-on kerberos


    【解决方案1】:

    您实际上无法使用登录时获得的票证来执行此操作。问题是 Windows PAC(包含组成员信息)位于票证的加密部分。只有域控制器知道如何解密初始票证。

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

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

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

    【讨论】:

    • Oracle 的 GSSContext 实现能够解密自动化数据字段。
    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多