如果我尝试并行多次使用 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“轮到它”并且如果它已经被另一个进程访问就不要访问缓存?
如果多个进程独立创建票证,则它们没有理由使用相同的凭据缓存。在最坏的情况下,他们甚至会使用不同的原则,而副作用会……很有趣。
解决方案:更改每个进程的环境,使其KRB5CCNAME指向特定文件——最好是在特定于应用程序的目录中。这将防止竞争条件,并清理你的烂摊子。
部分解决方案:维护单个缓存,但不基于文件(因为 Linux 无法强制对文件进行独占锁定)例如KEYRING.
无论如何,您有权抱怨这些应用程序的开发方式很笨拙。或者也许它们被设计为在隔离的容器中运行?
| 归档时间: |
|
| 查看次数: |
1886 次 |
| 最近记录: |