1

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

过了一会儿,我们终于发现 Credential Guard 不能很好地处理这个旧应用程序。

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

Kerberos 注意事项

当你启用 Windows Defender Credential Guard 时,你不能再使用 Kerberos 无约束委派或 DES 加密。无约束委派可能允许攻击者从隔离的 LSA 进程中提取 Kerberos 密钥。请改用受限或基于资源的 Kerberos 委派。

我们必须切换我们的实现以使用基于约束的 Kerberos。我对如何做到这一点有点茫然。

我们当前的 SPN 是针对 Web 应用程序名称设置的 - (来自此链接的场景 2 - https://support.microsoft.com/en-ca/help/929650/how-to-use-spns-when-you-configure-托管的网络应用程序

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.abdomain.com (这是我正在尝试的)

所以所有的 -q 命令现在都可以工作了。但问题依然存在

这是委托选项卡的屏幕截图。 在此处输入图像描述

更新 3 -

这是委托选项卡的新图片,我在执行 IISReset 后使用“仅使用 Kerberos”和“使用任何身份验证协议”进行了尝试,但遇到了同样的问题。(当我按下“添加”按钮时,我添加了网络服务器。在图片中,带有 webServername 的条目的红色框和带有 spn 设置的条目的橙色框(在 HTTP - 服务类型旁边)

在此处输入图像描述

4

1 回答 1

2

好的,所以我能够让上面的测试页面最终工作。T-Heron 的评论很中肯,我只是添加了错误的服务来委派。

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

[ Web 服务器的委派选项卡的屏幕截图]

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

我最终不得不将我的应用程序池更改为内置的 ApplicationPoolId(或本地系统)才能让它工作。

于 2018-07-11T11:20:40.150 回答