假设我有一个使用 MS Active Directory 的企业域mydomain
。在域中,我有用户myuser
和youruser
。现在,在一台特定的 Ubuntu 机器上mymachine
,myuser 具有 sudo 权限,并且具有sudo su youruser
(或sudo -u youruser sh
)。由于 myuser 具有必要的 sudoers 配置,因此他不需要输入 youruser 的密码,并且实际上将成为 youruser那机器。
此时将拥有什么样的
youruser
权限?显然,如果在计算机上也有主目录,现在可以访问它并读取他的私人本地文件。但是,如果尝试使用 kerberos、samba 等访问网络域资源,会发生什么?我猜想,由于他从未输入过 的密码,因此他没有被认证为域用户,没有 kerberos 票证等。因此,如果有一个网络服务检查他的用户 ID 的组成员身份,这也会失败吗?这是如何工作的?他是否被视为不同的用户,而不是?myuser
youruser
myuser
youruser
mymachine\\youruser
mydomain\\youruser
假设计算机上有一个 Web 服务作为守护进程运行,使用专用域用户
myserviceuser
。如果此 Web 服务需要访问网络资源(即使用 Kerberos 进行身份验证),则应如何设置守护进程(例如从 upstart 脚本设置)?通常,您使用类似 之类的命令启动它sudo -u myserviceuser <cmd>
,但根据上述假设,这会授予 Web 服务访问网络资源的任何权限吗?难道不应该在某处输入此用户的密码吗?
答案1
在我看来,关于这个内容的清晰文献还不够多。
您说得对 - 如果服务受 kerberos 保护,则 su/sudo 不足以绕过必要的授权(除非目标用户拥有缓存的票证(因为他们当前已登录)或密钥表)。大多数资源(例如本地文件系统)都依赖 uidnumber 和 gidnumber 来识别用户,并且可以通过 root/sudo 访问绕过
这是一个有趣的问题,我目前正在工作中处理这个问题。比如说服务帐户阿帕奇需要访问使用 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
到他们的帐户,如果我有他们的密码,那么登录时他们的主目录就可用,因为通过su
PAM 登录,并且这给了我一个允许自动挂载成功的 TGT。 - 在 TGT 存储在可访问密钥库(如系统密钥链)的体系结构中,除非明确执行 ,否则不会通过注销来删除 TGT
kdestroy
。现在我可以sudo su
访问该用户的帐户,并且自动挂载主目录将会成功。
这里的共同点是,除非从另一台机器传输了可转账单,或者用户拥有通过某种形式的登录或获取账单的密码,否则无法访问 TGT kinit
。
允许服务帐户偶尔托管用户(例如,为了集中化复杂的配置,如~/.kube/
),出于同样的原因,将密钥表放在帐户目录中是不够的,authorized_keys
而且也行不通。依靠具有较长生命周期的票证和 cron 作业来补充系统钥匙串也是不够的,因为重新启动会清除钥匙串,并且直到下一次 cron 调用(可能需要一段时间)之前都不可用。在一组机器上设置这样的 cron 也是一团糟。