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

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

适用于:Windows Server 2016
原始 KB 数: 4096478

概述

自 2018 年 3 月 Windows Server 2016 更新起,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 服务器都处于最新状态。

更新项目数据库权限

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

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

注意

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

由于你的 AD FS 场正在使用 SQL Server,并且上面提供的凭据在你的 SQL Server 上没有管理权限,因此上述命令可能会因缺乏足够的权限而失败。 在这种情况下,可以在连接到 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
    

故障排除

更新数据库权限

如果从 Update-AdfsArtifactDatabasePermission cmdlet 返回任何错误,请验证以下内容:

  • 如果节点位于服务器场列表中,但不再是服务器场的成员,则验证将失败。 可以通过运行 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>
<组件 xsi:type=“ResourceAuditComponent”>
<RelyingParty>http://contoso.com /adfs/services/trust</RelyingParty>
<ClaimsProvider>N/A</ClaimsProvider>
<UserId>TQDFTD\Administrator</UserId>
</元件>
<组件 xsi:type=“RequestAuditComponent”>
<服务器>N/A</服务器>
<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>
</元件>
<组件 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. 重新启动计算机。