Kerberos klist 未显示票证

Posted

技术标签:

【中文标题】Kerberos klist 未显示票证【英文标题】:Kerberos klist is displaying no ticket 【发布时间】:2021-12-12 13:24:54 【问题描述】:

说明

我正在尝试运行一个多次运行需要 Kerberos 的脚本的脚本。 MainScript.sh 有一个循环,它将随着时间的推移多次启动ScriptUsingKerberos.sh(每天超过 600 次)。例如:

./MainScript.sh
|-- ScriptUsingKerberos.sh
|-- ScriptUsingKerberos.sh
|-- ...
\-- ScriptUsingKerberos.sh

ScriptUsingKerberos.sh - 检查我的 Kerberos 票证有效性的部分:

echo " INFO: Checking the validity of your last Kerberos ticket..."
if ! klist 2>&1 | grep -q "$USER_NAME@$DOMAIN"
then
    echo "ERROR: User $USER_NAME do not match user listed in 'oklist' command, aborting."
    exit 1
fi

aKerberosExpirationDate="$(klist 2>&1 | tr '[:blank:]' ' ' | grep -o '[[:blank:]][0-9][0-9]/[0-9][0-9]/[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9][[:blank:]][[:blank:]]*oracle' | sed 's/oracle//g' | sed 's/^[[:blank:]]*//g' | sed 's/[[:blank:]]*$//g' | sed -r 's;([0-9][0-9])/([0-9][0-9])/([0-9][0-9]);20\3-\1-\2;g' | while IFS= read -r aLine; do date +%s -d "$aLine"; done | sort -n | head -n 1)"
aNowDate=$(date +%s)
if [[ -z "$aKerberosExpirationDate" || $aKerberosExpirationDate -le $aNowDate ]]
then
    if ! 2>/dev/null 1>&2 kinit "$USER_NAME@$DOMAIN" <<< "$USER_PASSWORD"
    then
        echo "ERROR: Your password in $FILE_PWD file seems incorrect or Kerberos token reset failed"
        exit 1
     fi
fi

工作案例

所以这工作得很好。 klist 工作示例:

Ticket cache: FILE:/tmp/krb5cc_8522420
Default principal: ********@******.***

Valid starting     Expires            Service principal
10/27/21 08:42:08  10/27/21 18:42:08  krbtgt/********@******.***@********@******.***
        renew until 10/28/21 08:42:08
01/01/70 00:00:00  01/01/70 00:00:00  krb5_ccache_conf_data/pa_type/krbtgt\/********@******.***\@********@******.***@X-CACHECONF:
10/27/21 08:42:08  10/27/21 18:42:08  oracle/********@********@******.***
        renew until 10/28/21 08:42:08


Kerberos 4 ticket cache: /tmp/tkt8522420
klist: You have no tickets cached

在这里我们可以看到一张票,所以我可以用 grep 来检查它的有效性

不工作的情况

但在某些时候,在多次成功执行后,我只得到:

Kerberos Utilities for Linux: Version 18.0.0.0.0 - Production on 27-OCT-2021 08:10:17

Copyright (c) 1996, 2017 Oracle.  All rights reserved.

然后我无法检查 Kerberos 票证的有效性,我猜测有错误退出

问题

为什么 klist 不再显示任何票证了? 这是正常行为吗? 有没有办法使用 klist 继续显示过期的票证? 是否有任何守护程序/程序可以重置 Kerberos 票证的有效性?

【问题讨论】:

Kerberos 票据有两个值来定义它们的生命周期和可更新时间。请参阅:***.com/a/15457265/7939871 一旦票证过期,它就不再在列表中,如果续订期限允许,您可以要求续订票证。您可能会让脚本将其当前票证存储在具有续订截止日期的文件中。在脚本启动时,检查保存的票证是否仍然有效,或者是否可以续订,如果没有,则请求新票证(这意味着用户重新进行身份验证)。 【参考方案1】:

为什么 klist 不再显示任何票证了?

这实际上让我怀疑你有两套 Kerberos 工具 - 即你有 MIT klist Oracle klist(我不知道存在!)在不同的位置.

但是您应该进一步调查:让您的脚本记录$KRB5CCNAME$PATH 的值以及which klist 返回的完整路径,并查看它们中的任何一个是否在某个时候发生了变化。 (例如,您的脚本可能更改了 $PATH,突然发现一个与以前不同的“klist”工具,而另一个“klist”使用了不兼容的票证缓存格式。)

有没有办法用 klist 继续显示过期的票证?

总是这样。如果票证消失了,这意味着要么是某些东西删除了他们(而且肯定不是klist),要么是你正在查看与以前完全不同的凭据缓存。

是否有任何守护程序/程序可以重置 Kerberos 票证的有效性?

是的,有多个选项,尽管它们通常需要您有一个 keytab 而不是密码。 (服务,即使是作为客户端的服务,通常也有 keytab。)

使用来自kstart 的k5startkrenew。前者用于获取票证并立即启动客户端(只要程序运行,它将不断更新票证),而后者可用于维护手动获取的票证。这是相当便携的;您应该能够在任何 Linux 或类 Unix 操作系统上安装它。

使用每 3 小时左右调用一次 kinit 的 cronjob。这在任何地方都有效。

将工单管理委托给gss-proxy。这是特定于 Linux 的。

如果使用 MIT Krb5,使用 keytab 路径导出 KRB5_CLIENT_KTNAME=,libkrb5 本身会在需要时获取票证。这需要一个相当新的 MIT Krb5 - 你的可能太旧了(从它仍然支持 Kerberos 4 的事实来看)。

哦,如果您选择使用kinit,那么询问klist -s 门票是否有效可能会更容易:

if klist -5 -s; then
    echo "I have a valid TGT, continuing."
    # (Of course, it could be valid for only 5 seconds, but you're currently
    # not checking for that anyway.)
else
    echo "I don't have a valid TGT, trying to get one using a keytab."
    if ! kinit -k -t "$keytab_path"; then
        echo "Failed to get a TGT!"
        exit 1
    fi
fi

【讨论】:

以上是关于Kerberos klist 未显示票证的主要内容,如果未能解决你的问题,请参考以下文章

在没有用户密码的情况下生成 AD Kerberos 票证

当 kerberos 票证过期时,Java 客户端挂起

如何使用 GSS API 更新 kerberos 服务票证

Kerberos 不签发可更新票证

从授权标头中的 Kerberos 票证中读取用户名

在 SOAP Web 服务调用中将 Kerberos 票证作为参数传递