切换应用程序以使用基于约束的 kerberos

Switching application to use Constraint based kerberos

我有一个使用基于委托的 kerberos 设置的旧应用程序。该应用程序的所有功能都运行良好,直到我们在我们的 Windows 10 台新机器之一上进行了试用。

一段时间后,我们终于发现 Credential guard 不能很好地处理这个旧应用程序。

根据https://docs.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard-considerations

Kerberos Considerations

When you enable Windows Defender Credential Guard, you can no longer use Kerberos unconstrained delegation or DES encryption. Unconstrained delegation could allow attackers to extract Kerberos keys from the isolated LSA process. Use constrained or resource-based Kerberos delegation instead.

我们必须将我们的实现切换为使用基于约束的 Kerberos。我有点不知道该怎么做。

我们当前的 SPN 是针对 Web 应用程序名称设置的 -(此 link 中的场景 2 - https://support.microsoft.com/en-ca/help/929650/how-to-use-spns-when-you-configure-web-applications-that-are-hosted-on

setspn -a http/WebSiteName webServerName
setspn -a http/WebSiteName.domain.com webServerName

应用程序只与 Active Directory 对话。不涉及数据库。该站点目前是 运行 具有域帐户的应用程序池。

当我尝试像

这样的命令时
$comp = Get-ADComputer DcOrAnotherComputer
Set-AdComputer -identity webServerName -PrincipalsAllowedToDelegateToAccount $comp

我收到以下 powershell 错误。

Set-AdComputer : The attribute cannot be modified because it is owned by the system
At line:2 char:1
+ Set-AdComputer -identity hql-dmeds01 -PrincipalsAllowedToDelegateToAccount $comp
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (hql-dmeds01:ADComputer) [Set-ADComputer], ADException
    + FullyQualifiedErrorId : ActiveDirectoryServer:8369,Microsoft.ActiveDirectory.Management.Commands.SetADComputer

我已将该应用程序归结为一个适用于 Win7/win2012 但不适用于带有凭证保护的 win10 的示例。

<%@ Language=VBScript %>
<%


' Create the connection the AD
    set con = createobject("ADODB.connection")
    set Com = createobject("ADODB.command")
    con.Provider = "ADsDSOObject"
    con.Open "Active Directory Provider"
    Set Com.ActiveConnection = con

    dim ldapCall 
    ldapCall = "SELECT ADsPath, distinguishedname, displayName"   &_ 
                   "  FROM '" & "LDAP://DC=mydomain,DC=com'  " &_
                      " WHERE objectClass = 'group' AND name = 'SomeTestGroupName'" & _
                     " ORDER BY displayName "
    'response.write ldapCall

' Execute the search call
    Com.CommandText = ldapCall
    Set rs = Com.Execute

    if not(rs.EOF) then
        response.write "SomethingHappended<br />"
    else 
        response.write "Why don't you work???"
    end if

%>

更新 1 - 回答 T-Heron 的问题 这是

的结果
setspn -q http/WebSiteName.domain.com  - 
Checking domain DC=Mydomain
no such SPN found.

如果我这样做

setspan -q http/WebSiteName- I get the following

Checking domain DC=Mydomain
CN=Webserver,OU=OuLocation,DC=MyDomain
        http/WebSite.myDomain
        http/WebSite
        CmRcService/Webserver
        CmRcService/Webserver.myDomain
        WSMAN/Webserver.myDomain
        TERMSRV/Webserver.myDomain
        RestrictedKrbHost/Webserver.myDomain
        HOST/Webserver
        WSMAN/WSMAN/Webserver
        TERMSRV/WSMAN/Webserver
        RestrictedKrbHost/WSMAN/Webserver
        HOST/Webserver

更新 2- 更新 1 中的 -q 不起作用的原因是设置了 spn 到 http/WebsiteName.domain.com 而不是 http/WebsiteName.a.b.domain.com(这是我正在尝试的)

所有 -q 命令现在都可以使用了。但问题依旧

这是委派选项卡的屏幕截图。

更新 3 -

这是代理选项卡的新图片 在执行 IISReset 后,我​​用 "Use Kerberos Only" 和 "Use any authentication protocol" 都试过了,我遇到了同样的问题。 (我在按下 "add" 按钮时添加了网络服务器。 在图片里, 带有 webServername 的条目的红色框 带有 spn 设置的条目的橙色框(在 HTTP - 服务类型旁边)

好的,所以我终于可以让上面的测试页正常工作了。 T-Heron 的评论很中肯,我只是添加了错误的委托服务。

一旦我从域控制器添加了 ldap 服务,测试页面就开始工作了。
(我们的域控制器有 2 个 ldap 服务。一个有 guid,一个有域名。我选择了域)。

[]

更新 1 - 解决方案的测试最初是在 win2k8 上完成的。在 win2k12 上做同样的事情没有用。

我最终不得不将我的应用程序池更改为内置的 ApplicationPoolId(或本地系统)以使其正常工作。