Bash环境下Kerberos命令报Unknown credential cache type错误,求排查方案
这问题我之前帮同事排查过,KEYRING类型的凭证缓存依赖系统内核和Kerberos库的特定支持,咱们一步步来定位问题:
先确认Kerberos版本是否支持KEYRING
KEYRING类型的缓存是从krb5 1.10版本开始引入的,旧版本根本不支持这个类型。你可以用下面的命令检查当前krb5库版本:# RHEL/CentOS 系列 rpm -q krb5-libs # Debian/Ubuntu 系列 dpkg -l krb5-libs如果版本低于1.10,要么升级krb5包,要么换成FILE类型的缓存(比如
KRB5CCNAME=/tmp/krb5cc_$UID)。验证内核密钥环支持是否正常
KEYRING缓存依赖Linux内核的密钥子系统,先检查内核是否启用了相关支持:sysctl kernel.keys.maxkeys kernel.keys.maxbytes如果能看到正常的数值(不为0),说明内核支持;如果提示“unknown key”,可能需要检查内核配置是否开启了
CONFIG_KEYS,或者加载相关模块(大部分现代发行版默认是开启的)。修正KRB5CCNAME的格式
你用的{uid}不会被Bash自动解析成用户UID,得换成环境变量$UID或者直接写数字UID。比如先执行echo $UID拿到自己的UID(比如1000),然后重新设置:export KRB5CCNAME=KEYRING:persistent:$UID # 或者直接写数字 export KRB5CCNAME=KEYRING:persistent:1000设置完再试
kinit命令。检查用户密钥环的访问权限
有时候用户会话没有正确挂载persistent密钥环,你可以用keyctl show查看当前用户的密钥环:keyctl show @u如果看不到persistent密钥环,可以手动创建一个:
keyctl add user persistent "" @u创建后再重新设置KRB5CCNAME并测试。
临时切换缓存类型做对比测试
为了排除其他Kerberos配置问题,先临时换成FILE类型的缓存试试:export KRB5CCNAME=/tmp/krb5cc_$UID kinit your_principal@REALM如果这个能成功,说明问题确实出在KEYRING缓存的支持上,而不是Kerberos的其他配置(比如 realm、KDC 地址等)。
检查krb5.conf的默认缓存设置
看看/etc/krb5.conf的[libdefaults]部分有没有default_ccache_name配置,如果有的话,这个配置会覆盖KRB5CCNAME环境变量。如果它设置的不是KEYRING类型,要么注释掉这一行,要么改成:default_ccache_name = KEYRING:persistent:%{uid}注意这里用的是
%{uid},这是krb5配置文件里的专属变量,和Bash的$UID不一样。
内容的提问来源于stack exchange,提问作者Amit Akula

