AD FS 外联网锁定和外联网智能锁定概述

外联网智能锁定 (ESL) 可保护你的用户免受恶意活动的外联网帐户锁定。

ESL 使 AD FS 能够区分来自用户熟悉位置的登录尝试与来自可能是攻击者的登录尝试。 AD FS 可以锁定攻击者,同时允许有效用户继续使用其帐户。 这种区别可以防止和保护用户免受拒绝服务和某些类别的密码喷射攻击。 ESL 可用于 Windows Server 2016 中的 AD FS,并内置在 Windows Server 2019 中的 AD FS 中。

ESL 仅适用于用户名和密码身份验证请求,这些请求是使用 Web 应用程序代理或第三方代理通过 Extranet 发出的。 任何第三方代理必须支持 MS-ADFSPIP 协议,才能代替 Web 应用程序代理使用,例如 F5 BIG-IP 访问策略管理器。 请参阅第三方代理文档以确定代理是否支持 MS-ADFSPIP 协议。

AD FS 2019 中的功能

与 AD FS 2016 相比,AD FS 2019 中的外联网智能锁定增加了以下优势:

  • 为熟悉和不熟悉的位置设置独立的锁定阈值。 与来自可疑位置的请求相比,处于已知良好位置的用户可以有更高的容错率。
  • 启用智能锁定的审核模式,同时继续强制执行以前的软锁定行为。 这种区别使你可以了解用户熟悉的位置,并且仍然受到 AD FS 2012 R2 提供的 Extranet 锁定功能的保护。

配置信息

启用 ESL 后,将在 Artifact 数据库中创建一个新表 AdfsArtifactStore.AccountActivity。 还会在 AD FS 场中选择一个节点作为“用户活动”主节点。 在 Windows 内部数据库 (WID) 配置中,此节点始终是主节点。 在 SQL 配置中,选择一个节点作为“用户活动”主节点。

若要查看选定为“用户活动”主节点的节点,请使用 (Get-AdfsFarmInformation).FarmRoles

所有辅助节点将在每次新登录后通过端口 80 联系主节点,以了解错误密码计数的最新值和新的熟悉位置值。 处理登录后,辅助节点还会更新主节点。

Diagram showing the sign-in process between primary nodes, secondary nodes, and the client.

如果辅助节点无法联系主节点,则会向 AD FS 管理日志中写入错误事件。 系统将继续处理身份验证,但 AD FS 将仅在本地写入更新的状态。 AD FS 每 10 分钟重试联系一次主节点。 主节点可用后,AD FS 将切换回主节点。

术语

  • FamiliarLocation:在身份验证请求期间,ESL 会检查所有提供的 Internet 协议 (IP)。 这些 IP 将是网络 IP、转发 IP 和可选的 x-forwarded-for IP 的组合。 如果请求成功,则所有 IP 都将作为“熟悉 IP”添加到“帐户活动”表中。 如果请求包含“熟悉 IP ”中存在的所有 IP,则该请求将被视为“熟悉”位置。
  • UnknownLocation:如果传入的请求至少有一个 IP 不在现有的“FamiliarLocation”列表中,则该请求将被视为“未知”位置。 此操作代理方案,例如 Exchange Online 旧版身份验证,其中 Exchange Online 地址处理成功和失败的请求。
  • badPwdCount:一个值,表示提交错误密码且身份验证失败的次数。 对于每个用户,系统将为熟悉的位置和未知的位置保留单独的计数器。
  • UnknownLockout:在用户被锁定,无法从未知位置访问的情况下,针对每个用户设置的布尔值。 此值的计算是基于 badPwdCountUnfamiliar 和 ExtranetLockoutThreshold 值。
  • ExtranetLockoutThreshold:此值确定错误密码尝试的最大次数。 达到阈值时,AD FS 将拒绝来自 Extranet 的请求,直到观察窗口时间过去为止。
  • ExtranetObservationWindow:此值确定来自未知位置的用户名和密码请求被锁定的持续时间。窗口时间结束后,AD FS 将再次开始从未知位置执行用户名和密码身份验证。
  • ExtranetLockoutRequirePDC:启用时,外联网锁定需要一个主域控制器 (PDC)。 禁用时:如果 PDC 不可用,Extranet 锁定将回退到另一个域控制器。
  • ExtranetLockoutMode:控制 ESL 的“仅记录”和“强制”模式。
    • ADFSSmartLockoutLogOnly:已启用 ESL。 AD FS 写入管理员和审核事件,但不拒绝身份验证请求。 此模式在初始时为启用状态,以便在启用“ADFSSmartLockoutEnforce”之前填充 FamiliarLocation。
    • ADFSSmartLockoutEnforce:完全支持在达到阈值时阻止不熟悉的身份验证请求。

支持 IPv4 和 IPv6 地址。

事务剖析

  • 身份验证前检查:在身份验证请求期间,ESL 会检查所有提供的 IP。 这些 IP 将是网络 IP、转发 IP 和可选的 x-forwarded-for IP 的组合。 在审核日志中,这些 IP 按 x-ms-forwarded-client-ip、x-forwarded-for、x-ms-proxy-client-ip 的顺序列在 <IpAddress> 字段中。

    根据这些 IP,AD FS 确定请求是否来自熟悉的位置,然后检查相应的 BadPwdCount 是否小于设置的阈值限制,或者上一次“失败”的尝试发生的时间是否长于观察窗时间范围。 如果其中一个条件成立,则 AD FS 将允许对此事务进行进一步处理和凭据验证。 如果两个条件都不成立,则在观察时间窗口结束之前,帐户已经处于锁定状态。 在观察时间窗口结束后,允许用户尝试一次身份验证。 在 Windows Server 2019 中,AD FS 将根据 IP 地址是否与熟悉的位置匹配来检查适当的阈值限制。

  • 登录成功:如果登录成功,则将请求中的 IP 添加到用户的熟悉位置 IP 列表中。

  • 登录失败:如果登录失败,则 BadPwdCount 的值将增加。 如果攻击者向系统发送的错误密码超过阈值允许的数量,则用户将进入锁定状态。 (badPwdCount > ExtranetLockoutThreshold)

Diagram showing the process of successful and unsuccessful authentication.

当帐户被锁定时,“UnknownLockout”值将等于 True。此锁定意味着用户的 badPwdCount 超过了阈值。 例如,有人尝试的密码次数超过了系统允许的次数。 在此状态下,有效用户可以通过两种方式登录:

  • 等待 ObservationWindow 时间过去。
  • 要重置锁定状态,请使用“Reset-ADFSAccountLockout”将 badPwdCount 重置为零。

如果没有发生重置,将允许该帐户在每个观察时间窗口中对 AD 进行一次密码尝试。 尝试后,帐户将返回到锁定状态,观察时间窗口将重新开始。 只有在密码登录成功后,badPwdCount 值才会自动重置。

“仅记录”模式与“强制”模式

AccountActivity 表在“仅记录”模式和“强制”模式下都会被填充。 如果绕过“仅记录”模式,并且 ESL 直接进入“强制”模式,而没有建议的等待期,则 AD FS 将不知道用户熟悉的 IP。 ESL 的行为类似于“ADBadPasswordCounter”,如果用户帐户受到主动暴力攻击,则可能会阻止合法用户流量。 如果绕过“仅记录”模式,并且用户进入锁定状态(其中 UnknownLockout 等于 True),并尝试以正确密码通过“熟悉”IP 列表中未列出的 IP 进行登录,则用户将无法登录。 建议在 3-7 天内使用“仅记录”模式,以避免出现这种情况。 如果帐户经常受到攻击,则需要至少使用 24 小时的“仅记录”模式,以防止合法用户被锁定。

外联网智能锁定配置

以下部分介绍为 AD FS 2016 启用 ESL 的先决条件和配置。

AD FS 2016 的先决条件

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

    首先,确保所有 Windows Server 2016 AD FS 服务器在 2018 年 6 月的 Windows 更新中处于最新状态,并且 AD FS 2016 服务器场在 2016 服务器场行为级别运行。

  2. 验证权限。

    ESL 要求在每个 AD FS 服务器上启用 Windows 远程管理。

  3. 更新项目数据库权限。

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

    PS C:\>$cred = Get-Credential
    PS C:\>Update-AdfsArtifactDatabasePermission -Credential $cred
    

    注意

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

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

    # when prompted with “Are you sure you want to perform this action?”, enter Y.
    
    [CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact = 'High')]
    Param()
    
    $fileLocation = "$env:windir\ADFS\Microsoft.IdentityServer.Servicehost.exe.config"
    
    if (-not [System.IO.File]::Exists($fileLocation))
    {
    write-error "Unable to open AD FS configuration file."
    return
    }
    
    $doc = new-object Xml
    $doc.Load($fileLocation)
    $connString = $doc.configuration.'microsoft.identityServer.service'.policystore.connectionString
    $connString = $connString -replace "Initial Catalog=AdfsConfigurationV[0-9]*", "Initial Catalog=AdfsArtifactStore"
    
    if ($PSCmdlet.ShouldProcess($connString, "Executing SQL command sp_addrolemember 'db_owner', 'db_genevaservice' "))
    {
    $cli = new-object System.Data.SqlClient.SqlConnection
    $cli.ConnectionString = $connString
    $cli.Open()
    
    try
    {
    
    $cmd = new-object System.Data.SqlClient.SqlCommand
    $cmd.CommandText = "sp_addrolemember 'db_owner', 'db_genevaservice'"
    $cmd.Connection = $cli
    $rowsAffected = $cmd.ExecuteNonQuery()
    if ( -1 -eq $rowsAffected )
    {
    write-host "Success"
    }
    }
    finally
    {
    $cli.CLose()
    }
    }
    

确保启用 AD FS 安全审核日志记录

此功能使用安全审核日志,因此必须在 AD FS 和所有 AD FS 服务器上的本地策略中启用审核。

配置说明

ESL 使用 AD FS 属性 ExtranetLockoutEnabled。 此属性以前用于控制服务器 2012 R2 中的“Extranet 软锁定”。 如果启用了 ESL,要查看当前属性配置,请运行 Get-AdfsProperties

配置建议

配置 ESL 时,请遵循设置阈值的最佳实践:

ExtranetObservationWindow (new-timespan -Minutes 30)

ExtranetLockoutThreshold: Half of AD Threshold Value

AD value: 20, ExtranetLockoutThreshold: 10

Active Directory 锁定独立于 ESL 工作。 但是,如果启用了 Active Directory 锁定,请在 AD FS 中选择“ExtranetLockoutThreshold”,在 AD 中选择“帐户锁定阈值”。

ExtranetLockoutRequirePDC - $false

启用时,外联网锁定需要一个主域控制器 (PDC)。 禁用并配置为 false 时,如果 PDC 不可用,Extranet 锁定将回退到另一个域控制器。

要设置此属性,请运行:

Set-AdfsProperties -EnableExtranetLockout $true -ExtranetLockoutThreshold 15 -ExtranetObservationWindow (New-TimeSpan -Minutes 30) -ExtranetLockoutRequirePDC $false

启用“仅记录”模式

在“仅记录”模式下,AD FS 会填充用户熟悉的位置信息并写入安全审核事件,但不会阻止任何请求。 此模式用于验证智能锁定是否正在运行,并在启用“强制”模式之前启用 AD FS 以“了解”用户熟悉的位置。 随着 AD FS 的学习,它会存储每个用户的登录活动(无论是在仅记录模式还是强制模式下)。 通过运行以下 cmdlet,将锁定行为设置为“仅记录”:

Set-AdfsProperties -ExtranetLockoutMode AdfsSmartlockoutLogOnly

“仅记录”模式是一种临时状态,以便系统可以在使用智能锁定行为引入锁定实施之前了解登录行为。 “仅记录”模式的建议持续时间为 3-7 天。 如果帐户经常受到攻击,则必须运行“仅记录”模式至少 24 小时。

在 AD FS 2016 上,如果在启用 Extranet 智能锁定之前启用了 2012R2“Extranet 软锁定”行为,则“仅记录”模式将禁用“Extranet 软锁定”行为。 在“仅记录”模式下,AD FS 智能锁定不会锁定用户。 但是,本地 AD 可能会根据 AD 配置锁定用户。 查看 AD 锁定策略以了解本地 AD 如何锁定用户。

在 AD FS 2019 上,另一个优势是能够启用智能锁定的“仅记录”模式,同时继续使用下面的 PowerShell 强制执行以前的软锁定行为:

Set-AdfsProperties -ExtranetLockoutMode 3

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

Restart-service adfssrv

配置模式后,便可以使用 EnableExtranetLockout 参数启用智能锁定:

Set-AdfsProperties -EnableExtranetLockout $true

启用“强制”模式

在你熟悉锁定阈值和观察窗口之后,可以使用以下 PSH cmdlet 将 ESL 变为“强制”模式:

Set-AdfsProperties -ExtranetLockoutMode AdfsSmartLockoutEnforce

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

Restart-service adfssrv

管理用户帐户活动

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

注意

Just Enough Administration (JEA) 可用于委托 AD FS commandlet 来重置帐户锁定。 例如,可以为帮助台人员委派使用 ESL commandlet 的权限。 有关详细信息,请参阅将 AD FS PowerShell commandlet 访问权限委托给非管理员用户

可以通过传递 -Server 参数来替代此行为。

Get-ADFSAccountActivity -UserPrincipalName

cmdlet 使用帐户活动 REST 终结点自动连接到场主节点。 因此,所有数据应始终保持一致。 通过以下命令读取用户帐户的当前帐户活动:

Get-ADFSAccountActivity user@contoso.com

属性:

  • BadPwdCountFamiliar:从已知位置进行身份验证失败时递增。
  • BadPwdCountUnknown:来自未知位置的身份验证失败时递增。
  • LastFailedAuthFamiliar:如果从熟悉的位置进行身份验证失败,则将 LastFailedAuthFamiliar 设置为身份验证失败的时间。
  • LastFailedAuthUnknown:如果从未知位置进行身份验证失败,则将 LastFailedAuthUnknown 设置为身份验证失败的时间。
  • FamiliarLockout:布尔值,如果“BadPwdCountFamiliar”> ExtranetLockoutThreshold,则为“True”。
  • UnknownLockout:布尔值,如果“BadPwdCountUnknown”> ExtranetLockoutThreshold,则为“True”。
  • FamiliarIPs:最多 20 个 IP(用户熟悉)。 超过 20 个 IP 时,将删除列表中最旧的 IP。

Set-ADFSAccountActivity

Set-ADFSAccountActivity 添加了新的熟悉位置。 熟悉的 IP 列表最多包含 20 个条目。 如果超过 20 个条目,则会删除列表中最旧的 IP。

Set-ADFSAccountActivity user@contoso.com -AdditionalFamiliarIps “1.2.3.4”

Reset-ADFSAccountLockout

为每个熟悉的位置 (badPwdCountFamiliar) 或不熟悉的位置计数器 (badPwdCountUnfamiliar) 重置用户帐户的锁定计数器。 重置计数器时,“FamiliarLockout”或“UnfamiliarLockout”值将更新,因为重置计数器小于阈值。

Reset-ADFSAccountLockout user@contoso.com -Location Familiar

Reset-ADFSAccountLockout user@contoso.com -Location Unknown

AD FS Extranet 锁定的事件日志记录和用户活动信息

以下部分介绍如何监视事件日志记录、用户帐户活动和锁定。

Connect Health

建议通过 Connect Health 来监视用户帐户活动。 Connect Health 可生成有关危险 IP 和错误密码尝试的可下载报告。 风险 IP 报告中的每个项目都会显示有关失败的 AD FS 登录活动(失败次数超出指定阈值)的聚合信息。 可以将电子邮件通知设置为在 AD FS 登录活动失败时使用可自定义的电子邮件设置向管理员发出警报。 有关详细信息和设置说明,请参阅使用 Microsoft Entra Connect Health 监视 AD FS

AD FS 外联网智能锁定事件

注意

若要排查 ESL 问题,请参阅缓解密码喷射攻击和帐户锁定

对于要写入的 Extranet 智能锁定事件,必须在“仅记录”或“强制”模式下启用 ESL,并且必须启用 AD FS 安全审核。 AD FS 在以下情况下将 Extranet 锁定事件写入安全审核日志:

  • 用户被锁定,这意味着用户达到登录尝试失败的锁定阈值。
  • AD FS 收到已处于锁定状态的用户的登录尝试。

在“仅记录”模式下,你可以检查锁定事件的安全审核日志。 对于找到的任何事件,可以使用 Get-ADFSAccountActivity 检查用户状态,以确定锁定是发生在熟悉 IP 地址还是不熟悉的 IP 地址。 还可以使用 Get-ADFSAccountActivity cmdlet 仔细检查该用户的熟悉 IP 地址列表。

事件 ID 说明
1203 每次尝试使用错误密码时都会写入此事件。 一旦 badPwdCount 达到 ExtranetLockoutThreshold 中指定的值,帐户将在 AD FS 上锁定 ExtranetObservationWindow 中指定的持续时间。
活动 ID:%1
XML:%2
1210 每次锁定用户时都会写入此事件。
活动 ID:%1
XML:%2
557 (AD FS 2019) 尝试与节点 %1 上的帐户存储 rest 服务通信时出错。 如果使用 WID 场,则主节点可能处于脱机状态。 如果使用 SQL 场,则 AD FS 将自动选择新节点来承载用户存储主角色。
562 (AD FS 2019) 与服务器 %1 上的帐户存储终结点通信时出错。
异常消息:%2
563 (AD FS 2019) 计算外联网锁定状态时出错。 由于值为 %1,允许为此用户设置身份验证,并且令牌颁发将继续。 如果使用 WID 场,则主节点可能处于脱机状态。 如果使用 SQL 场,则 AD FS 将自动选择新节点来承载用户存储主角色。
帐户存储服务器名称:%2
用户 ID:%3
异常消息:%4
512 以下用户的帐户已被锁定。由于系统配置,允许登录尝试。
活动 ID:%1
用户:%2
客户端 IP:%3
错误密码计数:%4
上次错误密码尝试:%5
515 以下用户帐户处于锁定状态,并且提供了正确的密码。 此帐户可能已泄露。
其他数据
活动 ID:%1
用户:%2
客户端 IP:%3
516 由于错误密码尝试次数过多,以下用户帐户已被锁定。
活动 ID:%1
用户:%2
客户端 IP:%3
错误密码计数:%4
上次错误密码尝试:%5

ESL 常见问题

在“强制”模式下使用 Extranet 智能锁定的 AD FS 场是否会看到恶意用户锁定?

如果 AD FS 智能锁定设置为“强制”模式,则将永远不会看到合法用户的帐户被暴力破解或拒绝服务锁定。 恶意帐户锁定阻止用户登录的唯一方式是,恶意行为者拥有用户密码,或者可以从该用户的已知良好(熟悉)IP 地址发送请求。

如果启用了 ESL,而恶意行为者有用户密码,会发生什么情况?

暴力攻击场景的典型目标是猜测密码并成功登录。 如果用户被钓鱼或密码被猜中,则 ESL 功能将不会阻止访问,因为登录将满足正确密码加上新 IP 的“成功”标准。 然后,恶意行为者 IP 将以“熟悉”的形式出现。 在这种情况下,最好的缓解方法是清除用户在 AD FS 中的活动,并要求对用户进行多因素身份验证。 应安装 Microsoft Entra 密码保护,确保可猜测的密码不会进入系统。

如果我的用户从未从 IP 成功登录,然后使用错误的密码尝试了几次,那么在用户最终正确输入密码后,是否能够登录?

如果用户提交了多个错误密码(如键入错误),并且在接下来的尝试中获得了正确的密码,则用户将立即成功登录。 成功登录将清除错误密码计数,并将该 IP 添加到 FamiliarIPs 列表中。 但是,如果用户超过了从未知位置登录失败的阈值,则将进入锁定状态。 然后必须等待观察时间窗口结束并使用有效密码登录。 他们可能需要管理员干预才能重置其帐户。

ESL 是否也适用于内联网?

如果客户端直接连接到 AD FS 服务器,而不是通过 Web 应用程序代理服务器,则 ESL 行为将不适用。

我在“客户端 IP”字段中看到 Microsoft IP 地址。 ESL 能阻止 EXO 代理的暴力攻击吗?  

ESL 可以很好地防止 Exchange Online 或其他传统身份验证暴力攻击场景。 传统身份验证的“活动 ID”为 00000000-0000-0000-00000000-00000000。 在这些攻击中,恶意行为者利用 Exchange Online 基本身份验证(也称为旧版身份验证),使客户端 IP 地址显示为 Microsoft IP 地址。 云中的 Exchange Online 服务器代表 Outlook 客户端代理身份验证验证。 在这些情况下,恶意提交者的 IP 地址位于 x-ms-forwarded-client-ip 中,而 Microsoft Exchange Online Server IP 位于 x-ms-client-ip 值中。 外联网智能锁定检查网络 IP、转发 IP,也就是 x-forwarded-client-IP 和 x-ms-client-ip 值。 如果请求成功,则所有 IP 都将添加到熟悉列表中。 如果请求传入,并且任何提供的 IP 不在熟悉的列表中,则请求被标记为不熟悉。 来自熟悉位置的用户能够成功登录,而来自不熟悉位置的请求将被阻止。

在启用 ESL 之前,是否可以估算 ADFSArtifactStore 的大小?

启用 ESL 后,AD FS 会跟踪 ADFSArtifactStore 数据库中用户的帐户活动和已知位置。 此数据库相对于所跟踪的用户数和已知位置进行缩放。 当计划启用 ESL 时,你可以估算 ADFSArtifactStore 数据库的大小,以每 100,000 个用户最多 1GB 的速率增长。 如果 AD FS 场使用 Windows 内部数据库 (WID),则数据库文件的默认位置为 C:\Windows\WID\Data。 若要防止填充此驱动器,请在启用 ESL 之前确保至少有 5GB 的可用存储空间。 除了磁盘存储,还应在启用 ESL 后为 500,000 及以下的用户群体增加最多 1GB 的 RAM,从而计划增加总进程内存。

另请参阅