首页 > 解决方案 > 限制 Kerberos TGT 的使用

问题描述

我对 Kerberos 很陌生。我正在使用 Kerberos 测试单点登录功能。环境:Windows 客户端(使用 Active Directory 身份验证)连接到在 Linux 机器上运行的 Apache 服务器。调用的 cgi 脚本(在 Perl 中)使用转发用户 TGT 连接到数据库服务器。一切正常(我有主体、keytab 文件、配置文件和来自数据库服务器的结果 :))。因此,如果win_usr_a在 Windows 端启动我的 CGI 请求,CGI 脚本会连接到远程数据库并查询select user from dual,然后返回win_usr_a@EXAMPLE.COM

我只有一个问题想要解决。目前凭证缓存存储为 FILE:.... 在中间 Apache 服务器上,运行 Apache 服务器的用户获取所有经过身份验证的用户的转发 TGT(因为它可以看到所有凭证缓存),而 TGT 的生命周期未过期它可以为这些用户请求任何服务主体。

我知道根据定义,主机在 Kerberos 中被认为是受信任的,但如果我可以限制转发的 TGT 的可用性,我会很高兴。例如,我可以将 Active Directory 设置为将转发的 TGT 限制为仅对请求给定的服务主体有效吗?和/或有没有办法定义转发的 TGT 以使其只能使用一次,即在请求任何服务主体之后变得无效。或者有没有办法让 cgi 脚本检测转发的 TGT 是否被其他人使用(也许检查使用计数器?)。

现在我只有一个解决方案。我可以将转发的 TGT 的生命周期定义为 2 秒,并在 DB 连接建立后在 CGI 脚本中启动 kdestroy(我设置 CGI 脚本可以由 apache-user 执行,但不能修改代码)。我可以多做一点吗?

凭证缓存应该以某种方式隐藏。我认为将凭据缓存定义为 API: 会很好,但这仅针对 Windows 定义。在 Linux 上,可能 KEYRING:process:name 或 MEMORY: 可能是更好的解决方案,因为它是当前进程的本地并且在进程退出时被销毁。据我所知,apache为新连接创建了一个新进程,所以这可能有效。也许 KEYRING:thread:name 是解决方案?但是 - 根据thread-keyring(7)手册页 - 它不会被克隆继承并被 execve sys 调用清除。因此,如果 Perl 被 execve 调用,它将不会获得凭证缓存。也许使用 mod_perl + KEYRING:thread:name?

任何想法将不胜感激!提前致谢!

标签: active-directorykerberos

解决方案


简短的回答是,如果客户端在给定时间点碰巧拥有所有必要的位,Kerberos 本身并没有提供任何机制来限制谁可以使用它的范围。一旦你有了一个可用的 TGT,你就有了一个可用的 TGT,并且可以用它做你喜欢的事情。就安全问题而言,这是一个存在根本缺陷的设计。

Windows 将此称为无约束委派,并且专门通过称为[MS-SFU]的 Kerberos 扩展来解决此问题,该扩展更广泛地称为约束委派。

该协议的要点是您向服务器 (Apache) 发送一个常规服务票证(没有附加 TGT),并且服务器足够了解它可以将该服务票证交换给自己,以获得委托服务器的服务票证( DB) 来自 Active Directory。然后,服务器使用新的服务票证对数据库进行身份验证,win_usr_a尽管由 Apache 发送,但数据库看到它是一个服务票证。

诀窍当然是启蒙。如果不了解更多关于身份验证在 CGI 中如何进行的细节,就不可能说你所做的一切是否支持[MS-SFU].


推荐阅读