首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行kinit调用导致Kerberos缓存损坏。

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

Stack Overflow用户
提问于 2018-07-06 09:45:45
回答 2查看 2.8K关注 0票数 2

如果我多次尝试并行使用Kerberos键签进行身份验证,则会随机获得错误消息,说明凭据缓存已损坏。

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

代码语言:javascript
复制
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"

每次运行它都会产生随机输出。这种输出的一个例子如下:

代码语言:javascript
复制
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“等待轮到它”,如果缓存已经被另一个进程访问了,就不要访问它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-06 20:49:58

如果多个进程独立创建票证,那么它们就没有理由使用相同的凭据缓存。在最坏的情况下,他们甚至会使用不同的原则,副作用是.有意思的。

解决方案:更改每个进程的环境,以便KRB5CCNAME指向特定的文件--最好是在应用程序特定的目录中。这样就能防止比赛,收拾你的烂摊子。

部分解决方案:维护单个缓存,但不基于文件(因为Linux无法强制文件上的独占锁),例如KEYRING

不管怎么说,你有权抱怨.呃,这些应用程序开发的笨拙的方式。或者它们被设计成在孤立的容器中运行?

票数 6
EN

Stack Overflow用户

发布于 2020-09-10 03:29:03

在我们的例子中,我们必须使用相同的进程执行并发作业。最后,使用外部文件锁来同步并行kinit调用。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51207555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档