我们使用的是 Oracle Linux 7.9,它是 Kerberos 领域的一部分。
我希望帐户foo
能够执行(无需任何密码)一个命令以已获取的bar
Kerberos 凭据的帐户身份进行操作bar
,但不授予foo
shell 访问权限,以便bar
在交互式会话中完全模拟帐户。
我该如何正确地实现这一点?我看到她的一个选择是
- 一个包装器脚本,在从 keytab 文件执行 kinit 后执行所需的命令,
bar
以及 - 允许执行包装脚本的 sudo 规则
foo
。
我觉得这种方法不太好。有什么合适的解决方案吗?
答案1
使用或类似方式运行命令sudo
实际上是一种相当好的方法——它提供基于 UID 的分离,以防止调用者访问临时票证。
您可以使用 gss-proxy 或 KRB5_CLIENT_KEYTAB 让 libkrb5 代表用户自动获取票证(或通过使用 cronjob 使用 kinit 获取票证),从而避免使用包装脚本,但除此之外,它必须以与您描述的相同的方式运行。
或者,你可以保留包装器脚本并让它sudo 本身如果需要的话。也就是说,如果/usr/local/bin/cmdbar
以“bar”以外的任何其他用户身份调用,它会sudo -u bar
自行调用,调用者无需担心这一点。
if [ "$(whoami)" != bar ]; then
exec sudo -u bar -- "$0" "$@" || exit
fi
如果关键的是甚至没有“酒吧”有权访问 keytab (例如,如果运行的命令是授予无限制文件访问权限的命令,则有几个选项:
使用 gssproxy(如果命令使用标准系统 libkrb5)。keytab 只需由 gssproxy 访问,而命令的 libkrb5 库将要求 gssproxy 执行所有 Kerberos 操作,类似于 ssh-agent 的工作方式。这将标准从“读取票据文件”提升到“通过套接字与 gssproxy 对话”。
使用另一个帐户
sudo -u ... kinit
,指定仅有的必要的服务主体(不是 krbtgt!),然后通过 sudo-chown 将生成的票证缓存指定为bar
。可能是某种形式的“受限委派”,其中 gssproxy 可以使用其机器密钥表以有限的方式模拟
bar
和获取服务票证。(gssproxy 文档有一个使用 NFS 执行此操作的示例。)