【问题标题】:Parallel kinit calls lead to a corrupted Kerberos cache并行 kinit 调用导致 Kerberos 缓存损坏
【发布时间】:2020-09-10 11:29:03
【问题描述】:

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

我可以使用以下脚本重现此问题。但是,在我的实际用例中,有进程同时调用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“等待它的轮到”并且如果它已经被另一个进程访问,则不要访问缓存?

【问题讨论】:

  • 在该脚本中,在每行之间放置一个“睡眠”语句,使其在每次 kinit 调用之间等待 1 -3 秒。
  • 脚本只是为了重现错误。但在我的实际用例中,有进程同时调用kinit,我无法控制它们
  • 我看到您使用的是 Unix 或 Linux。您使用的是操作系统版本的 kinit 还是 Java kinit?如果是 Java,JRE/JDK 的版本是什么?

标签: kerberos


【解决方案1】:

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

解决方案:更改每个进程的环境,使KRB5CCNAME 指向特定文件——最好是在特定于应用程序的目录中。这将防止竞争条件,并清理你的烂摊子。

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

无论如何,您都有权抱怨这些应用程序开发的笨拙方式......呃,这些应用程序的笨拙方式。或者也许它们被设计为在孤立的容器中运行?

【讨论】:

  • 您好,我也遇到了同样的问题,您能否提供更多关于如何实施主要解决方案的信息、链接或参考资料?
  • MIT Kerberos 文档,环境变量,KRB5CCNAME。确保它指向特定于每个应用实例的位置。
【解决方案2】:

在我们的例子中,我们必须在同一个进程中执行并发作业。最终,使用外部文件锁来同步并行 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

【讨论】:

    猜你喜欢
    • 2015-02-09
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多