C SSPI:从以本地管理员权限运行的进程中获取另一个用户的凭据

C SSPI:从以本地管理员权限运行的进程中获取另一个用户的凭据,c,windows,single-sign-on,kerberos,sspi,C,Windows,Single Sign On,Kerberos,Sspi,我正在Windows中运行具有loacl admin权限的进程,并尝试使用AcquireCredentialsHandle为另一个用户获取凭据句柄。 可以使用用户信息(例如用户、域、密码)传入SEC_WINNT_AUTH_身份结构并获取句柄。我已经核实过了。如果没有SEC_WINNT_AUTH_标识,仅传递pszPrincipal将无法工作 我想知道有没有其他方法可以做到这一点,而不提供用户密码 我正在运行以下场景: 客户端使用UPN获取kerberos令牌并将其发送到服务器 服务器尝试使用客户

我正在Windows中运行具有loacl admin权限的进程,并尝试使用AcquireCredentialsHandle为另一个用户获取凭据句柄。 可以使用用户信息(例如用户、域、密码)传入SEC_WINNT_AUTH_身份结构并获取句柄。我已经核实过了。如果没有SEC_WINNT_AUTH_标识,仅传递pszPrincipal将无法工作

我想知道有没有其他方法可以做到这一点,而不提供用户密码

我正在运行以下场景:

  • 客户端使用UPN获取kerberos令牌并将其发送到服务器
  • 服务器尝试使用客户端的UPN获取凭据句柄(AcquireCredentialsHandle)

  • 有什么建议吗?

    您通常不能代表其他用户申请票证。这将是一个非常危险的安全问题

    有两种方法可以解决这个问题

  • 使用S4U2Self,即应用程序使用传入的用户名向自己请求票证,这将代表用户向自己获取票证。这使您可以查看用户组成员身份之类的内容。您需要以
    系统运行
    或拥有
    SeImpersonatePrivilege
    才能执行此操作

  • 使用S4U2Proxy aka协议转换,即应用程序使用传入的用户名请求另一个服务的票证。这允许您仅基于名称模拟用户,并且必须由AD明确授予服务器和目标。这是一个极其危险的特权,因为您允许您的应用程序具有与KDC相同的权限

  • 不幸的是,这是一段相当复杂的代码,因此无法在本文中共享。您可以在此处找到示例应用程序:

    该过程的要点是:

  • 客户端向服务发送用户名
  • 服务配置为
    SeImpersonatePrivilege
    SeTcbPrivilege
    (意味着作为
    系统运行
  • 服务调用
    LsaLogonUser
    ,只传递用户名,返回NT令牌句柄
  • 使用来自(3)的令牌调用服务
    SetThreadToken
  • 没有任何凭据的服务调用
    AcquireCredentialsHandle
    (使用默认SSO凭据)
  • 服务调用
    InitializeSecurityContext
  • 服务将令牌发送到目标服务器

  • 谢谢你的解释@Steve。对于我的场景,首选的方式是什么?windows客户端希望访问Linux服务器上的服务。该服务正在以本地管理员身份运行。一旦用户通过身份验证,服务器将模拟该用户并作为模拟用户启动另一个程序。我们希望使用Kerberos。使用UPN登录和以本地管理员身份运行的服务(没有域帐户)在使用SSPI时不起作用?