【发布时间】:2020-02-23 16:26:33
【问题描述】:
我有分布式系统,通过Windows身份验证访问一些内部网络资源:
- 用户 #345 请求 -> MyWebInterface -> SerializableQueue -> Worker #123
- Worker #123 通过 WinAuth 访问资源(当前在服务帐户下,而不是从用户帐户)。
- 用户 #345 响应
问题出在第 2 步 - 我需要模拟用户 #345,然后访问资源。这是使用此资源的安全要求。
应该如何序列化用户凭据,然后在工作人员处反序列化它们以完成 WinAuth 模拟?
【问题讨论】:
-
AFAIK 只要用户 #345 不提供他的用户名和密码,你就不能。
-
在这种情况下仔细考虑“安全要求”是否正确。赋予进程模拟任意用户的能力,除了很难做到之外,对安全性也有很大的影响,因为它使事情不太安全,而不是更多。您几乎总是最好为服务提供不受限制的访问权限,但让它明确地验证用户对资源的访问权限。这只需要用户经过验证的身份,而不是他们的凭据。
-
@JeroenMostert 目前检查权限的唯一可用选项是通过模拟。没有用于显式检查的 API,所以我只能完成模拟和“运行检查”它们。工人无权访问资源,也不应该有任何资源,它应该能够代表用户完成一些工作。我知道这很可悲,但对其他团队项目无能为力。
-
那么你有一项令人羡慕的任务,基本上是从头再来一遍 Kerberos。通常你会使用 Kerberos 约束委派,但由于工作是排队的,这意味着持有可能过期的票证。请记住,如果服务能够代表用户完成“某些”工作,那么它可以代表用户做任何事情。这通常比服务对资源拥有的任何特权更加敏感和容易被滥用——服务中的漏洞会泄露王国的密钥,而不是资源的密钥。
-
虽然我同意你的观点,但一般用户在启动时在windows中输入用户名/密码,所以他已经给出了密钥,它们被第三方机构混淆,但仍然作为密钥。问题是为什么不能在链中再次重新检查这些密钥。谷歌通过要求您授予许可来做到这一点,而不是要求您重新输入密码。如我所见,Windows 不能做同样的事情。
标签: c# windows impersonation sspi