Kerberos klist 未显示票证

Kerberos klist is displaying no ticket

描述

我正在尝试 运行 一个脚本 运行 多次需要 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--;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 票证的有效性,我退出猜测有一个错误

问题

Why klist is not displaying any ticket anymore?

这实际上让我怀疑您有两套 Kerberos 工具 – 即您有 MIT klist Oracle klist(我没有'不知道它存在!)在不同的位置。

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

Is there a way to continue to display outdated ticket as before with klist?

总是这样。如果票证消失了,这意味着 删除了 它们(当然不是 klist),或者您正在查看与以前完全不同的凭据缓存。

Is any daemon/program that reset Kerberos tickets validity?

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

  • 使用 kstart 中的 k5startkrenew。前者用于获取门票并立即启动客户端(只要程序运行,它就会不断更新门票),而后者可用于维护手动获取的门票。这是相当便携的;你应该能够在任何 Linux 或 Unix-like OS.

    上安装它
  • 使用每 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