聊聊 Kerberos 的 kinit 命令和 ccache 機(jī)制
1. 前言
大家好,最近遇到了個(gè) kerberos 相關(guān)問題,“客戶端節(jié)點(diǎn)上執(zhí)行 kinit -R 命令報(bào)錯(cuò):KDC can't fulfill requested option while renewing credentials”, 在次跟大家分享下問題的解決方式,和背后的相關(guān)知識點(diǎn),主要涉及到 kerberos 的 kinit 命令和 ccache 機(jī)制。
2. 問題現(xiàn)象與問題日志
- 問題現(xiàn)象: 客戶端執(zhí)行命令 kinit -R 報(bào)錯(cuò): “KDC can't fulfill requested option while renewing credentials”;
- 問題日志:查看 KDC 服務(wù)端日志/var/log/krb5kdc.log 可知,上述報(bào)錯(cuò)對應(yīng)的請求是 TGS_REQ,細(xì)節(jié)是 liming@TEST.COM for krbtgt/TEST.COM@TEST.COM,其錯(cuò)誤原因是 ticket not renewable, 即 ticket 不可刷新;
3. 問題原因
那么 “ticket not renewable” 的原因又有哪些呢?主要有以下幾個(gè):
- 服務(wù)端配置文件 /var/kerberos/krb5kdc/kdc.conf 或 /etc/krb5.conf 中對應(yīng)的 realms 段中沒有配置允許 renew ticket;
- 服務(wù)端生成 krbtgt 這個(gè) principal 時(shí),沒有配置參數(shù) maxrenewlife,即沒有指定其 ticket 的最大可刷新時(shí)長;
- 服務(wù)端生成用戶的 principal 時(shí),沒有配置參數(shù) maxrenewlife,即沒有指定其 ticket 的 最大可刷新時(shí)長(如報(bào)錯(cuò)日志中的 liming@TEST.COM);
- 客戶端上次成功登陸后,獲得的 krbtgt 這個(gè) service principal 的可刷新時(shí)間已過期,其過期原因是超過了服務(wù)端配置的 maxrenewlife(如報(bào)錯(cuò)日志中的krbtgt/TEST.COM@TEST.COM);
- 客戶端上次成功登陸后,用戶 principal 的 ticket 已過期,其過期原因是超過了服務(wù)端配置的 ticket_lifetime,該參數(shù)一般配置為 24 h(如報(bào)錯(cuò)日志中的liming@TEST.COM);
4. 問題解決方案與操作步驟
通過上述分析,我們知道,為解決問題,需要更改服務(wù)端的配置參數(shù)max_renewable_life,需要更改服務(wù)端上述兩個(gè) principal 的 maxrenewlife,并確保客戶端指定 kinit -R 時(shí) krbtgt 并沒有過期,才能確保任務(wù)執(zhí)行成功。
- 服務(wù)端更改或確認(rèn)配置文件/var/kerberos/krb5kdc/kdc.conf 或 /etc/krb5.conf 中,對應(yīng)的 realms 段中需要配置參數(shù)允許刷新:max_renewable_life;
- 服務(wù)端更過或確認(rèn)上述兩個(gè) principal 的參數(shù) maxrenewlife,示例命令如下:
modprinc -maxrenewlife "1 week" +allow_renewable liming@TEST.COM
modprinc -maxrenewlife "1 week" +allow_renewable krbtgt/TEST.COM@TEST.COM
kadmin.local -q "getprinc krbtgt/TEST.COM@TEST.COM" | grep -i life
kadmin.local -q "getprinc liming@TEST.COM" | grep -i life
- 上述配置修改或確認(rèn)完畢后,還需要重新登錄以生成新的 ticket,后續(xù)的 kinit -R 命令才能成功執(zhí)行;
- 同時(shí)可以看到,改動 principal 的參數(shù) maxrenewlife 前,klist 不提示 renew until ...,而改動 principal 的參數(shù) maxrenewlife后,klist 會提示 renew until ....,即在次日期之前可以使用 kinit -R 刷新 ticket;
5. 背景知識: kinit 命令與 ccache 機(jī)制
- 用戶在客戶端通過 kinit 成功登錄 kerberos 后,會將獲得的 ticket-granting ticket 緩存到客戶端的 ccache (credentail cache) 文件中;
- ccache 文件地址是通過配置文件 /etc/krb5.conf 中的參數(shù) default_ccache_name來配置的,在 linux 操作系統(tǒng)中一般是配置為 FILE:/tmp/krb5cc_%{uid},實(shí)際對應(yīng)文件 /tmp/krb5cc_0 等;
- "kinit -R" 命令,可以用來刷新 ticket-granting ticket,即 tgt;
- "kinit -R" 命令,只能在 ticket 沒有過期之前,且還在 krbtgt 可刷新時(shí)間之前,刷新 ticket;
- "kinit -R" 成功刷新 ticket 之后, 會更新 ccache (credentail cache) 文件,大家可以通過 ls -al 命令查看 linux 中該文件的 ctime 確認(rèn)這一點(diǎn);
- kinit 登錄,對應(yīng)的是 AS_REQ,需要 KDC 中的 Authentication Server (AS) 校驗(yàn)用戶身份,獲得的是krbtgt,對應(yīng) kerberos 日志中的:liming@TEST.COM for krbtgt/TEST.COM@TEST.COM;
- kinit 認(rèn)證完畢后,后續(xù)使用受 kerberos 保護(hù)的服務(wù),比如登錄 hiveserver2時(shí),命令格式為:beeline -u "jdbc:hive2://uf30-2:10000/default;principal=hive/_HOST@TEST.COM", 此時(shí)在底層是一個(gè) TGS_REQ,對應(yīng) kerberos 日志中的:liming@TEST.COM for hive/cdp2@TEST.COM;
- kinit -R 續(xù)期 tgt,對應(yīng)的是 TGS_REQ, 需要 KDC 中的 Ticket Granting Server (TGS) 的響應(yīng),其效果是刷新了krbtgt,更新了 ccache 文件如 /tmp/krb5cc_0, 對應(yīng) kerberos 日志中的:liming@TEST.COM for krbtgt/TEST.COM@TEST.COM;
[root@uf30-1 ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin/admin@CDH.COM
Valid starting Expires Service principal
11/13/2020 13:08:27 11/14/2020 13:08:27 krbtgt/CDH.COM@CDH.COM
renew until 11/20/2020 13:08:27
[root@uf30-1 ~]# kinit -R
[root@uf30-1 ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin/admin@CDH.COM
Valid starting Expires Service principal
11/13/2020 19:38:15 11/14/2020 19:38:15 krbtgt/CDH.COM@CDH.COM
renew until 11/20/2020 13:08:27