1. 前言

大家好,最近遇到了個 kerberos 相關問題,“客戶端節點上執行 kinit -R 命令報錯:KDC can"t fulfill requested option while renewing credentials”, 在次跟大家分享下問題的解決方式,和背后的相關知識點,主要涉及到 kerberos 的 kinit 命令和 ccache 機制。

2. 問題現象與問題日志問題現象: 客戶端執行命令 kinit -R 報錯: “KDC can"t fulfill requested option while renewing credentials”;問題日志:查看 KDC 服務端日志/var/log/krb5kdc.log 可知,上述報錯對應的請求是 TGS_REQ,細節是 liming@TEST.COM for krbtgt/TEST.COM@TEST.COM,其錯誤原因是 ticket not renewable, 即 ticket 不可刷新;3. 問題原因

那么 “ticket not renewable” 的原因又有哪些呢?主要有以下幾個:

服務端配置文件 /var/kerberos/krb5kdc/kdc.conf 或 /etc/krb5.conf 中對應的 realms 段中沒有配置允許 renew ticket;服務端生成 krbtgt 這個 principal 時,沒有配置參數 maxrenewlife,即沒有指定其 ticket 的最大可刷新時長;服務端生成用戶的 principal 時,沒有配置參數 maxrenewlife,即沒有指定其 ticket 的 最大可刷新時長(如報錯日志中的 liming@TEST.COM);客戶端上次成功登陸后,獲得的 krbtgt 這個 service principal 的可刷新時間已過期,其過期原因是超過了服務端配置的 maxrenewlife(如報錯日志中的krbtgt/TEST.COM@TEST.COM);客戶端上次成功登陸后,用戶 principal 的 ticket 已過期,其過期原因是超過了服務端配置的 ticket_lifetime,該參數一般配置為 24 h(如報錯日志中的liming@TEST.COM);4. 問題解決方案與操作步驟

通過上述分析,我們知道,為解決問題,需要更改服務端的配置參數max_renewable_life,需要更改服務端上述兩個 principal 的 maxrenewlife,并確??蛻舳酥付?kinit -R 時 krbtgt 并沒有過期,才能確保任務執行成功。

服務端更改或確認配置文件/var/kerberos/krb5kdc/kdc.conf 或 /etc/krb5.conf 中,對應的 realms 段中需要配置參數允許刷新:max_renewable_life;服務端更過或確認上述兩個 principal 的參數 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

上述配置修改或確認完畢后,還需要重新登錄以生成新的 ticket,后續的 kinit -R 命令才能成功執行;同時可以看到,改動 principal 的參數 maxrenewlife 前,klist 不提示 renew until ...,而改動 principal 的參數 maxrenewlife后,klist 會提示 renew until ....,即在次日期之前可以使用 kinit -R 刷新 ticket;5. 背景知識: kinit 命令與 ccache 機制用戶在客戶端通過 kinit 成功登錄 kerberos 后,會將獲得的 ticket-granting ticket 緩存到客戶端的 ccache (credentail cache) 文件中;ccache 文件地址是通過配置文件 /etc/krb5.conf 中的參數 default_ccache_name來配置的,在 linux 操作系統中一般是配置為 FILE:/tmp/krb5cc_%{uid},實際對應文件 /tmp/krb5cc_0 等;"kinit -R" 命令,可以用來刷新 ticket-granting ticket,即 tgt;"kinit -R" 命令,只能在 ticket 沒有過期之前,且還在 krbtgt 可刷新時間之前,刷新 ticket;"kinit -R" 成功刷新 ticket 之后, 會更新 ccache (credentail cache) 文件,大家可以通過 ls -al 命令查看 linux 中該文件的 ctime 確認這一點;kinit 登錄,對應的是 AS_REQ,需要 KDC 中的 Authentication Server (AS) 校驗用戶身份,獲得的是krbtgt,對應 kerberos 日志中的:liming@TEST.COM for krbtgt/TEST.COM@TEST.COM;kinit 認證完畢后,后續使用受 kerberos 保護的服務,比如登錄 hiveserver2時,命令格式為:beeline -u "jdbc:hive2://uf30-2:10000/default;principal=hive/_HOST@TEST.COM", 此時在底層是一個 TGS_REQ,對應 kerberos 日志中的:liming@TEST.COM for hive/cdp2@TEST.COM;kinit -R 續期 tgt,對應的是 TGS_REQ, 需要 KDC 中的 Ticket Granting Server (TGS) 的響應,其效果是刷新了krbtgt,更新了 ccache 文件如 /tmp/krb5cc_0, 對應 kerberos 日志中的:liming@TEST.COM for krbtgt/TEST.COM@TEST.COM;

[root@uf30-1 ~]# klistTicket cache: FILE:/tmp/krb5cc_0Default principal: admin/admin@CDH.COMValid starting Expires Service principal11/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 ~]# klistTicket cache: FILE:/tmp/krb5cc_0Default principal: admin/admin@CDH.COMValid starting Expires Service principal11/13/2020 19:38:15 11/14/2020 19:38:15 krbtgt/CDH.COM@CDH.COM renew until 11/20/2020 13:08:27

標簽: kerberos