我在 CentOS 7.3 上运行。
在以下场景中我该如何避免丢失 Kerberos TGT?
我理解在注销时不销毁 Kerberos 票证的安全隐患,我将对此进行更深入的研究。但我想从最简单的例子开始,我将在下面介绍。
[email protected]$ klist
klist: Credentials cache keyring 'persistent:25536700022:krb_ccache_h3j7qk7' not found
[email protected]$ kinit
Password for [email protected]:
[email protected]$ klist
Ticket cache: KEYRING:persistent:25536700022:krb_ccache_h3j7qk7
Default principal: [email protected]
Valid starting Expires Service principal
08/03/2018 17:06:45 08/04/2018 17:06:41 krbtgt/[email protected]
[email protected]$ ssh -K host
Last login: Fri Aug 3 17:06:21 2018 from 10.250.57.186
[email protected]$ klist
Ticket cache: KEYRING:persistent:25536700022:krb_ccache_h3j7qk7
Default principal: [email protected]
Valid starting Expires Service principal
08/03/2018 17:06:54 08/04/2018 17:06:41 krbtgt/[email protected]
[email protected]$ exit
logout
Connection to host closed.
[email protected]$ klist
klist: Credentials cache keyring 'persistent:25536700022:krb_ccache_h3j7qk7' not found
[email protected]$
更新 #1
如下更新 SSH 服务器配置可以解决所出现的问题:
GSSAPICleanupCredentials no
但是,无条件地这样做是不可取的,因为它会带来负面的安全隐患。在完成对机器的操作后,将未过期的票留在机器上是很危险的。
有关我们的用例的更多细节
我们使用 SSH 在远程主机上执行命令。远程主机上执行的命令反过来可能会使用 SSH 在其他主机上执行远程命令。这都是脚本/自动化的,所以我们不能允许出现输入密码的提示。这就是为什么我使用ssh-K 密码。 这-K标志将您的 Kerberos TGT 转发到您正在 SSH 连接的主机,从而使您可以从那里通过 SSH 连接到另一台主机而无需输入密码。
在我们的特定用例中,有时会发生我们使用 SSH 执行命令的“远程”主机之一就是我们已经在的主机。如果没有上面显示的配置更改,在“远程”命令执行完毕并退出 SSH 会话后,Kerberos 票证将被销毁——在我们当前所在的机器上!这样一来,我们就无法以无密码方式通过 SSH 连接所有主机了。
寻找适合我们用例的安全解决方案
以避免无条件的安全隐患不是在注销时销毁 Kerberos 票证,我想深入挖掘。
有没有办法做以下任一项?
- 仅当您通过 SSH 连接的计算机上尚未存在 Kerberos TGT 时才转发它
- 仅在退出时销毁您的 Kerberos 票证最后的shell 会话
还有其他我没有考虑到的可能性吗?
答案1
我最终将以下内容放入了我的.bash_profile中:
cleanup()
{
SHELL_COUNT=$(ps -elf | grep bash | grep $(whoami) | grep -v grep | wc -l)
if [[ "$SHELL_COUNT" -eq 2 ]]; then
kdestroy -q
fi
}
trap '
cleanup
' 0