如何使用Kerberos和AFS票据提供已运行的进程?

问题描述:

我有一台使用Kerberos进行用户身份验证的Linux服务器,以及面向用户家的AFS。当我用可转发的Kerberos票证登录到计算机时,(我想)PAM也会照顾我的AFS身份验证,因此登录后我会自动访问我的AFS主页。如何使用Kerberos和AFS票据提供已运行的进程?

比方说,我登录,并创建一个屏幕会话,并在其中启动一个应用程序。然后我分离我的屏幕会话,并从机器注销。我的Kerberos票证会自动删除,因此我的屏幕会话在后台运行,并且运行在其中的应用程序无法再访问我的AFS主目录。这很正常,而且很好。

下一次当我登录到机器中时,如何使用新的Kerberos票证“提供”我已在运行的屏幕会话和运行在其中的应用程序(进程本身),并使其能够再次访问我的AFS主目录而不必重新启动它?

感谢, 丹尼尔

“正确”的答案是使用类似krenew或KSTART监视你的屏幕 会议,并确保它具有有效TGT和AFS令牌。大多数网站将允许您续订最多7天的门票。

但是,这不是你问的问题。票证部分很简单。环境变量KRB5CCNAME存储您的kerberos票据的位置。 一般来说它看起来是这样的

KRB5CCNAME=FILE:/tmp/krb5cc_7472_lIwDv27056 

所以闲逛在/ proc系统,找到KRB5CCNAME的价值为你的屏幕流程和现有的售票复制到该文件的位置。

如果您可以在复制票证之后以某种方式运行aklog,那么这是最直接的 解决方案,AFS令牌部分要棘手得多。

有一些提取和设置令牌的工具。 gettoken和settoken,但我知道没有直接的方法来使用它们来设置任意进程的标记。 AFS令牌作为内核中的进程数据的一部分存储。这就是为什么当您在使用AFS的计算机上使用groups命令时,您会看到有趣的高编号组。

+0

感谢您的回答!不幸的是,我不能让这个进程运行aklog,因为它是一个编译好的二进制文件,并且触及源代码,重新编译它等都会非常复杂,特别是因为我没有这些服务器的所有权,所以部署将会是也很复杂。事实上,如果我能做到这一点,我也可以运行kinit,这将解决问题,但我不能。所以你说没有办法将当前的AFS令牌传递给正在运行的进程?再次感谢,Daniel – PDani

+0

总有一种方法,这只是一个你愿意写多少代码以及你是否拥有root权限的问题。我知道使用标准工具无法做到这一点,即使使用我不知道的非标准工具,我也不确定AFS api是否支持它。 –

您应该能够附加到屏幕会话,在其内部创建一个新窗口/'屏幕'(使用默认配置,您可以通过按C-a C-c执行此操作),然后运行kinit && aklog。您不需要在现有的正在运行的应用程序或类似的东西中“运行”你只需要在同一个屏幕会话中的某处运行它。之后,您可以分离屏幕并注销,并且屏幕会话应该仍然拥有您的凭据(直到它们过期;您可以使用krenew使它们持续更长时间,但不会永远持续)。

如果您想知道更详细的说明,请点击这里。我假设你通过ssh登录并使用PAM,但同样的一般流程也适用于其他设置:

当你第一次登录时,PAM会为你指定一个PAG(一种容器AFS令牌),并运行一些与kinitaklog相当的东西,为您提供该PAG内的AFS令牌。然后,您的shell将在该PAG中运行,因此您在该shell中运行的所有内容都与该PAG及其凭据相关联。这包括您创建的screen会话。

注销时,PAM配置会破坏您的凭证,这意味着它会销毁与该PAG关联的AFS令牌。这就是为什么屏幕会话丢失凭据并失去对主目录的访问权限:该PAG的令牌已被销毁。

稍后,如果您再次登录,则会为您分配一个新的单独PAG,并再次获得AFS令牌。旧的屏幕会话仍然与另一个PAG相关联,PAG是销毁令牌的那个。因此,如果您附加到该屏幕会话,并在其中运行kinitaklog,那么将会创建与第一次登录时与旧PAG关联的新令牌。然后您可以从屏幕会话中退出并注销,并且当前PAG中的令牌将被销毁。但是屏幕会话的PAG是未触及的,因为PAM和其他任何东西都不知道该PAG了。所以它的标记在它到期之前将继续有效。