【问题标题】:Switching application to use Constraint based kerberos切换应用程序以使用基于约束的 kerberos
【发布时间】:2018-05-25 18:37:35
【问题描述】:

我有一个使用基于委托的 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。我对如何做到这一点有点茫然。

我们当前的 SPN 是根据 Web 应用程序名称设置的 - (来自此链接的场景 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/网站名称.domain.com 而不是 http/WebsiteName.a.b.domain.com (这是我正在尝试的)

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

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

更新 3 -

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

【问题讨论】:

  • 我们在上一个问题上合作过。我们可以看到以下输出: setspn -Q http/Webhostname.domain.com
  • 哇,再次收到您的来信真是太棒了!我终于在另一个问题上走得更远了。很棒的是,它不仅不再影响我的旧应用程序(好吧,它不是那么好;)。我们有另一个应用程序不能很好地与 Kerberos 和凭据保护配合使用。
  • 请将 http/Webhostname.domain.com 作为 SPN 添加到 Webserver AD 帐户。在你这样做之后,让我们知道它是否有效。如果没有,请将 Webserver 帐户的委派选项卡的屏幕截图添加到问题中。然后需要在此处完成一项违反直觉的操作,以使其使用约束委托工作。
  • 按要求添加图片。
  • 我看到你有一个公开的代表团,正如你所说。要设置约束委派,请单击仅信任此计算机以委派到指定的服务 > 单击 添加.. > 单击 用户或计算机 > 键入在结果对话框中的 Webhostname > 单击确定。这应该会找到要委派的所有 SPN > 单击 Select All > 单击 OK > 单击 Expanded 复选框 > 截取屏幕截图以在此处发布,然后单击 Apply 和 OK .如果这种受约束的委派不起作用,请告诉我。

标签: powershell asp-classic kerberos kerberos-delegation


【解决方案1】:

好的,所以我终于可以让上面的测试页面正常工作了。 T-Heron 的 cmets 是正确的,我只是添加了错误的服务来委派。

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

[]

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

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

【讨论】:

    猜你喜欢
    • 2017-03-10
    • 2017-01-23
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多