如果我尝试并行使用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
“等待其轮流”并且如果已经被另一个进程访问了,则不访问缓存?
答案 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