使用 Kerberos 凭据执行 sudo

使用 Kerberos 凭据执行 sudo

我们使用的是 Oracle Linux 7.9,它是 Kerberos 领域的一部分。

我希望帐户foo能够执行(无需任何密码)一个命令以已获取的barKerberos 凭据的帐户身份进行操作bar,但不授予fooshell 访问权限,以便bar在交互式会话中完全模拟帐户。

我该如何正确地实现这一点?我看到她的一个选择是

  1. 一个包装器脚本,在从 keytab 文件执行 kinit 后执行所需的命令,bar以及
  2. 允许执行包装脚本的 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 执行此操作的示例。)

相关内容