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

che*_*aux 2 kerberos

如果我尝试并行多次使用 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"
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

有没有办法让kinit“轮到它”并且如果它已经被另一个进程访问就不要访问缓存?

Sam*_*ter 6

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

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

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

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