Active directory 限制Kerberos TGT的使用

Active directory 限制Kerberos TGT的使用,active-directory,kerberos,Active Directory,Kerberos,我对Kerberos很陌生。我正在使用Kerberos测试单点登录功能。环境:连接到Linux计算机上运行的Apache服务器的Windows客户端(具有Active Directory身份验证)。被调用的cgi脚本(在Perl中)使用转发的用户TGT连接到DB服务器。一切正常(我有主体、keytab文件、配置文件和来自DB服务器的结果:)。因此,如果作为Windows端的win\u usr\u a启动我的CGI请求,CGI脚本将连接到远程数据库并查询select user from dual,

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

我只想解决一个问题。当前凭据缓存存储为文件:。。。。在中间Apache服务器上,运行Apache服务器的用户获得所有经过身份验证的用户的转发TGT(因为它可以看到所有凭据缓存),并且在TGT生存期未过期时,它可以为这些用户请求任何服务主体

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

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

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


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

简单的回答是,如果客户机在给定的时间点碰巧拥有所有必需的位,Kerberos本身不提供任何机制来限制谁可以使用它。一旦你有了一个可用的TGT,你就有了一个可用的TGT,你可以随心所欲地使用它。就安全问题而言,这是一个有根本缺陷的设计

Windows将此称为无约束委派,并通过一个更广泛地称为约束委派的Kerberos扩展提供了解决方案

该协议的要点是,您向服务器(Apache)发送一个常规服务票证(没有附加TGT),并且服务器得到足够的启发,知道它可以将该服务票证交换给自己,以从Active Directory将服务票证交换给委托服务器(DB)。然后,服务器使用新的服务票证向DB进行身份验证,DB see将其作为
win\u usr\u a
的服务票证,尽管它是由Apache发送的

当然,诀窍在于启蒙。如果不了解更多关于认证如何在CGI中发生的细节,就无法确定您所做的任何事情是否支持引用a(对于另一个问题,更新缓存时重点关注“竞争条件”)

如果多个进程独立创建票证,则它们没有 使用相同凭据缓存的原因。在最坏的情况下,他们会 即使使用不同的原则,副作用也会。。。 有趣

解决方案:更改每个进程的环境,以便
KRB5CCNAME
指向一个特定的文件——最好是在 特定于应用程序的目录


如果您的重点是保护凭据,那么请更进一步,不要使用缓存。修改您的客户端应用程序,使其能够动态创建TGT和服务票证,并保持其私密性


请注意,Java从不向Kerberos缓存发布任何内容;它可以从缓存中读取,也可以完全绕过缓存,具体取决于JAAS配置。遗憾的是,Kerberos的Java实现是有限的,而且相当脆弱,cf.

感谢您的帮助!我想我从麻省理工学院的教程中了解了Kerberos身份验证的工作原理。我知道微软总是自作主张。:)所以感谢“受限代表团”,我不知道!另一方面,CGI本身不做任何身份验证,它是由Apache的
mod\u auth\u kerb
完成的,它设置
REMOTE\u USER=win\u usr_a@EXAMPLE.COM
和CGI可以使用此字段。实际上,它不需要使用,因为基于转发的TGT,它可以从数据库中查询,而无需用户名和密码(如
sqlplus/@DB_ALIAS
)。“就安全问题而言,这是一个根本上有缺陷的设计”>>我想,应用程序开发人员管理缓存的方式根本上有缺陷。尤其是Microsoft Windows开发人员,他们确保您没有简单的方法来避免全局LSA缓存(极权主义原则:“一切不被禁止都是强制性的”),好吗?这与此无关。它不会改变这样一个事实,即你正在向一个远程服务发送一个秘密,这个远程服务可以模仿你对抗任何其他服务。您必须相信该服务不会对您的票证进行任何恶意操作。在安全方面,