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 的k5start
或krenew
。前者用于获取票证并立即启动客户端(只要程序运行,它将不断更新票证),而后者可用于维护手动获取的票证。这是相当便携的;您应该能够在任何 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 未显示票证的主要内容,如果未能解决你的问题,请参考以下文章