让我从描述我的真正目标开始,因为我不确定我是否正在尝试以正确的方式解决它=)
我只是想让我的 Web 应用程序获取 Kerberos 凭证代表登录用户。 Web 服务器是我的 Linux 域的一部分(已使用 FreeIPA / RedHat IdM 注册)。客户端是外部的,但该用户存在于我的域中。所以我想实现的是:
- 用户浏览我的网络应用程序并输入他的用户名/密码(在自定义登录表单中)
- Web 应用程序根据 FreeIPA 验证用户名/密码
- Web 应用程序代表登录用户获取 Kerberos 凭证,以便(例如)Web 应用程序现在可以显示用户的保险库或在 FreeIPA 上执行一些特权任务(这需要进行 Kerberos 身份验证)。
到目前为止,我已经使用过mod_intercept_form_submit
,并且能够使用pam_sss.so
(PAM + SSSD)针对 FreeIPA 对用户进行身份验证。这工作正常,但我找不到为用户获取的 TGT,因此我无法完成项目 3。
或者,我可能可以在 Apache 上使用 GSSAPI 身份验证,但由于客户端未在域中注册,因此这将显示系统登录表单(而理想情况下,我希望使用来自 webapp 的自定义登录表单)。
或者,我认为 Web 应用程序可以直接从登录表单中获取密码并kinit <username>
直接在 Web 服务器上运行。
您推荐什么方法?因为我觉得一定有某种优雅的方法……例如,如果 PAM 能为我获取 Kerberos TGT,并且我的 Web 应用程序能够在登录后访问它,那就太好了……
答案1
我想知道您是否真的需要在 Web 应用程序中使用 TGT 来针对 vault 或 FreeIPA 进行后续操作。看来 Kerberos 服务票证就足够了。
为此,使用 S4U2Proxy 和 S4U2Self 可能是最佳方法。mod_auth_gssapi 模块通过 GssapiUseS4U2Proxy 和 GssapiImpersonate 指令支持它们。事实上,FreeIPA 的 WebUI 在针对其 LDAP 后端进行操作时使用完全相同的机制。