Windows Server 2016中的 Extranet 智能锁定功能的说明

本文介绍 Windows Server 2016 中的 Extranet 智能锁定功能。

适用范围:Windows Server 2016
原始 KB 编号: 4096478

概述

自 Windows Server 2016 2018 年 3 月更新以来,Active Directory 联合身份验证服务 (AD FS) 具有名为Extranet Smart Lockout (ESL) 的新功能。 在身份验证服务攻击日益增多的时代,ESL 使 AD FS 能够区分来自有效用户的登录尝试和登录尝试与可能是攻击者的登录。 因此,AD FS 可以锁定攻击者,同时让有效用户继续使用其帐户。 这可以防止拒绝用户的服务,并防止针对已知用户帐户的定向攻击。

ESL 功能可用于 Windows Server 2016 中的 AD FS。

如何安装和配置 ESL

在场中的所有节点上安装更新

首先,请确保自 2018 年 3 月 Windows 汇报 起,所有 Windows Server 2016 AD FS 服务器都是最新的。

更新项目数据库权限

Extranet 智能锁定要求 AD FS 服务帐户有权在 AD FS 项目数据库中创建新表。 以 AD FS 管理员身份登录到任何 AD FS 服务器,然后通过在 PowerShell 命令提示符窗口中执行以下命令来授予此权限:

$cred= Get-Credential
Update-AdfsArtifactDatabasePermission -Credential$cred

注意

$cred占位符是具有 AD FS 管理员权限的帐户。 这应提供创建表的写入权限。

由于 AD FS 场正在使用SQL Server,并且上面提供的凭据对 SQL 服务器没有管理员权限,因此由于缺少足够的权限,上述命令可能会失败。 在这种情况下,可以通过在连接到 AdfsArtifactStore 数据库时运行以下命令,在 SQL Server 数据库中手动配置数据库权限。

ALTER AUTHORIZATION ON SCHEMA::[ArtifactStore] TO [db_genevaservice]

配置 ESL

添加了名为 ExtranetLockoutMode 的新参数以支持 ESL。 它包含以下值:

  • ADPasswordCounter - 这是旧版 AD FS“Extranet 软锁定”模式,不会根据位置进行区分。 此值为默认值。
  • ADFSSmartLockoutLogOnly - 这是 Extranet 智能锁定。 AD FS 不会拒绝身份验证请求,而是写入管理员和审核事件。
  • ADFSSmartLockoutEnforce - 这是 Extranet 智能锁定,完全支持在达到阈值时阻止不熟悉的请求。

建议首先通过运行以下 cmdlet 将锁定提供程序设置为仅记录短时间 (1 到 3 天) 。 查看审核 (请参阅下文,了解在此期间) 的详细信息,以确定可能受影响的帐户数以及这些事件的频率。 成功评估审核后,将设置设置为“ADFSSmartLockoutEnforce”模式:

Set-AdfsProperties -ExtranetLockoutMode AdfsSmartlockoutLogOnly

在此模式下,AD FS 执行分析,但不会因为锁定计数器而阻止任何请求。 此模式用于在启用“强制”模式之前验证智能锁定是否成功运行。

若要使新模式生效,请运行以下命令,在场中的所有节点上重启 AD FS 服务:

Restart-service adfssrv

设置锁定阈值和观察窗口

ESL 有两个关键设置:锁定阈值和观察窗口。

锁定阈值设置

每次基于密码的身份验证成功时,AD FS 都会将客户端 IP 存储为帐户活动表中熟悉的位置。

如果基于密码的身份验证失败,并且凭据不是来自熟悉的位置,则会增加失败的身份验证计数。

在不熟悉位置的失败密码尝试次数达到锁定阈值后,如果来自不熟悉位置的基于密码的身份验证失败,帐户将被锁定。

注意

锁定将继续与这个不熟悉的新锁定计数器分开应用于熟悉的位置。

阈值是使用 设置的 Set-AdfsProperties

示例:

Set-AdfsProperties -ExtranetLockoutThreshold 10

观察窗口设置

观察窗口设置允许帐户在一段时间后自动解锁。 帐户解锁后,允许一次身份验证尝试。 如果身份验证成功,则失败的身份验证计数将重置为 0。 如果失败,系统会等待另一个观察窗口,然后用户才能重试。

观察窗口是使用 Set-AdfsProperties 设置的,如以下示例命令中所示:

Set-AdfsProperties -ExtranetObservationWindow ( new-timespan -minutes 5 )

启用锁定

可以使用 EnableExtranetLockout 参数启用或禁用 Extranet 锁定,如以下示例所示。

若要启用锁定,请运行以下命令:

Set-AdfsProperties -EnableExtranetLockout $true

若要禁用锁定,请运行以下命令:

Set-AdfsProperties -EnableExtranetLockout $false

启用强制模式

熟悉锁定阈值和观察窗口后,可以使用以下 PSH cmdlet 将 ESL 移动到“强制”模式:

Set-AdfsProperties -ExtranetLockoutMode AdfsSmartLockoutEnforce

若要使新模式生效,请使用以下命令在场中的所有节点上重启 AD FS 服务:

Restart-service adfssrv

管理 ESL

管理用户帐户活动

AD FS 提供三个 cmdlet 来管理用户帐户活动数据。 这些 cmdlet 会自动连接到场中拥有主角色的节点。

注意

可以通过传递 -Server 参数来重写此行为。

  • Get-ADFSAccountActivity

    读取用户帐户的当前帐户活动。 cmdlet 始终使用帐户活动 REST 终结点自动连接到场主服务器。 因此,所有数据应始终保持一致。

    Get-ADFSAccountActivity user@contoso.com
    
  • Set-ADFSAccountActivity

    更新用户帐户的帐户活动。 这可用于添加新的熟悉位置或清除任何帐户的状态。

    Set-ADFSAccountActivity user@contoso.com -FamiliarLocation "1.2.3.4"
    
  • Reset-ADFSAccountLockout

    重置用户帐户的锁定计数器。

    Reset-ADFSAccountLockout user@contoso.com -Familiar
    

疑难解答

更新数据库权限

如果 cmdlet Update-AdfsArtifactDatabasePermission 返回了任何错误,请验证以下事项:

  • 如果节点位于服务器场列表中,但不再是服务器场的成员,验证将失败。 可以通过运行 remove-adfsnode <node name>来解决此问题。
  • 验证更新是否已部署在场中的所有节点上。
  • 验证传递给 cmdlet 的凭据是否有权修改 AD FS 项目数据库架构的所有者。

日志记录/审核

当由于帐户超过锁定阈值而拒绝身份验证请求时,AD FS 会将 ExtranetLockoutEvent 写入安全审核流。

记录的事件示例

发生了 Extranet 锁定事件。 有关失败详细信息,请参阅 XML。
活动 ID:172332e1-1301-4e56-0e00-0080000000db
其他数据
XML: <?xml version=“1.0” encoding=“utf-16”?><AuditBase xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:type=“ExtranetLockoutAudit”><AuditType>ExtranetLockout</AuditType>
<AuditResult>Failure</AuditResult>
<FailureType>ExtranetLockoutError</FailureType>
<ErrorCode>AccountRestrictedAudit</ErrorCode>
<ContextComponents>
<Component xsi:type=“ResourceAuditComponent”>
<RelyingParty>http://contoso.com /adfs/services/trust</RelyingParty>
<ClaimsProvider>N/A</ClaimsProvider>
<UserId>TQDFTD\Administrator</UserId>
</组件>
<Component xsi:type=“RequestAuditComponent”>
<服务器>N/A</Server>
<AuthProtocol>WSFederation</AuthProtocol>
<NetworkLocation>Intranet</NetworkLocation>
<IpAddress>4.4.4.4</IpAddress>
<ForwardedIpAddress />
<ProxyIpAddress>1.2.3.4</ProxyIpAddress>
<NetworkIpAddress>1.2.3.4</NetworkIpAddress>
<ProxyServer>N/A</ProxyServer>
<UserAgentString>Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML,如 Gecko) Chrome/63.0.3239.132 Safari/537.36</UserAgentString>
<Endpoint>/adfs/ls</Endpoint>
</组件>
<Component xsi:type=“LockoutConfigAuditComponent”>
<CurrentBadPasswordCount>5</CurrentBadPasswordCount>
<ConfigBadPasswordCount>5</ConfigBadPasswordCount>
<LastBadAttempt>02/07/2018 21:47:44</LastBadAttempt>
<LockoutWindowConfig>00:30:00</LockoutWindowConfig>
</组件>
</ContextComponents>
</AuditBase>

卸载

SQL Server数据库场可以使用“设置”应用程序卸载更新,而不会出现问题。

由于 WID 数据库验证二进制文件已更新,WID 数据库场必须执行以下步骤:

  1. 运行卸载 psh 脚本,以停止服务并删除帐户活动表。

    Stop-Service adfssrv -ErrorAction Stop
    
    $doc = new-object Xml
    $doc.Load("$env:windir\ADFS\Microsoft.IdentityServer.Servicehost.exe.config")
    $connString = $doc.configuration.'microsoft.identityServer.service'.policystore.connectionString
    
    if ( -not $connString -like "*##wid*" )
    {
        Write-Error "SQL installs don't require DB updates, skipping DB table drop"
    }
    else
    {
            $connString = "Data Source=np:\\.\pipe\microsoft##wid\tsql\query;Initial Catalog=AdfsArtifactStore;Integrated Security=True"
            stop-service adfssrv
            $cli = new-object System.Data.SqlClient.SqlConnection
            $cli.ConnectionString = $connString
            $cli.Open()
            try
            {
            $cmd = new-object System.Data.SqlClient.SqlCommand
            $cmd.CommandText = "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[ArtifactStore].[AccountActivity]') AND type in (N'U')) DROP TABLE [ArtifactStore].[AccountActivity]"
            $cmd.Connection = $cli
            $cmd.ExecuteNonQuery()
        }
        finally
        {
            $cli.CLose()
        } write-warning "Finish removing the patch using the Settings app and then restart the complete to complete the uninstall"
    }
    
  2. 使用设置应用程序卸载更新。

  3. 重启计算机。