对另一个域用户执行 sudo 时的权限

对另一个域用户执行 sudo 时的权限

假设我有一个使用 MS Active Directory 的企业域mydomain。在域中,我有用户myuseryouruser。现在,在一台特定的 Ubuntu 机器上mymachine,myuser 具有 sudo 权限,并且具有sudo su youruser(或sudo -u youruser sh)。由于 myuser 具有必要的 sudoers 配置,因此他不需要输入 youruser 的密码,并且实际上将成为 youruser机器。

  1. 此时将拥有什么样的youruser权限?显然,如果在计算机上也有主目录,现在可以访问它并读取他的私人本地文件。但是,如果尝试使用 kerberos、samba 等访问网络域资源,会发生什么?我猜想,由于他从未输入过 的密码,因此他没有被认证为域用户,没有 kerberos 票证等。因此,如果有一个网络服务检查他的用户 ID 的组成员身份,这也会失败吗?这是如何工作的?他是否被视为不同的用户,而不是?myuseryourusermyuseryourusermymachine\\yourusermydomain\\youruser

  2. 假设计算机上有一个 Web 服务作为守护进程运行,使用专用域用户myserviceuser。如果此 Web 服务需要访问网络资源(即使用 Kerberos 进行身份验证),则应如何设置守护进程(例如从 upstart 脚本设置)?通常,您使用类似 之类的命令启动它sudo -u myserviceuser <cmd>,但根据上述假设,这会授予 Web 服务访问网络资源的任何权限吗?难道不应该在某处输入此用户的密码吗?

答案1

在我看来,关于这个内容的清晰文献还不够多。

  1. 您说得对 - 如果服务受 kerberos 保护,则 su/sudo 不足以绕过必要的授权(除非目标用户拥有缓存的票证(因为他们当前已登录)或密钥表)。大多数资源(例如本地文件系统)都依赖 uidnumber 和 gidnumber 来识别用户,并且可以通过 root/sudo 访问绕过

  2. 这是一个有趣的问题,我目前正在工作中处理这个问题。比如说服务帐户阿帕奇需要访问使用 Kerberos 的 NFS 共享。您需要导出密钥表阿帕奇到本地文件系统并在服务启动时获取该源,定期通过 cron 更新其票证。RHEL7 有 gssproxy,它似乎可以简化这一点,但我还没有做到这一点。

密钥表实际上是已保存的凭证。如果有人可以访问它,他们就可以伪装成该用户。在 IPA 和 AD 中导出新的密钥表会更改帐户的密码。

Microsoft kerberos 略有不同,但大多数规则仍然适用。

答案2

我在 Kerberized NFSv4 目录上的 autofs 主目录遇到了类似的情况:

  • 如果我来自另一台使用 Kerberos 的机器,我可以使用可转发的 TGT 通过 SSH 连接到目标机器,并且目标机器上的帐户可以使用自动挂载的主目录正常登录。
  • 如果我不是来自另一台使用 Kerberos 的机器,我可以(根据本地 ACL)使用密码登录到该机器并让 PAM 生成票证。在这种情况下,自动挂载的主目录也会出现。
  • 如果我依赖于具有条目的帐户,则无法登录此计算机,~/.ssh/authorized_keys因为目标上的 SSH 守护程序无法访问主目录。它之所以无法访问,并不是因为它被卸载了,而是因为 SSH 守护程序没有 TGT 来访问包含该文件的主目录authorized_keys
  • 一旦我获得了对一台机器的访问权限,无论sudo权限如何,我都无法sudo su访问其他用户的帐户,除非他们的主目录无法访问——同样,我没有他们的 TGT。
  • 在那台机器上,我 su到他们的帐户,如果我有他们的密码,那么登录时他们的主目录就可用,因为通过suPAM 登录,并且这给了我一个允许自动挂载成功的 TGT。
  • 在 TGT 存储在可访问密钥库(如系统密钥链)的体系结构中,除非明确执行 ,否则不会通过注销来删除 TGT kdestroy。现在我可以sudo su访问该用户的帐户,并且自动挂载主目录将会成功。

这里的共同点是,除非从另一台机器传输了可转账单,或者用户拥有通过某种形式的登录或获取账单的密码,否则无法访问 TGT kinit

允许服务帐户偶尔托管用户(例如,为了集中化复杂的配置,如~/.kube/),出于同样的原因,将密钥表放在帐户目录中是不够的,authorized_keys而且也行不通。依靠具有较长生命周期的票证和 cron 作业来补充系统钥匙串也是不够的,因为重新启动会清除钥匙串,并且直到下一次 cron 调用(可能需要一段时间)之前都不可用。在一组机器上设置这样的 cron 也是一团糟。

相关内容