并行kinit调用导致Kerberos缓存损坏

时间:2018-07-06 09:45:45

标签: kerberos

如果我尝试并行使用Kerberos keytab进行多次身份验证,则会随机收到错误消息,指出凭据缓存已损坏。

我可以使用以下脚本重现此问题。但是,在我的实际用例中,有多个进程同时调用kinit,但我无法控制它们:

kdestroy
kinit $USER@$REALM -k -t $HOME/$USER.keytab && echo "OK" &
kinit $USER@$REALM -k -t $HOME/$USER.keytab && echo "OK" &
kinit $USER@$REALM -k -t $HOME/$USER.keytab && echo "OK" &
kinit $USER@$REALM -k -t $HOME/$USER.keytab && echo "OK" &
kinit $USER@$REALM -k -t $HOME/$USER.keytab && echo "OK"

每次运行时都会产生随机输出。这样的输出示例如下:

kinit: Failed to store credentials: Internal credentials cache error (filename: /tmp/krb5cc_1645005342) while getting initial credentials
kinit: Failed to store credentials: No credentials cache found (filename: /tmp/krb5cc_1645005342) while getting initial credentials
kinit: Failed to store credentials: Bad format in credentials cache (filename: /tmp/krb5cc_1645005342) while getting initial credentials
OK
OK

是否有一种方法可以使kinit“等待其轮流”并且如果已经被另一个进程访问了,则不访问缓存?

2 个答案:

答案 0 :(得分:3)

如果多个进程独立创建票证,则它们没有理由使用相同凭据缓存。在最坏的情况下,他们甚至会使用不同的主体,而且副作用会非常有趣。

解决方案:更改每个进程的环境,以使KRB5CCNAME指向特定文件-最好指向特定于应用程序的目录。这样可以防止出现比赛情况,并清理混乱状况。

部分解决方案:维护单个缓存,但不基于文件(因为Linux无法对文件强制执行排他锁定),例如KEYRING

无论如何,您都有权抱怨这些应用程序的笨拙开发方式。还是它们被设计为在隔离的容器中运行?

答案 1 :(得分:0)

在我们的情况下,我们必须以相同的流程执行并发作业。最终,使用了外部文件锁来同步并行的kinit调用。

Begin
…

#Assign unused file descriptor e.g. 99 to a file called “kinit_lock.dat”
exec 99 >”kinit_lock.dat”

#try to acquire exclusive lock for “kinit_lock.dat” with timeout of 5 secs.
flock -x -w 5 99

#Invoke kinit
kinit <parameters>

#unlock the kinit lock file
flock -u 99

…
Job script
…

End