为用户(S4U)令牌创建服务

问题描述 投票:0回答:1

Windows 任务计划程序可以创建使用特定用户的帐户运行的任务,而无需存储用户密码。他们称之为“S4U”,即为用户服务。这应该类似于调度程序为当前用户创建这样的令牌,并可以使用它在该用户帐户下运行计划的进程。他们声称无法使用该系统访问网络或加密资源。调度程序本身使用 SYSTEM 帐户运行才能工作。这是一篇描述它的文章。相关引用:

TASK_LOGON_S4U 是另一个提供更安全的选项 选择。它利用用户 (S4U) 登录服务 代表指定用户运行任务,但无需 存储密码。由于任务计划程序在本地运行 系统帐户,它可以创建S4U登录会话并接收令牌 不仅可以用于身份识别,还可以用于 在本地计算机上模拟。通常 S4U 令牌就够了 用于识别。

我需要在我的应用程序中使用此身份验证方案,但不能让任务计划程序执行此操作,而是需要自己执行此操作,因为我需要它用于任意数量的帐户。每当用户向我的应用程序注册任务时,任何后续任务都必须在同一用户下运行。但由于它们不能重叠,所以我需要自己进行序列化。

我找不到关于这个“S4U”的任何信息。我如何在我的应用程序中实现它?首选 C#,但 WINAPI 和 C 也可以。

更新:这是我尝试过的,但不起作用。

// The WindowsIdentity(string) constructor uses the new
// Kerberos S4U extension to get a logon for the user
// without a password.
WindowsIdentity wi = new WindowsIdentity(identity);
WindowsImpersonationContext wic = null;
try
{
  wic = wi.Impersonate();
  // Code to access network resources goes here.
}
catch()
{
  // Ensure that an exception is not propagated higher in the call stack.
}
finally
{
  // Make sure to remove the impersonation token
  if( wic != null)
    wic.Undo();
}

但我现在的印象是,你不能只是说你想成为某个用户。甚至不作为系统。您需要以该用户身份登录,并且可以生成一些令牌,使您可以稍后再次成为该用户,而无需密码。所以这肯定是一个两步的事情,首先我需要获取令牌并将其存储在磁盘上;稍后我可以使用该令牌来模拟。这些例子都没有解释这一点。

windows security
1个回答
0
投票

“计算机可能未加入域”

S4U 需要访问 KDC。 S4U实际上是两个协议。 S4U2Self 和 S4U2Proxy。它所做的是使用 Kerberos 的附加功能来获取用户的服务票证,但是获取票证的帐户必须启用特殊的委派。 请参阅此处了解此设置。

但是除非您实际上让进程终止等,否则为什么不直接获取用户服务票证或 TGT 呢?您的应用程序是本地应用程序还是远程运行的服务?

任务调度程序需要换一个新的,因为服务票证不是永远有效的。或者在某些委托方案中,用户尚未将服务票证传递给应用程序服务器,然后 AS 通过 S4U2Self 请求服务票证,然后使用该服务票证通过 S4U2Proxy 请求第二个服务的票证。

© www.soinside.com 2019 - 2024. All rights reserved.