【问题标题】:Classic ASP/MSSQL Authentication Issue using CredSpec使用 CredSpec 的经典 ASP/MSSQL 身份验证问题
【发布时间】:2020-09-28 21:24:17
【问题描述】:

我目前正在尝试对一些旧的(并且很快将被淘汰的)基础架构进行一些改进,为迁移到 .NET 核心做准备。我们有一个小的反馈表,它使用 SQLOLEDB 连接字符串写入 SQL 表。这些字符串适用于以明文形式定义的用户名/密码,但我希望放弃这种方法以支持集成身份验证。

我做了很多工作才能到达我现在的位置:

  1. 构建基于 IIS 并安装了 ASP 功能的 docker 容器。
  2. 在 Windows 主机上以集群方式运行容器 - 已加入我们的 AD 域。
  3. 设置 gMSA 以提供对数据库的域帐户访问权限。

目前,我已经完成了 MS 的 gMSA on Windows Containers 指南 (https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/manage-serviceaccounts) 中的所有步骤。测试检查完毕,我可以在https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/gmsa-troubleshooting#check-the-container 中毫无问题地运行所有测试,但是当我尝试使用我的连接字符串进行连接时,我在日志中收到错误消息:

2020-09-28 19:36:43 172.17.173.120 POST /Default.asp |42|80040e4d|Login_failed_for_user_'NT_AUTHORITY\ANONYMOUS_LOGON'.

对我来说,这没有多大意义,因为应用程序池标识设置为网络并且测试在容器上签出。

现在我尝试了一些方法,例如编辑 web.config 以将模拟设置为 true/false,通过 Windows 进行身份验证,但我仍然有点难过。我已将主机设置为允许通过 Kerberos 委派任何服务。

我也尝试使用以下方式登录:

docker exec -it --user "NT AUTHORITY\NETWORK SERVICE" cb4 powershell

然后运行:

$connectionString = 'Data Source=serverhostname.domain.local;database=databasename;Integrated Security = True;'
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection $connectionString
$sqlConnection.Open()
$sqlConnection | select *

这会导致数据库连接处于打开状态。

应用程序池使用 NetworkService 身份设置

Get-ItemProperty IIS:\AppPools\domain.co.uk\ -Name processModel

identityType           : NetworkService
userName               :
password               :
loadUserProfile        : False
setProfileEnvironment  : True
logonType              : LogonBatch
manualGroupMembership  : False
idleTimeout            : 00:20:00
idleTimeoutAction      : Terminate
maxProcesses           : 1
shutdownTimeLimit      : 00:01:30
startupTimeLimit       : 00:01:30
pingingEnabled         : True
pingInterval           : 00:00:30
pingResponseTime       : 00:01:30
logEventOnProcessModel : IdleTimeout
PSPath                 : WebAdministration::\\413E8843BBEF\AppPools\domain.co.uk\
PSParentPath           : WebAdministration::\\413E8843BBEF\AppPools
PSChildName            : domain.co.uk\
PSDrive                : IIS
PSProvider             : WebAdministration
Attributes             : {identityType, userName, password, loadUserProfile...}
ChildElements          : {}
ElementTagName         : processModel
Methods                :
Schema                 : Microsoft.IIs.PowerShell.Framework.ConfigurationElementSchema

任何建议将不胜感激!

【问题讨论】:

    标签: windows docker iis vbscript gmsa


    【解决方案1】:

    好的,所以我想通了,并将我的发现发布在了一个公开的 Gist 中:

    https://gist.github.com/jimbo8098/48fa8d1cd05a61b35534aa107decb3e3

    基本上,问题在于,当应用程序池标识设置为网络时,该站点不是,它使用的似乎是 IUSR。鉴于此,我没有将 gMSA 帐户中继到 ASP 的脚本,因此我无法使用集成身份验证。解决方案是运行:

    Set-WebConfigurationProperty system.webServer/security/authentication/anonymousAuthentication -Name "userName" -Value ""; if ($?) {
    Set-WebConfigurationProperty system.webServer/security/authentication/anonymousAuthentication -Name "password" -Value ""; if ($?) {
    Set-WebConfigurationProperty system.webServer/security/authentication/anonymousAuthentication -Name "logonMethod" -Value 2;}}
    

    这样做是将用户名和密码设置为空白,并将登录方法设置为网络。这是完美的,因为这意味着应用程序池和站点都使用了预期的帐户,即 gMSA 帐户。

    我发现一个非常有用的方法是制作一个测试脚本:

    <%
    Set objNetwork = CreateObject("WScript.Network")
    strNAME = objNetwork.computername
    response.write("Value of strNAME variable: " & strNAME & "<br>")
    response.write("Domain = " & objNetwork.UserDomain & "<br/>")
    response.write("ComputerName = " & objNetwork.ComputerName & "<br/>")
    response.write("UserName = " & objNetwork.UserName & "<br/>")
    %>
    

    在解决方案之前,这显示了 IUSR,并且是我解决问题的重要线索。解决后,UserName 读取 app$(其中 app 是 gMSA 的名称)和预期的域。

    【讨论】:

      【解决方案2】:

      连接数据库时需要注意几件事情。

      1. 应用程序池的身份应该有一个域帐户。
      2. 域帐户有权读取或更改数据库。
      3. IIS server 和 sql server 应该在同一个内网,使用同一个域。

      更多详情可以参考这个thread's answer

      【讨论】:

      • 1.应用程序池分配了网络服务帐户,这似乎是 MS 在 docs.microsoft.com/en-us/virtualization/windowscontainers/… 中建议的
      • 2.在这种情况下,域帐户是 gMSA,但已为该帐户提供了经过验证的至少可以读取的访问权限,并且我们的 DBA 确认插入也应该没问题(尽管我尚未对此进行测试)。当然,由于登录肯定没问题(请参阅执行的 powershell 以连接到 SQL),我预计会显示不同的错误。
      • 3. IIS 服务器和 SQL 服务器在 Azure 中的同一个 LAN 中,也是同一个域的一部分。
      • 通过文字描述很难解决问题,您可以从这里获得支持:support.microsoft.com
      • 确实,但是我们指的是经典 ASP,请记住,如果这些天 MS 甚至会为此烦恼,我会感到非常惊讶。
      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      相关资源
      最近更新 更多