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

2024-02-16

我使用以下代码获取 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(使用前将#替换为@)

在 Java 中使用 kerberos 票证获取 AD 组 的相关文章

随机推荐

  • GridView 自动将行高设置为最高的网格项

    标题是我想要实现的目标的简化版本 一个 GridView 它根据我提供的原型网格项自动设置行高 原型项目是最高的可能项目 例如 如果网格项目包含文本 则原型将包含最长的可能文本 一种可能的解决方法是使用 ListView 其中每一行都包含在
  • ctypes 指向 numpy 数组中间的指针

    我知道如何获取指向 numpy 数组开头的 ctypes 指针 a np arange 10000 dtype np double p a ctypes data as POINTER c double p contents c doubl
  • keras 规范化轴参数有什么作用?

    我是深度学习的初学者 正在 keras 中处理 mnist 数据集 我使用归一化作为 tf keras utils normalize x train axis 1 我不明白轴参数是什么意思 你能帮我解决这个问题吗 Normalize 函数
  • 如何使用 pyspark 计算 apache Spark 数据帧的大小?

    有没有办法使用 pyspark 计算 Apache Spark 数据帧的大小 以字节为单位 为什么不缓存 df 然后在存储下查看 Spark UI 并将单位转换为字节 df cache
  • Google Drive Api - 使用实体框架自定义 IDataStore

    我实现了我的自定义IDataStore这样我就可以存储最终用户令牌 on my database而不是默认的实现 它保存在文件系统在 AppData 内 public class GoogleIDataStore IDataStore pu
  • 在没有脚本标签的情况下执行 XSS JavaScript

    我正在学习 XSS 出于道德目的 我想知道如何在不使用
  • AngularJS:使用 ng-repeat 保留插入顺序

    我正在使用 ng repeat 实现自动完成系统 基本上 我有一个提供 ng repeat 的对象数组 我注意到 当我将新内容插入数组时 插入顺序不会保留 例如 广告订单 A B C ng 重复渲染顺序 甲 丙 乙 A B C 中的每一个都
  • 如何在 LINQ 中选择所有字段以及一些新字段?

    我收到了 RDLC 报告 SQL DB 中存储的日期格式是格鲁吉亚语 我想在报告中将日期显示为波斯语 使用 Linq 我想选择数据库的所有字段以及一些用作波斯日期字段的新字段 我使用以下语法 var invoices from invoic
  • 如何用Vagrant处理Mysql、网站源等数据?

    如何使用 Vagrant 处理 Mysql 网站源等数据 作为一名程序员 我喜欢能够轻松设置开发环境 因此 我创建了一个流浪盒子并为其配置了木偶 但我问自己 盒子中的数据怎么样 如果我需要销毁盒子并重新创建它会怎样 我的所有数据都将被删除
  • Chrome 中的引导模式问题

    我的 asp net mvc 代码中有一个引导模式 它在运行时进行主体绑定 第一次我单击某些按钮并且模态工作良好 通过 jquery ajax 从控制器返回主体 然后必须动态改变模型的主体 它也很好用 通过 jquery Ajax 和 js
  • 如何实现以下C++输出格式?

    我希望按照以下规则打印出 double 1 No scietific notation 2 Maximum decimal point is 3 3 No trailing 0 例如 0 01 formated to 0 01 2 1234
  • 在 Android 上使用 firebase 发送好友请求

    我正在从 Parse 迁移到 Firebase 我的 sendRequest 函数执行以下任务 假设user1向user2发送请求 检查用户名是否存在 检查user1是否尚未向user2发送请求 检查user1和user2是否还不是朋友 一
  • Jenkins Pipeline - 阅读前一阶段日志

    考虑一个有两个阶段的 Jenkins Pipeline Stage A then Stage B 在阶段 B 中 是否可以解析阶段 A 的日志中的某些特定文本 Use tee将输出拆分为标准输出和文件 接下来解析文件中的文本 STAGE A
  • 如何使用Microsoft Graph Client SDK(C#)重置密码?

    用户如何使用 Microsoft Graph 客户端重置密码 我无法找到正确的方法来做到这一点 谢谢 汤姆关于委托范围的说法是正确的Directory AccessAsUser All允许登录用户更改密码 标准User ReadWrite可
  • 将字典列表转换为 tf 数据集

    我有一本已经完全预处理的字典 可以输入到 BERT 模型中 然而 我很难将其放入 tf dataset 中 这就是我的数据集的一个元素 print dataset 0 input ids
  • Tensorflow:tf.nn.separable_conv2d 是做什么的?

    我不太确定 tf nn separable conv2d 到底做了什么 看来pointwise filter是生成下一层的一个像素时针对不同特征的缩放因子 但我不确定我的解释是否正确 这个方法有什么参考吗 有什么好处 tf nn separ
  • 在新的 @material-ui/core 中使用 withStyles 和 Typescript

    我正在尝试将一些使用material ui next的旧Typescript更新为新的 material ui core Typescript Version 2 8 3 material ui core 1 1 0 我已经实现了一个非常简
  • 需要在 Angular 2 中使用 youtube-iframe-api 的 youtube.d.ts 文件

    我尝试使用YouTube iframe API https developers google com youtube iframe api reference hl de用于通过平滑的 Angular2 集成来显示和控制视频片段 尊重 t
  • 线程池 C++

    我有以下内容for loop for int i 0 i lt 100 i someJob 我只想用 5 个线程运行这个函数 我该怎么做 我无法使用任何外部库 我尝试过创建一个包含 5 个线程的数组 如果索引等于 5 则等待所有线程并再次执
  • 在 Java 中使用 kerberos 票证获取 AD 组

    我使用以下代码获取 kerberos 票证 String client com sun security jgss krb5 initiate LoginContext lc new LoginContext client new Call