kinit: Failed to store credentials: Internal credentials cache error (filename: /tmp/krb5cc_1006)

文章讨论了在多任务环境中,Kerberos认证的并发问题导致的cache冲突,以及通过设置KRB5CCNAME环境变量来避免这个问题。作者指出,共享同一个用户认证可能导致安全性问题,建议每个用户应有自己的账号和keytab,或者使用独立的缓存。同时,对于大量任务是否都需要单独kinit,提出了疑问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[INFO] 2022-12-29 16:24:26.021  - [taskAppId=TASK-678-305576-2357578]:[127] -  -> workspace /data/DATA_DIR/share/dw_ia_portraitsearch
    kinit -kt /data/DATA_DIR/share/keytab/hive.keytab hive@CDP.COM
    kinit: Failed to store credentials: Internal credentials cache error (filename: /tmp/krb5cc_1006) while getting initial credentials

脚本在执行kinit的过程中 报错,注意 这个错是随即错,也就是有时候会出现,有时候不会出现。

出现原因也很简单,就是多个任务同时执行kinit。。。

网上看到的大多文章都是起源这篇

Parallel kinit calls lead to a corrupted Kerberos cache - Stack Overflow

当时出了这个问题后,我看小组里的用到了这个办法

export KRB5CCNAME=tmp/krb5cc_`date +%m%d%H%M%S%N`

指定了一个环境变量有什么用吗? 我暂时是感觉不到,但是别人说有用,也许有点,开始研究下,见到了这篇文章。

Kerberos kinit crontab定时任务不生效的问题解决 - 一杯半盏 - 博客园

我们linux常规认证kerberos 一般都是

kinit -kt /data/DATA_DIR/share/keytab/hive.keytab hive@CDH.COM

kinit -kt /data/DATA_DIR/share/keytab/hive.keytab hive-- 可以省略后面的realm

那么我们认证了这个会发生那些物理变化?

 通过klist可以看到生成了一个cache  /tmp/krb5cc_1000,其中后缀1000也就是devuser的uid ,我们在tmp目录下就看到了这个。

先不讨论上面的问题。我们来测试一下。

同时开两个窗口a b 登录用户都是devuser

然后窗口a,kinit 认证,b能否直接hdfs dfs -ls /

kinit -kt /data/DATA_DIR/share/keytab/hive.keytab hive 

可以看到左边显示kdestroy了,右边klist 确实没了,然后左边认证,右边可以hdfs dfs -ls/ 成功。

这个说明什么问题? 当我们devuser认证了,那么其他用户在使用devuser的时候都是有权限的,即使我现在再重新开一个窗口。

这样好吗?不好!!!但是无所谓,没人会在意这细节,能够认证已经花费我们的大部分精力了,还想要我咋样???但是今天没事就研究下。

比如现在有这种要求,生产环境只给大家一个devuser的用户去登录,并且按照良好习惯要求大家kinit认证使用完了之后即使kdestroy。

那么会出现 a 登录后 kinit  开始做xxxxxx ,

这时b也登录devuser ,但是b发现klist有人已经认证了,那b怎么办,(b现在也可以hdfs dfs -ls )

但是呢 万一我工作了一半,此时a工作完了kdestroy了 我怎么办?

 

 上一秒我还可以好好干活 下一秒我就不能干活了。 有人又说了你重新认证下步就好了吗?

确实是,但是我重新认证的过程中,万一又来了个c,和我同样的遭遇呢?

又有人说不destroy不就好了?一般认证可以管一天 续期7天,七天认证下,不也可以么?问题的关键是 你这样一直认证确实可以解决,但是我们使用kerberos的目的就是安全,你这样一直认证,等于说别人只要知道了你devuser的密码就可以(等你认证或有效期内)在hdfs上为所欲为 ,而之前他需要kinit,他需要知道keytab的位置和principal。

所以其实最好的办法是一人一个账号 一个keytab

或者就是 每个人使用不同的缓存去认证,你destroy是去掉自己的缓存而我不受影响。

左边还是认证的krb5cc_1000, 右边认证的krb5cc_devuser 我们自己搞得一个cache。两者互不干扰,左边destroy了右边还是可以的。

所以同事的那种export KRB5CCNAME=tmp/krb5cc_`date +%m%d%H%M%S%N` 是可行的。

但是真的需要这个么?

我们的脚本都是通过dolphin去调用shell,dolphin的用户对应的租户都是producer,就是说只有一个用户,但是有成千上万个任务,真的需要全部都kinit一遍吗?

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值