【发布时间】:2019-11-15 22:37:03
【问题描述】:
我对 Kerberos 还是很陌生。我正在使用 Kerberos 测试单点登录功能。环境:Windows 客户端(使用 Active Directory 身份验证)连接到在 Linux 机器上运行的 Apache 服务器。调用的 cgi 脚本(在 Perl 中)使用转发用户 TGT 连接到数据库服务器。一切正常(我有主体、keytab 文件、配置文件和来自数据库服务器的结果 :))。因此,如果在 Windows 端以 win_usr_a 身份启动 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?
任何想法将不胜感激!提前致谢!
【问题讨论】: